如何自定義碼頭映像 - Amazon EMR

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

如何自定義碼頭映像

請執行以下步驟為 EKS 上的亞馬遜 EMR 自定義碼頭映像。

以下是您在自定義 Docker 圖像時可能需要考慮的其他選項:

先決條件

  • 完成設定Amazon EMR on EKS 上的步驟。

  • 在您的環境中安裝 Docker。如需詳細資訊,請參閱「」獲取 Docker

步驟 1:從 Amazon ECR 中檢索基礎映像

請執行以下步驟,從亞馬遜 ECR 中檢索 EKS 上的亞馬遜 EMR 基礎映像。基本映像包含 Amazon EMR 運行時和用於訪問其他AWS服務。

  1. 選擇基礎映像 URI。圖像 URI 遵循這種格式ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag,如下所示範。

    895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest

    要在您所在地區選擇基礎圖像,請參閲如何選擇基礎映像 URI

  2. 登錄存儲基礎映像的 Amazon ECR 存儲庫。Replace895885662937us-west-2與亞馬遜 ECR 註冊賬户和AWS您選擇的區域。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
  3. 將基本映像拉入本地工作區。ReplaceEMR 6.5: 最新版本與您選擇的容器圖像標籤一起使用。

    docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest

步驟 2:自訂基礎映像

請執行以下步驟來自定義您從亞馬遜 ECR 中提取的基本映像。

  1. 建立新Dockerfile在您的本地工作區。

  2. 編輯您剛建立的 Dockerfile,並新增下列內容。這一個Dockerfile使用您從中提取的容器圖像895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest USER root ### Add customization commands here #### USER hadoop:hadoop
  3. 將命令添加到Dockerfile以自訂基礎映像。例如,添加一個命令來安裝 Python 庫,如下所示Dockerfile演示。

    FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest USER root RUN pip3 install --upgrade boto3 pandas numpy // For python 3 USER hadoop:hadoop
  4. 從同一個目錄中Dockerfile,請執行下列命令來建立 Docker 映像。提供 Docker 映像的名稱,例如自定義

    docker build -t emr6.5_custom .

步驟 3:(可選但建議)驗證自定義映像

我們建議您在發佈自定義映像之前測試它的兼容性。您可以使用Amazon EMR on EKS 自訂映像 CLI,檢查您的映像是否具有在 EKS 上的 Amazon EMR 上運行所需的文件結構和正確配置。

注意

EKS 上的亞馬遜 EMR 自定義圖片 CLI 無法確認您的圖片沒有錯誤。從基本映像中刪除依賴關係時要小心。

請採取下列步驟來驗證您的自訂映像。

  1. 在 EKS 自定義映像 CLI 上下載並安裝亞馬遜 EMR。如需詳細資訊,請參閱「」Amazon EMR on EKS 自訂映像 CLI 安裝指南

  2. 執行下列命令以測試安裝。

    emr-on-eks-custom-image --version

    下列示範輸出。

    Amazon EMR on EKS Custom Image CLI Version: x.xx
  3. 執行下列命令來驗證自訂映像。

    emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
    • -i指定需要驗證的本地映像 URI。這可以是圖像 URI,您為映像定義的任何名稱或標籤。

    • -r指定基礎映像的確切發佈版本,例如emr-6.5.0-latest

    • -t指定圖像類型。如果這是 Spark 圖像,請輸入spark。預設值為 spark。EKS 上的當前亞馬遜 EMR 自定義映像 CLI 版本僅支持 Spark 運行時映像。

    如果您成功運行命令並且自定義映像滿足所有必需的配置和文件結構,則返回的輸出將顯示所有測試的結果,如以下示例所示。

    Amazon EMR on EKS Custom Image Test Version: x.xx ... Checking if docker cli is installed ... Checking Image Manifest [INFO] Image ID: xxx [INFO] Created On: 2021-05-17T20:50:07.986662904Z [INFO] Default User Set to hadoop:hadoop : PASS [INFO] Working Directory Set to /home/hadoop : PASS [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS [INFO] SPARK_HOME is set with value: /usr/lib/spark : PASS [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS [INFO] File Structure Test for spark-jars in /usr/lib/spark/jars: 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 bin-files in /usr/bin: PASS ... Start Running Sample Spark Job [INFO] Sample Spark Job Test with local:///usr/lib/spark/examples/jars/spark-examples.jar : PASS ----------------------------------------------------------------- Overall Custom Image Validation Succeeded. -----------------------------------------------------------------

    如果自定義映像不符合所需的配置或文件結構,則會出現錯誤消息。返回的輸出提供有關錯誤配置或文件結構的信息。

步驟 4:發佈自定義圖像

將新 Docker 映像發佈至 Amazon ECR 登錄檔。

  1. 運行以下命令創建用於存儲 Docker 映像的 Amazon ECR 存儲庫。為您的存儲庫提供一個名稱,例如自定義回購。Replaceus-west-2與您的區域一起。

    aws ecr create-repository \ --repository-name emr6.5_custom_repo \ --image-scanning-configuration scanOnPush=true \ --region us-west-2

    如需詳細資訊,請參閱「」建立儲存庫中的Amazon ECR 使用者指南

  2. 執行下列命令以驗證至您的預設登錄檔。

    aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com

    如需詳細資訊,請參閱「」驗證至您的預設登錄檔中的Amazon ECR 使用者指南

  3. 標記映像並將映像發佈至您創建的 Amazon ECR 儲存庫。

    標記映像。

    docker tag emr6.5_custom aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.5_custom_repo

    推送映像。

    docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.5_custom_repo

    如需詳細資訊,請參閱「」將映像推送至 Amazon ECR中的Amazon ECR 使用者指南

步驟 5:使用自定義圖片在亞馬遜 EMR 中提交 Spark 工作負載

生成並發佈自定義映像後,您可以使用自定義映像在 EKS 上提交 Amazon EMR 作業。

首先,創建一個啟動作業運行請求 .json 文件並指定spark.kubernetes.container.image參數引用自定義圖像,如下面的 JSON 文件示例所示。

注意

您可以使用local://方案引用自定義圖像中可用的文件,如entryPoint參數在下面的 JSON 代碼段中。您也可以使用local://方案來引用應用程序依賴關係。所有文件和依賴關係使用local://方案必須已經存在於自定義圖像中的指定路徑。

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.5.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.5_custom_repo" } } }

您也可以使用applicationConfiguration屬性,如下所示範。

{ "name": "spark-custom-image", "virtualClusterId": "virtual-cluster-id", "executionRoleArn": "execution-role-arn", "releaseLabel": "emr-6.5.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", "entryPointArguments": [ "10" ], "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi" } }, "configurationOverrides": { "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.kubernetes.container.image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.5_custom_repo" } } ] } }

然後執行start-job-run命令來提交作業。

aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json

在上面的 JSON 示例中,將emr-6.5.0-最新版與您的亞馬遜 EMR 發行版本一起使用。強烈建議您使用-latest發行版本,以確保所選版本包含最新的安全更新。如需 Amazon EMR 發行版本及相應映像標籤的詳細資訊,請參如何選擇基礎映像 URI

注意

您可以使用spark.kubernetes.driver.container.imagespark.kubernetes.executor.container.image為驅動程序和執行程序窗格指定不同的映像。

自定義託管終端的 Docker 映像

您還可以為託管終端節點自定義 Docker 映像,以便運行自定義的基本內核映像,並確保在運行 EMR Studio 交互式工作負載時具有所需的依賴關係。

  1. 遵循步驟 1-4來自定義 Docker 圖像。唯一的區別是 Docker 文件中的基本圖像 URI。基本映像 URI 遵循以下格式:ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag。 您需要使用notebook-spark在基本圖像 URI 中,而不是spark。基本映像包含 Spark 運行時以及隨其一起運行的筆記本內核。如需有關選擇區域和容器影像標籤的詳細資訊,請參如何選擇基礎映像 URI

    注意

    目前只支持覆蓋基礎映像,並引入除基礎映像以外的其他類型的全新內核AWS提供的。

  2. 創建可與自定義映像一起使用的託管終端節點。

    首先,建立一個 JSON 檔案custom-image-managed-endpoint.json具有下列內容。

    { "name": "endpoint-name", "virtualClusterId": "virtual-cluster-id", "type": "JUPYTER_ENTERPRISE_GATEWAY", "releaseLabel": "emr-6.5.0-latest", "executionRoleArn": "execution-role-arn", "certificateArn": "certificate-arn", "configurationOverrides": { "applicationConfiguration": [ { "classification": "jupyter-kernel-overrides", "configurations": [ { "classification": "python3", "properties": { "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-python:latest" } }, { "classification": "spark-python-kubernetes", "properties": { "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-spark:latest" } } ] } ] } }

    接下來,使用 JSON 文件中指定的配置創建託管終端節點,如以下示例所示。

    aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json

    如需詳細資訊,請參閱「」為虛擬羣集創建託管終端節點

  3. 通過 EMR 工作室 Connect 到託管終端節點。如需詳細資訊,請參閱「」從 Studio 連接

使用多架構映像

Amazon EMR on EKS 支援 Amazon EMR 用於 Amazon Elastic Container Registry (Amazon ECR) 的多架構容器映像。如需詳細資訊,請參閱「」為亞馬遜 ECR 引入多體繫結構容器映像

EKS 自定義映像上的 Amazon EMR 既支持基於重力的 EC2 實例,也支持非基於重力的 EC2 實例。基於重力的圖像與非基於重力的圖像存儲在 Amazon ECR 中的相同圖像存儲庫中。

例如,要檢查 Docker 清單列表中的 6.5.0 映像,請運行以下命令。

docker manifest inspect 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest

此處為輸出。所以此arm64體繫結構適用於引力實例。所以此amd64適用於非重力實例。

{ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1805, "digest": "xxx123:6b971cb47d11011ab3d45fff925e9442914b4977ae0f9fbcdcf5cfa99a7593f0", "platform": { "architecture": "arm64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1805, "digest": "xxx123:6f2375582c9c57fa9838c1d3a626f1b4fc281e287d2963a72dfe0bd81117e52f", "platform": { "architecture": "amd64", "os": "linux" } } ] }

請採取下列步驟來建立多架構映像:

  1. 建立Dockerfile與以下內容,以便您可以拉arm64映像。

    FROM --platform=arm64 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.5.0:latest USER root RUN pip3 install boto3 // install customizations here USER hadoop:hadoop
  2. 按照為亞馬遜 ECR 引入多體繫結構容器映像來建立多架構映像。

    注意

    所以此arm64圖像需要在arm64實例。同樣,amd64圖像需要在arm64實例。

    您還可以構建多體繫結構映像,而無需在每個特定實例類型上構建,方法是使用 Dockerbuildx命令。如需詳細資訊,請參閱「」利用多 CPU 體繫結構支持

  3. 構建多體繫結構映像後,您可以使用相同的spark.kubernetes.container.image參數並指向圖像。在包括基於重力和非重力的 EC2 實例的異構集羣中,該實例根據提取該映像的實例體繫結構確定正確的體繫結構映像。