在亚马逊 EMR 6.x 上使用 Docker 运行 Spark 应用程序 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在亚马逊 EMR 6.x 上使用 Docker 运行 Spark 应用程序

在 Amazon EMR 6.0.0 中,Spark 应用程序可以使用 Docker 容器来定义其库依赖关系,而不必在集群中的各个亚马逊EC2实例上安装依赖关系。要使用 Docker 运行 Spark,您必须首先配置 Docker 注册表,并在提交 Spark 应用程序时定义其他参数。有关更多信息,请参阅配置 Docker 集成

提交应用程序后,YARN调用 Docker 来提取指定的 Docker 镜像,然后在 Docker 容器内运行 Spark 应用程序。这让您可以轻松地定义和隔离依赖项。它缩短了在 Amazon EMR 集群中引导或准备实例的时间,其中包含任务执行所需的库。

利用 Docker 运行 Spark 时的注意事项

使用 Docker 运行 Spark 时,请确保满足以下先决条件:

  • docker软件包和CLI仅安装在核心节点和任务节点上。

  • 在 Amazon EMR 6.1.0 及更高版本中,您也可以使用以下命令在主节点上安装 Docker。

    • sudo yum install -y docker sudo systemctl start docker
  • spark-submit命令应始终从 Amazon EMR 集群上的主实例运行。

  • 用于解析 Docker 镜像的 Docker 注册表必须使用API带有分类密钥的分类进行定义,以便在container-executor启动集群时定义其他参数:

    • docker.trusted.registries

    • docker.privileged-containers.registries

  • 要在 Docker 容器中执行 Spark 应用程序,需要以下配置选项:

    • YARN_CONTAINER_RUNTIME_TYPE=docker

    • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

  • 使用 Amazon ECR 检索 Docker 镜像时,您必须将集群配置为对其进行身份验证。为此,您必须使用以下配置选项:

    • YARN_ CONTAINER _ RUNTIME _ _ DOCKER CLIENT _ CONFIG = {DOCKER_ _ CLIENT _ PATH _ON CONFIG HDFS _}

  • 在 Amazon EMR 6.1.0 及更高版本中,启用ECR自动身份验证功能YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG={DOCKER_CLIENT_CONFIG_PATH_ON_HDFS}后,您无需使用列出的命令。

  • 与 Spark 一起使用的任何 Docker 映像都必须在 Docker 映像中安装了 Java。

有关先决条件的更多信息,请参阅配置 Docker 集成

创建 Docker 镜像

Docker 映像是使用 Dockerfile 创建的,该文件定义了要包含在映像中的程序包和配置。以下两个 Dockerfile 使用和 PySpark SparkR 的示例。

PySpark Dockerfile

使用此 Dockerfile 创建的 Docker 镜像包括 Python 3 和 Python 软件包 NumPy 。这个 Dockerfile 使用亚马逊 Linux 2 和 Amazon Corretto 8。JDK

FROM amazoncorretto:8 RUN yum -y update RUN yum -y install yum-utils RUN yum -y groupinstall development RUN yum list python3* RUN yum -y install python3 python3-dev python3-pip python3-virtualenv RUN python -V RUN python3 -V ENV PYSPARK_DRIVER_PYTHON python3 ENV PYSPARK_PYTHON python3 RUN pip3 install --upgrade pip RUN pip3 install numpy pandas RUN python3 -c "import numpy as np"

SparkR Dockerfile

使用此 Dockerfile 创建的 Docker 镜像包括 R 和软件包。 randomForest CRAN这个 Dockerfile 包括亚马逊 Linux 2 和 Amazon Corretto 8。JDK

FROM amazoncorretto:8 RUN java -version RUN yum -y update RUN amazon-linux-extras install R4 RUN yum -y install curl hostname #setup R configs RUN echo "r <- getOption('repos'); r['CRAN'] <- 'http://cran.us.r-project.org'; options(repos = r);" > ~/.Rprofile RUN Rscript -e "install.packages('randomForest')"

有关 Dockerfile 语法的更多信息,请参阅 Dockerfile 参考文档

使用来自亚马逊的 Docker 镜像 ECR

Amazon Elastic Container Registry (AmazonECR) 是一个完全托管的 Docker 容器注册表,可轻松存储、管理和部署 Docker 容器镜像。使用 Amazon 时ECR,必须将集群配置为信任您的实例ECR,并且您必须配置身份验证才能让集群使用来自亚马逊ECR的 Docker 映像。有关更多信息,请参阅配置YARN以访问 Amazon ECR

要确保 Amazon EMR 主机可以访问存储在 Amazon 中的图像ECR,您的集群必须拥有与实例配置文件关联的AmazonEC2ContainerRegistryReadOnly策略的权限。有关更多信息,请参阅AmazonEC2ContainerRegistryReadOnly策略

在此示例中,必须使用以下附加配置创建集群,以确保 Amazon ECR 注册表是可信的。将123456789123.dkr.ecr.us-east-1.amazonaws.com终端节点替换为您的 Amazon ECR 终端节点。

