本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自定义 EMR Serverless 映像
从 Amazon EMR 6.9.0 开始,使用 Amazon EMR Serverless,使用自定义映像将应用程序依赖项和运行时环境打包到一个容器中。这简化了管理工作负载依赖项的方式,并使软件包更具可移植性。自定义 EMR Serverless 映像具有以下优势:
-
安装并配置针对工作负载优化的软件包。这些软件包并未在 Amazon EMR 运行时环境的公开发布中广泛提供。
-
将 EMR Serverless 与组织内当前确立的构建、测试和部署流程(包括本地开发和测试)集成。
-
应用确立的安全流程(如映像扫描),满足组织内的合规性和监管要求。
-
允许您在应用程序中使用自己的 JDK 和 Python 版本。
EMR Serverless 提供的图像可在您创建自己的图像时用作基础。基础映像提供了映像与 EMR Serverless 交互所需的必要 jar 文件、配置和库。您可以在 Amazon ECR 公开映像浏览馆
| 类型 | 图像 |
|---|---|
|
Spark |
|
|
Hive |
|
先决条件
在创建 EMR Serverless 自定义映像之前,请完成以下先决条件。
-
创建与启动 EMR 无服务器应用程序相同的 AWS 区域 存储库 Amazon ECR 存储库。要创建 Amazon ECR 私有存储库,请参阅创建私有存储库。
-
要授予用户访问 Amazon ECR 存储库的权限,请向使用该存储库中的映像创建或更新 EMR Serverless 应用程序的用户和角色添加以下策略。
有关 Amazon ECR 基于身份的策略的更多示例,请参阅 Amazon Elastic Contain er Registry 基于身份的策略示例。
步骤 1:根据 EMR Serverless 基础映像创建自定义映像
首先,创建一个 DockerfileFROM 指令开头,要求使用首选基础映像。在FROM说明之后,包括您要对图像进行的任何修改。基础映像会自动将 USER 设置为 hadoop。此设置不具有您所包含的所有修改的权限。解决方法是,将 USER 设置为 root,修改映像,然后将 USER 重新设置为 hadoop:hadoop。要参考常见用例的示例,请参阅在 EMR Serverless 中使用自定义映像。
# Dockerfile FROM public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest USER root # MODIFICATIONS GO HERE # EMRS runs the image as hadoop USER hadoop:hadoop
创建 Dockerfile 之后,使用以下命令构建映像。
# build the docker image docker build . -taws-account-id.dkr.ecr.region.amazonaws.com/my-repository[:tag]or[@digest]
步骤 2:在本地验证映像
EMR Serverless 提供了一个离线工具,可静态检查自定义映像,用来验证基本文件、环境变量和正确的映像配置。有关如何安装和运行该工具的信息,请参阅 Amazon EMR Serverless Image
安装工具后,运行以下命令验证映像:
amazon-emr-serverless-image \ validate-image -r emr-6.9.0 -t spark \ -iaws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
输出如下所示。
Amazon EMR Serverless - Image CLI Version: 0.0.1 ... Checking if docker cli is installed ... Checking Image Manifest [INFO] Image ID: 9e2f4359cf5beb466a8a2ed047ab61c9d37786c555655fc122272758f761b41a [INFO] Created On: 2022-12-02T07:46:42.586249984Z [INFO] Default User Set to hadoop:hadoop : PASS [INFO] Working Directory Set to : PASS [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS [INFO] HADOOP_HOME is set with value: /usr/lib/hadoop : PASS [INFO] HADOOP_LIBEXEC_DIR is set with value: /usr/lib/hadoop/libexec : PASS [INFO] HADOOP_USER_HOME is set with value: /home/hadoop : PASS [INFO] HADOOP_YARN_HOME is set with value: /usr/lib/hadoop-yarn : PASS [INFO] HIVE_HOME is set with value: /usr/lib/hive : PASS [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS [INFO] TEZ_HOME is set with value: /usr/lib/tez : PASS [INFO] YARN_HOME is set with value: /usr/lib/hadoop-yarn : PASS [INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS [INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS [INFO] File Structure Test for hadoop-yarn-jars in /usr/lib/hadoop-yarn: PASS [INFO] File Structure Test for hive-bin-files in /usr/bin: PASS [INFO] File Structure Test for hive-jars in /usr/lib/hive/lib: PASS [INFO] File Structure Test for java-bin in /etc/alternatives/jre/bin: PASS [INFO] File Structure Test for tez-jars in /usr/lib/tez: PASS ----------------------------------------------------------------- Overall Custom Image Validation Succeeded. -----------------------------------------------------------------
步骤 3:将映像上传到 Amazon ECR 存储库
使用以下命令将 Amazon ECR 映像推送到 Amazon ECR 存储库。确保您拥有正确的 IAM 权限,可将映像推送到存储库。有关更多信息,请参阅 Amazon ECR 用户指南中的推送图片。
# login to ECR repo aws ecr get-login-password --region region | docker login --username AWS --password-stdinaws-account-id.dkr.ecr.region.amazonaws.com # push the docker image docker pushaws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
步骤 4:使用自定义映像创建或更新应用程序
根据您想要的 AWS Management Console 应用程序启动方式选择 AWS CLI 选项卡或选项卡,然后完成以下步骤。
步骤 5:允许 EMR Serverless 访问自定义映像存储库
将以下资源策略添加到 Amazon ECR 存储库,以允许 EMR Serverless 服务主体使用来自该存储库的 get、describe 和 download 请求。
最佳安全实践是,将 aws:SourceArn 条件键添加到存储库策略。IAM 全局条件键 aws:SourceArn 可确保 EMR Serverless 仅将存储库用于应用程序 ARN。有关 Amazon ECR 存储库策略的更多信息,请参阅创建私有存储库。
注意事项和限制
在使用自定义映像时,请注意以下几点:
-
使用与应用程序类型(Spark 或 Hive)和发行版标签(例如
emr-6.9.0)相匹配的正确基础映像。 -
EMR Serverless 会忽略 Docker 文件中的
[CMD]或[ENTRYPOINT]指令。使用 Docker 文件中的常用指令,如[COPY]、[RUN]和[WORKDIR]。 -
创建自定义映像
TEZ_HOME时JAVA_HOMESPARK_HOMEHIVE_HOME,请勿修改环境变量、、。 -
自定义图像的大小不能超过 10 GB。
-
如果您修改 Amazon EMR 基础映像中的二进制文件或 jar,可能会导致应用程序或任务启动失败。
-
Amazon ECR 存储库必须与您用于启动 EMR 无服务器应用程序的存储库相同 AWS 区域 。