

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 自訂 EMR Serverless 映像
<a name="application-custom-image"></a>

從 Amazon EMR 6.9.0 開始，使用自訂映像將應用程式相依性和執行期環境封裝到具有 Amazon EMR Serverless 的單一容器中。這可簡化您管理工作負載相依性的方式，並讓套件更具可攜性。當您自訂 EMR Serverless 映像時，可提供下列優點：
+ 安裝和設定針對工作負載最佳化的套件。這些套件並未廣泛用於 Amazon EMR 執行期環境的公有分佈。
+ 將 EMR Serverless 與組織內目前建立的建置、測試和部署程序整合，包括本機開發和測試。
+ 套用已建立的安全程序，例如映像掃描，以符合組織內的合規和管理要求。
+ 可讓您為應用程式使用自己的 JDK 和 Python 版本。

EMR Serverless 會在您建立自己的映像時，提供使用 做為基礎的映像。基礎映像為映像提供與 EMR Serverless 互動的基本 jar、組態和程式庫。您可以在 [Amazon ECR Public Gallery](https://gallery.ecr.aws/emr-serverless/) 中找到基礎映像。使用符合您應用程式類型 (Spark 或 Hive) 和發行版本的映像。例如，如果您在 Amazon EMR 6.9.0 版上建立應用程式，請使用下列映像。


| Type | 影像 | 
| --- | --- | 
|  Spark  |  `public.ecr.aws/emr-serverless/spark/emr-6.9.0:latest`  | 
|  Hive  |  `public.ecr.aws/emr-serverless/hive/emr-6.9.0:latest`  | 

## 先決條件
<a name="worker-configs"></a>

建立 EMR Serverless 自訂映像之前，請先完成這些先決條件。

1. 在用於啟動 EMR Serverless 應用程式的相同 中建立 AWS 區域 Amazon ECR 儲存庫。若要建立 Amazon ECR 私有儲存庫，請參閱[建立私有儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)。

1. 若要授予使用者存取 Amazon ECR 儲存庫的權限，請將下列政策新增至使用此儲存庫中的映像建立或更新 EMR Serverless 應用程式的使用者和角色。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ECRRepositoryListGetPolicy",
         "Effect": "Allow",
         "Action": [
           "ecr:GetDownloadUrlForLayer",
           "ecr:BatchGetImage",
           "ecr:DescribeImages"
         ],
         "Resource": [
           "arn:aws:ecr:*:123456789012:repository/my-repo"
         ]
       }
     ]
   }
   ```

------

   如需 Amazon ECR 身分型政策的更多範例，請參閱 [Amazon Elastic Container Registry 身分型政策範例](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)。

## 步驟 1：從 EMR Serverless 基礎映像建立自訂映像
<a name="create-image"></a>

首先，建立以使用您偏好基礎映像的`FROM`指令開頭的 [Dockerfile](https://docs.docker.com/engine/reference/builder/)。在`FROM`指示之後，包含您要對影像進行的任何修改。基礎映像會自動將 `USER`設定為 `hadoop`。此設定沒有您包含之所有修改的許可。作為解決方法，請將 `USER` 設定為 `root`，修改您的映像，然後將 設`USER`回 `hadoop:hadoop`。若要參考常見使用案例的範例，請參閱 [搭配 EMR Serverless 使用自訂映像](using-custom-images.md)。

```
# 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 . -t aws-account-id.dkr.ecr.region.amazonaws.com/my-repository[:tag]or[@digest]
```

## 步驟 2：在本機驗證映像
<a name="validate"></a>

EMR Serverless 提供離線工具，可靜態檢查自訂映像，以驗證基本檔案、環境變數和正確的映像組態。如需如何安裝和執行工具的資訊，請參閱 [Amazon EMR Serverless Image CLI GitHub](https://github.com/awslabs/amazon-emr-serverless-image-cli)。

安裝工具後，請執行下列命令來驗證映像：

```
amazon-emr-serverless-image \
validate-image -r emr-6.9.0 -t spark \
-i aws-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 儲存庫
<a name="upload-image"></a>

