本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在亚马逊 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-examples
ECR存储库。
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 push123456789123.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: