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

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

配置 Docker

亚马逊 EMR 6.x 支持 Hadoop 3,它允许直接在YARN NodeManager 亚马逊EMR集群上或在 Docker 容器内启动容器。Docker 容器提供了自定义执行环境,应用程序代码在其中运行。自定义执行环境与YARN NodeManager 和其他应用程序的执行环境隔离。

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

默认情况下,Amazon EMR 6.x 集群配置为允许 Spark 等YARN应用程序使用 Docker 容器运行。要自定义容器配置,请编辑 yarn-site.xml 中定义的 Docker 支持选项和 /etc/hadoop/conf 目录中提供的 container-executor.cfg 文件。有关每个配置选项及其使用方式的详细信息,请参阅使用 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 镜像的存储和分配系统。对于亚马逊,EMR我们建议您使用 AmazonECR,这是一个完全托管的 Docker 容器注册表,允许您创建自己的自定义映像,并将其托管在高度可用和可扩展的架构中。

部署注意事项

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

公有子网

当EMR集群部署在公有子网中时,运行的节点YARN NodeManager 可以直接访问 Internet 上可用的任何注册表。

私有子网

当EMR集群部署在私有子网中时,运行的节点YARN NodeManager 无法直接访问互联网。Docker 镜像可以托管在亚马逊上ECR并通过以下方式 Amazon PrivateLink访问。

有关如何在私有子网场景ECR中使用 Amazon PrivateLink 允许访问亚马逊的更多信息,请参阅Amazon PrivateLink 为亚马逊和亚马逊ECS进行设置ECR

配置 Docker 注册表

要在亚马逊上使用 Docker 注册表EMR,您必须将 Docker 配置为信任要用于解析 Docker 镜像的特定注册表。原定设置的信任注册表是本地(私有)和 centos 注册表。要使用其他公共存储库或 AmazonECR,您可以使用EMR分类API密钥覆盖/etc/hadoop/conf/container-executor.cfg使用container-executor分类中的docker.trusted.registries设置。

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

[ { "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" } } ] } ]

要使用 Amazon Command Line Interface (Amazon CLI) 启动具有此配置的 Amazon EMR 6.0.0 集群,请使用前面的 on JSON tainer-executor 配置的内容创建一个名为container-executor.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为在 EMR 6.0.0 及更ECR早版本上访问亚马逊

如果您是亚马逊新手ECR,请按照亚马逊入门中的说明进行操作,ECR并验证您是否可以ECR从亚马逊EMR集群中的每个实例访问亚马逊。

在 EMR 6.0.0 及更早版本中,要ECR使用 Docker 命令访问亚马逊,必须先生成证书。要验证是否YARN可以访问来自 Amazon 的图像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以便提交到集群的任务可以使用它向 Amazon 进行身份验证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 应用程序

在 EMR 6.1.0 及更高版本中,您无需手动设置对 Amazon ECR 的身份验证。如果在container-executor分类密钥中检测到亚马逊ECR注册表,则亚马逊ECR自动身份验证功能将激活,并在您提交带有ECR图像的 Spark 作业时YARN处理身份验证过程。您可以通过在 yarn-site 中检查 yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled 来确认是否启用了自动身份验证。true如果docker.trusted.registries包含ECR注册表,则会启用自动YARN身份验证并将身份验证设置设置为URL。

使用 Amazon 自动身份验证的先决条件 ECR

  • EMR版本 6.1.0 或更高版本

  • ECR配置中包含的注册表与集群位于同一区域

  • IAM具有获取授权令牌和提取任何图像的权限的角色

有关更多信息,请参阅使用 Amazon ECR 进行设置

如何启用自动身份验证

按照操作配置 Docker 注册表 将 Amazon ECR 注册表设置为可信注册表,并确保 Amazon ECR 存储库和集群位于同一区域。

要在未在可信ECR注册表中设置注册表的情况下启用此功能,请使用配置分类将其设置yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabledtrue

如何禁用自动身份验证

默认情况下,如果在可信注册表中未检测到 Amazon ECR 注册表,则自动身份验证处于禁用状态。

要禁用自动身份验证,即使在可信ECR注册表中设置了 Amazon 注册表,也要使用配置分类将其设置为yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabledfalse

如何检查是否在集群上启用了自动身份验证

在主节点上,使用文本编辑器(如 vi)来查看文件内容:vi /etc/hadoop/conf.empty/yarn-site.xml。检查 yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled 的值。