配置 Docker - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

配置 Docker

Amazon EMR 6.0.0 支持 Hadoop 3,它允许 YARN NodeManager 直接在集群的主机上或在 Docker 容器内启动容器。Docker 容器提供在其中运行应用程序代码的自定义执行环境。自定义执行环境与 YARN NodeManager 和其他应用程序的执行环境隔离开来。

Docker 容器可以包含由应用程序使用的特殊库,并且它们可以提供不同版本的本地工具和库,如 R 和 Python。您可以使用熟悉的 Docker 工具为您的应用程序定义库和运行时依赖项。

Amazon EMR 6.0.0 集群默认配置为允许 YARN 应用程序(如 Spark)使用 Docker 容器运行。要自定义容器配置,请编辑在由 /etc/hadoop/conf 目录中提供的 yarn-site.xmlcontainer-executor.cfg 文件中定义的 Docker 支持选项。有关每个配置选项及其使用方式的详细信息,请参阅使用 Docker 容器启动应用程序

您可以在提交作业时选择使用 Docker。使用以下变量指定 Docker 运行时和 Docker 映像。

  • YARN_CONTAINER_RUNTIME_TYPE=docker

  • YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={DOCKER_IMAGE_NAME}

当您使用 Docker 容器运行 YARN 应用程序时,YARN 会下载您在提交作业时指定的 Docker 映像。为了使 YARN 解析此 Docker 映像,必须使用 Docker 注册表对其进行配置。Docker 注册表的配置选项取决于您是使用公有子网还是私有子网部署集群。

Docker 注册表

Docker 注册表是 Docker 映像的存储和分发系统。对于 Amazon EMR 6.0.0,可以配置以下 Docker 注册表:

  • Docker Hub – 一个公有 Docker 注册表,其中包含 100,000 多个常用的 Docker 映像。

  • Amazon ECR – 完全托管的 Docker 容器注册表,它允许您创建自己的自定义映像并将其托管在高度可用和可扩展的架构中。

部署注意事项

Docker 注册表要求从集群中的每个主机进行网络访问。这是因为:当 YARN 应用程序在集群上运行时,每个主机都会从 Docker 注册表中下载映像。这些网络连接要求可能会限制您对 Docker 注册表的选择,具体取决于您是将 Amazon EMR 集群部署到公有子网还是私有子网中。

公有子网

当 EMR 集群部署在公有子网中时,运行 YARN NodeManager 的节点可以通过 Internet 直接访问提供的任何注册表,包括 Docker Hub,如下图所示。

私有子网

当 EMR 集群部署在私有子网中时,运行 YARN NodeManager 的节点无法直接访问 Internet。Docker 映像可以托管在 Amazon ECR 中并通过 AWS PrivateLink 进行访问,如下图所示。

有关在私有子网场景中如何使用 AWS PrivateLink 以允许访问 Amazon ECR 的更多信息,请参阅为 Amazon ECS 以及 Amazon ECR 设置 AWS PrivateLink

配置 Docker 注册表

要将 Docker 注册表与 Amazon EMR 一起使用,您必须将 Docker 配置为信任要用于解析 Docker 映像的特定注册表。默认信任注册表是本地(私有)和 centos(在公有 Docker Hub 上)。要使用其他公有存储库或 Amazon ECR,您可以通过将 EMR 分类 API 与 container-executor 分类键结合使用来覆盖 /etc/hadoop/conf/container-executor.cfg 中的 docker.trusted.registries 设置。

以下示例演示如何将集群配置为同时信任名为 your-public-repo 的公有存储库和 ECR 注册表终端节点 123456789123.dkr.ecr.us-east-1.amazonaws.com。如果您使用 ECR,请将此终端节点替换为您的特定 ECR 终端节点。如果您使用 Docker Hub,请将此存储库名称替换为您的存储库名称。

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

要使用 AWS Command Line Interface (AWS CLI) 启动具有此配置的 Amazon EMR 6.0.0 集群,请创建一个名为 container-executor.json 的文件,其中包含以前 JSON 配置的内容。然后,使用以下命令启动集群。

export KEYPAIR=<Name of your Amazon EC2 key-pair> export SUBNET_ID=<ID of the subnet to which to deploy the cluster> export INSTANCE_TYPE=<Name of the instance type to use> export REGION=<Region to which to deploy the cluster> aws emr create-cluster \ --name "EMR-6.0.0" \ --region $REGION \ --release-label emr-6.0.0 \ --applications Name=Hadoop Name=Spark \ --service-role EMR_DefaultRole \ --ec2-attributes KeyName=$KEYPAIR,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$SUBNET_ID \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=$INSTANCE_TYPE InstanceGroupType=CORE,InstanceCount=2,InstanceType=$INSTANCE_TYPE \ --configuration file://container-executor.json

配置 YARN 以访问 Amazon ECR

如果您不熟悉 Amazon ECR ,请按照 Amazon ECR 入门中的说明操作,并验证您是否有权从 Amazon EMR 集群中的每个实例访问 ECR。

要使用 Docker 命令访问 ECR,必须先生成凭证。要验证 YARN 可以从 ECR 访问映像,请使用容器环境变量 YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG 传递对您生成的凭证的引用。

在其中一个核心节点上运行以下命令,以获取 ECR 帐户的登录行。

aws ecr get-login --region us-east-1 --no-include-email

get-login 命令生成要运行的正确 Docker CLI 命令以创建凭证。从 get-login 复制并运行输出。

sudo docker login -u AWS -p <password> https://<account-id>.dkr.ecr.us-east-1.amazonaws.com

此命令在 /root/.docker 文件夹中生成一个 config.json 文件。将此文件复制到 HDFS,以便提交给集群的作业可以使用它对 ECR 进行身份验证。

运行以下命令将 config.json 文件复制到您的主目录。

mkdir -p ~/.docker sudo cp /root/.docker/config.json ~/.docker/config.json sudo chmod 644 ~/.docker/config.json

运行以下命令将 config.json 放在 HDFS 中,以便集群上运行的作业可以使用它。

hadoop fs -put ~/.docker/config.json /user/hadoop/

YARN 可以访问 ECR 作为 Docker 映像注册表,并在作业执行过程中提取容器。

配置 Docker 注册表和 YARN 后,您可以使用 Docker 容器运行 YARN 应用程序。有关更多信息,请参阅使用 Amazon EMR 6.0.0 通过 Docker 运行 Spark 应用程序