使用下列命令將您的 Amazon ECR 映像推送到您的 Amazon ECR 儲存庫。請確定您擁有將映像推送至儲存庫的正確 IAM 許可。如需詳細資訊，請參閱《*Amazon ECR 使用者指南*》中的[推送映像](https://docs.aws.amazon.com/AmazonECR/latest/userguide/image-push.html)。

```
# login to ECR repo
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws-account-id.dkr.ecr.region.amazonaws.com

# push the docker image
docker push aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest
```

## 步驟 4：使用自訂映像建立或更新應用程式
<a name="create-app"></a>

根據您想要啟動應用程式的方式選擇 AWS 管理主控台 標籤或 AWS CLI 標籤，然後完成下列步驟。

------
#### [ Console ]

1. 登入 EMR Studio 主控台，網址為 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr)。導覽至您的應用程式，或使用建立應用程式中的指示[建立新的應用程式](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/studio.html#studio-create-app)。

1. 若要在建立或更新 EMR Serverless 應用程式時指定自訂映像，請在應用程式設定選項中選取**自訂**設定。

1. 在**自訂映像設定**區段中，選取**搭配此應用程式使用自訂映像**核取方塊。

1. 將 Amazon ECR 映像 URI 貼入**映像 URI** 欄位。EMR Serverless 會將此映像用於應用程式的所有工作者類型。或者，您可以選擇**不同的自訂映像**，並為每個工作者類型貼上不同的 Amazon ECR URIs。

------
#### [ CLI ]
+ 使用 `image-configuration` 參數建立應用程式。EMR Serverless 會將此設定套用至所有工作者類型。

  ```
  aws emr-serverless create-application \
  --release-label emr-6.9.0 \
  --type SPARK \
  --image-configuration '{
      "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
  }'
  ```

  若要為每個工作者類型建立具有不同映像設定的應用程式，請使用 `worker-type-specifications` 參數。

  ```
  aws emr-serverless create-application \
  --release-label emr-6.9.0 \
  --type SPARK \
  --worker-type-specifications '{
      "Driver": {
          "imageConfiguration": {
              "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
          }
      },
      "Executor" : {
          "imageConfiguration": {
              "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
          }
      }
  }'
  ```

  若要更新應用程式，請使用 `image-configuration` 參數。EMR Serverless 會將此設定套用至所有工作者類型。

  ```
  aws emr-serverless update-application \
  --application-id application-id \
  --image-configuration '{
      "imageUri": "aws-account-id.dkr.ecr.region.amazonaws.com/my-repository:tag/@digest"
  }'
  ```

------

## 步驟 5：允許 EMR Serverless 存取自訂映像儲存庫
<a name="access-repo"></a>

將下列資源政策新增至 Amazon ECR 儲存庫，以允許 EMR Serverless 服務主體使用此儲存庫的 `get`、 `describe`和 `download`請求。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EmrServerlessCustomImageSupport",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:DescribeImages",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "arn:aws:ecr:*:123456789012:repository/my-repo",
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:emr-serverless:*:123456789012:/applications/*"
        }
      }
    }
  ]
}
```

------

做為安全最佳實務，請將 `aws:SourceArn`條件金鑰新增至儲存庫政策。IAM 全域條件金鑰`aws:SourceArn`可確保 EMR Serverless 僅針對應用程式 ARN 使用儲存庫。如需 Amazon ECR 儲存庫政策的詳細資訊，請參閱[建立私有儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html)。

## 考量和限制
<a name="considerations"></a>

當您使用自訂映像時，請考慮下列事項：
+ 使用符合應用程式類型 (Spark 或 Hive) 和發行標籤 （例如 `emr-6.9.0`) 的正確基礎映像。
+ EMR Serverless 會忽略 Docker 檔案中的 `[CMD]`或 `[ENTRYPOINT]`指示。使用 Docker 檔案中的常見指示，例如 `[COPY]`、 `[RUN]`和 `[WORKDIR]`。
+ 當您建立自訂映像`TEZ_HOME`時`JAVA_HOME`，請勿修改環境變數 `SPARK_HOME``HIVE_HOME`、、。
+ 自訂映像的大小不能超過 10 GB。
+ 如果您在 Amazon EMR 基礎映像中修改二進位檔或 jar，這可能會導致應用程式或任務啟動失敗。
+ Amazon ECR 儲存庫必須與您用來啟動 EMR Serverless 應用程式 AWS 區域 的位置相同。