[ { "Classification": "container-executor", "Configurations": [ { "Classification": "docker", "Properties": { "docker.privileged-containers.registries": "local,centos,123456789123.dkr.ecr.us-east-1.amazonaws.com", "docker.trusted.registries": "local,centos,123456789123.dkr.ecr.us-east-1.amazonaws.com" } } ], "Properties": {} } ]

在 Amazon PySpark 上使用 ECR

以下示例使用 PySpark Dockerfile,该文件将被标记并上传到亚马逊。ECR上传 Dockerfile 后,你可以运行 PySpark 任务并参考来自亚马逊的 Docker 镜像。ECR

启动集群后,使用SSH连接到核心节点并运行以下命令从 Dock PySpark erfile 示例构建本地 Docker 镜像。

首先,创建一个目录和一个 Dockerfile。

mkdir pyspark vi pyspark/Dockerfile

粘贴 PySpark Dockerfile 的内容并运行以下命令来构建 Docker 镜像。

sudo docker build -t local/pyspark-example pyspark/

为示例创建emr-docker-examplesECR存储库。

aws ecr create-repository --repository-name emr-docker-examples

标记本地构建的映像并将其上传到ECR,123456789123.dkr.ecr.us-east-1.amazonaws.com替换为您的ECR终端节点。

sudo docker tag local/pyspark-example 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example sudo docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example

用于SSH连接到主节点并准备一个带有文件名的 Python 脚本main.py。将以下内容粘贴到 main.py 文件中并保存它。

from pyspark.sql import SparkSession spark = SparkSession.builder.appName("docker-numpy").getOrCreate() sc = spark.sparkContext import numpy as np a = np.arange(15).reshape(3, 5) print(a)

在亚马逊 EMR 6.0.0 上,要提交任务,请引用 Docker 镜像的名称。定义其他配置参数,以确保作业执行使用 Docker 作为运行时。使用亚马逊时ECR,YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG必须引用包含用于向亚马逊进行身份验证的凭证的config.json文件ECR。

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example DOCKER_CLIENT_CONFIG=hdfs:///user/hadoop/config.json spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --num-executors 2 \ main.py -v

在 Amazon EMR 6.1.0 及更高版本中,要提交任务,请引用 Docker 镜像的名称。启用 ECR auto 身份验证后,运行以下命令。

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:pyspark-example spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --num-executors 2 \ main.py -v

作业完成后,记下YARN应用程序 ID,然后使用以下命令获取 PySpark 作业的输出。

yarn logs --applicationId application_id | grep -C2 '\[\[' LogLength:55 LogContents: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]

在亚马逊上使用 SparkR ECR

以下示例使用 SparkR Dockerfile,该文件将被标记并上传到。ECR上传 Dockerfile 后,你可以运行 SparkR 作业并参考来自亚马逊的 Docker 镜像。ECR

启动集群后,使用SSH连接到核心节点并运行以下命令从 SparkR Dockerfile 示例中构建本地 Docker 镜像。

首先,创建一个目录和该 Dockerfile。

mkdir sparkr vi sparkr/Dockerfile

粘贴 SparkR Dockerfile 的内容并运行以下命令来构建 Docker 映像。

sudo docker build -t local/sparkr-example sparkr/

标记本地构建的映像并将其上传到亚马逊ECR,123456789123.dkr.ecr.us-east-1.amazonaws.com替换为您的亚马逊ECR终端节点。

sudo docker tag local/sparkr-example 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example sudo docker push 123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example

用于SSH连接到主节点并准备一个名为的 R 脚本sparkR.R。将以下内容粘贴到 sparkR.R 文件中。

library(SparkR) sparkR.session(appName = "R with Spark example", sparkConfig = list(spark.some.config.option = "some-value")) sqlContext <- sparkRSQL.init(spark.sparkContext) library(randomForest) # check release notes of randomForest rfNews() sparkR.session.stop()

在 Amazon EMR 6.0.0 上,要提交任务,请参阅 Docker 镜像的名称。定义其他配置参数,以确保作业执行使用 Docker 作为运行时。使用 Amazon 时ECR,YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG必须参考包含用于进行身份验证的凭证的config.json文件ECR。

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example DOCKER_CLIENT_CONFIG=hdfs:///user/hadoop/config.json spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG=$DOCKER_CLIENT_CONFIG \ sparkR.R

在 Amazon EMR 6.1.0 及更高版本中,要提交任务,请引用 Docker 镜像的名称。启用ECR自动身份验证后,运行以下命令。

DOCKER_IMAGE_NAME=123456789123.dkr.ecr.us-east-1.amazonaws.com/emr-docker-examples:sparkr-example spark-submit --master yarn \ --deploy-mode cluster \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_TYPE=docker \ --conf spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=$DOCKER_IMAGE_NAME \ sparkR.R

作业完成后,记下YARN应用程序 ID,然后使用以下命令获取 SparkR 作业的输出。此示例包括测试以确保 randomForest 库、已安装的版本和发行说明都可用。

yarn logs --applicationId application_id | grep -B4 -A10 "Type rfNews" randomForest 4.6-14 Type rfNews() to see new features/changes/bug fixes. Wishlist (formerly TODO): * Implement the new scheme of handling classwt in classification. * Use more compact storage of proximity matrix. * Allow case weights by using the weights in sampling? ======================================================================== Changes in 4.6-14: