

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

# 为 Flink 和 FluentD 自定义 Docker 映像
<a name="jobruns-flink-docker-flink-fluentd"></a>

按照以下步骤，使用 Apache Flink 或 FluentD 映像为 Amazon EMR on EKS 自定义 Docker 映像。其中包括获取基础映像、自定义基础映像、发布基础映像和提交工作负载的技术指导。

**Topics**
+ [先决条件](#jobruns-flink-docker-flink-fluentd-prereqs)
+ [步骤 1：从 Amazon Elastic Container Registry 中检索基础映像](#jobruns-flink-docker-flink-fluentd-retrieve-base)
+ [步骤 2：自定义基础镜像](#jobruns-flink-docker-flink-fluentd-customize-image)
+ [步骤 3：发布自定义映像](#jobruns-flink-docker-flink-fluentd-publish-image)
+ [步骤 4：使用自定义映像在 Amazon EMR 中提交 Flink 工作负载](#jobruns-flink-docker-flink-fluentd-submit-workload)

## 先决条件
<a name="jobruns-flink-docker-flink-fluentd-prereqs"></a>

在自定义 Docker 映像之前，确保您已完成以下先决条件：
+ 已完成[设置 Amazon EMR on EKS 的 Flink Kubernetes Operator](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/jobruns-flink-kubernetes-operator-setup.html) 步骤。
+ 已在环境中安装 Docker。有关更多信息，请参阅[获取 Docker](https://docs.docker.com/get-docker/)。

## 步骤 1：从 Amazon Elastic Container Registry 中检索基础映像
<a name="jobruns-flink-docker-flink-fluentd-retrieve-base"></a>

基础映像包含访问其他 AWS 服务所需的 Amazon EMR 运行时和连接器。如果在 Flink 6.14.0 或更高版本中使用 Amazon EMR on EKS，可从 Amazon ECR 公开映像浏览馆获取基础映像。浏览图库以找到映像链接，然后将映像拉到本地 Workspace。例如，对于 Amazon EMR 6.14.0 发行版，以下 `docker pull` 命令将返回最新的标准基础映像。将 `emr-6.14.0:latest` 替换为所需的发行版。

```
docker pull public.ecr.aws/emr-on-eks/flink/emr-6.14.0-flink:latest
```

以下是 Flink 库映像和 Fluentd 库映像的链接：
+ [emr-on-eks/flink/emr-6.14.0-flink](https://gallery.ecr.aws/emr-on-eks/flink/emr-6.14.0-flink)
+ [emr-on-eks/fluentd/emr-6.14.0 (](https://gallery.ecr.aws/emr-on-eks/fluentd/emr-6.14.0)

## 步骤 2：自定义基础镜像
<a name="jobruns-flink-docker-flink-fluentd-customize-image"></a>

下列步骤描述了如何自定义从 Amazon ECR 中拉取的基础映像。

1. 在您的本地 Workspace 上创建新的 `Dockerfile`。

1. 编辑 `Dockerfile` 并添加以下内容。该 `Dockerfile` 使用您从 `public.ecr.aws/emr-on-eks/flink/emr-7.12.0-flink:latest` 中拉取的容器映像。

   ```
   FROM public.ecr.aws/emr-on-eks/flink/emr-7.12.0-flink:latest
   USER root
   ### Add customization commands here ####
   USER hadoop:hadoop
   ```

   如果您使用的是 `Fluentd`，请使用以下配置。

   ```
   FROM public.ecr.aws/emr-on-eks/fluentd/emr-7.12.0:latest
   USER root
   ### Add customization commands here ####
   USER hadoop:hadoop
   ```

1. 将命令添加到 `Dockerfile` 以自定义基础镜像。以下命令演示了如何安装 Python 库。

   ```
   FROM public.ecr.aws/emr-on-eks/flink/emr-7.12.0-flink:latest
   USER root
   RUN pip3 install --upgrade boto3 pandas numpy // For python 3
   USER hadoop:hadoop
   ```

1. 在创建 `DockerFile` 的同一目录中，运行以下命令构建 Docker 映像。您在 `-t` 标志后提供的字段是您自定义的映像名称。

   ```
   docker build -t <YOUR_ACCOUNT_ID>.dkr.ecr.<YOUR_ECR_REGION>.amazonaws.com/<ECR_REPO>:<ECR_TAG>
   ```

## 步骤 3：发布自定义映像
<a name="jobruns-flink-docker-flink-fluentd-publish-image"></a>

现在，将新的 Docker 映像发布到您的 Amazon ECR 注册表。

1. 运行以下命令创建一个 Amazon ECR 存储库，来存储您的 Docker 映像。为存储库命名，例如 `emr_custom_repo.`。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》中的[创建存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-create-repository)。

   ```
   aws ecr create-repository \
          --repository-name emr_custom_repo \
          --image-scanning-configuration scanOnPush=true \
          --region <AWS_REGION>
   ```

1. 运行以下命令对您的默认注册表进行身份验证。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》中的[对您的默认注册表进行身份验证](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry)。

   ```
   aws ecr get-login-password --region <AWS_REGION> | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.<YOUR_ECR_REGION>.amazonaws.com
   ```

1. 推送镜像。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》中的[将映像推送到 Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-push-image)。

   ```
   docker push <YOUR_ACCOUNT_ID>.dkr.ecr.<YOUR_ECR_REGION>.amazonaws.com/<ECR_REPO>:<ECR_TAG>
   ```

## 步骤 4：使用自定义映像在 Amazon EMR 中提交 Flink 工作负载
<a name="jobruns-flink-docker-flink-fluentd-submit-workload"></a>

要使用自定映像，请对 `FlinkDeployment` 规范进行以下更改。为此，请在部署规范的 `spec.image` 行中输入您的映像。

```
apiVersion: flink.apache.org/v1beta1
   kind: FlinkDeployment
   metadata:
     name: basic-example
   spec:
     flinkVersion: v1_18
     image: <YOUR_ACCOUNT_ID>.dkr.ecr.<YOUR_ECR_REGION>.amazonaws.com/<ECR_REPO>:<ECR_TAG>
     imagePullPolicy: Always
     flinkConfiguration:
           taskmanager.numberOfTaskSlots: "1"
```

要在 Fluentd 作业中使用自定义映像，请在部署规范的 `monitoringConfiguration.image` 行中输入您的映像。

```
  monitoringConfiguration:
       image: <YOUR_ACCOUNT_ID>.dkr.ecr.<YOUR_ECR_REGION>.amazonaws.com/<ECR_REPO>:<ECR_TAG>
       cloudWatchMonitoringConfiguration:
         logGroupName: flink-log-group
         logStreamNamePrefix: custom-fluentd
```