配置互動端點的設定 - Amazon EMR

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

配置互動端點的設定

監控 Spark 任務

為了監控和疑難排解故障,請設定互動式端點,以便使用端點啟動的任務可以將日誌資訊傳送到 Amazon S3、Amazon CloudWatch Logs 或兩者。以下各章節描述了針對您透過 Amazon EMR on EKS 互動端點啟動的 Spark 作業,如何將 Spark 應用程式日誌傳送至 Amazon S3。

設定 Amazon S3 日誌的 IAM 政策

在您的核心將日誌資料傳送到 Amazon S3 之前,作業執行角色的許可政策必須包含下列許可。將 DOC-EXAMPLE-BUCKET-LOGGING 取代為日誌儲存貯體的名稱。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET-LOGGING", "arn:aws:s3:::DOC-EXAMPLE-BUCKET-LOGGING/*", ] } ] }
注意

Amazon EMR on EKS 也可以建立 S3 儲存貯體。如果無法使用 S3 儲存貯體,請在 IAM 政策中包含 s3:CreateBucket 許可。

將所需許可授予給執行角色以便將日誌傳送到 S3 儲存貯體之後,您的日誌資料會傳送到以下 Amazon S3 位置。在 create-managed-endpoint 請求的 monitoringConfiguration 區段中傳遞 s3MonitoringConfiguration 時,會發生這種情況。

  • 驅動程式日誌logUri/virtual-cluster-id/endpoints/endpoint-id/containers/spark-application-id/spark-application-id-driver/(stderr.gz/stdout.gz)

  • 執行程式日誌logUri/virtual-cluster-id/endpoints/endpoint-id/containers/spark-application-id/executor-pod-name-exec-<Number>/(stderr.gz/stdout.gz)

注意

Amazon EMR on EKS 不會將端點日誌上傳到 S3 儲存貯體。

使用互動端點指定自訂 Pod 範本

您可以建立互動端點,在其中指定驅動程式和執行程式的自訂 Pod 範本。Pod 範本是決定如何執行每個 Pod 的規範。可以使用 Pod 範本檔案來定義 Spark 組態不支援的驅動程式或執行程式 Pod 的組態。Amazon EMR 6.3.0 版本及更高版本目前支援 Pod 範本。

如需有關 Pod 範本的詳細資訊,請參閱《Amazon EMR on EKS 開發指南》中的使用 Pod 範本

以下範例會示範如何使用 Pod 範本建立互動端點:

aws emr-containers create-managed-endpoint \ --type JUPYTER_ENTERPRISE_GATEWAY \ --virtual-cluster-id virtual-cluster-id \ --name example-endpoint-name \ --execution-role-arn arn:aws:iam::aws-account-id:role/EKSClusterRole \ --release-label emr-6.9.0-latest \ --configuration-overrides '{ "applicationConfiguration": [ { "classification": "spark-defaults", "properties": { "spark.kubernetes.driver.podTemplateFile": "path/to/driver/template.yaml", "spark.kubernetes.executor.podTemplateFile": "path/to/executor/template.yaml" } }] }'

將 JEG Pod 部署到節點群組

JEG (Jupyter Enterprise Gateway) Pod 放置是一項功能,可讓您在特定節點群組上部署互動端點。使用此功能,可以設定互動端點的設定,例如 instance type

將 JEG Pod 關聯至受管節點群組

下列組態屬性可讓您指定要部署 JEG Pod 之 Amazon EKS 叢集上的受管節點群組名稱。

//payload --configuration-overrides '{ "applicationConfiguration": [ { "classification": "endpoint-configuration", "properties": { "managed-nodegroup-name": NodeGroupName } } ] }'

節點群組必須已將 Kubernetes 標籤 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName 附接至屬於節點群組的所有節點。若要列出節點群組中擁有此標籤的所有節點,請使用下列命令:

kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName

如果上述命令輸出未傳回屬於受管節點群組的節點,則節點群組中沒有附接 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName Kubernetes 標籤的節點。在這種情況下,遵循以下步驟將標籤附接至節點群組中的節點。

  1. 使用下列命令,將 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName Kubernetes 標籤新增至受管節點群組 NodeGroupName 中的所有節點:

    kubectl label nodes --selector eks:nodegroup-name=NodeGroupName for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName
  2. 使用下列命令,確認已正確標記節點:

    kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName

受管節點群組必須與 Amazon EKS 叢集的安全群組相關聯,這通常發生在您使用 eksctl 建立叢集和受管節點群組時。您可以使用以下步驟在 AWS 控制台中驗證這一點。

  1. 轉至 Amazon EKS 主控台中的叢集。

  2. 轉至叢集的「聯網」索引標籤,並記下叢集安全群組。

  3. 轉至叢集的「運算」索引標籤,然後按一下受管節點群組名稱。

  4. 在受管節點群組的詳細資訊索引標籤下,確認您先前記下的叢集安全群組列在安全群組下。

如果受管節點群組未附接至 Amazon EKS 叢集安全群組,則需要將 for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName 標籤附接至節點群組安全群組。使用下列步驟來附接此標籤。

  1. 轉至 Amazon EC2 主控台並按一下左側導覽窗格中的安全群組。

  2. 按一下核取方塊,選取受管節點群組的安全群組。

  3. 標籤索引標籤下,使用管理標籤按鈕新增標籤 for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName

將 JEG Pod 關聯至自我管理節點群組

下列組態屬性可讓您指定要部署 JEG Pod 之 Amazon EKS 叢集上的自我管理或未受管節點群組名稱。

//payload --configuration-overrides '{ "applicationConfiguration": [ { "classification": "endpoint-configuration", "properties": { "self-managed-nodegroup-name": NodeGroupName } } ] }'

節點群組必須已將 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName Kubernetes 標籤附接至屬於節點群組的所有節點。若要列出節點群組中擁有此標籤的所有節點,請使用下列命令:

kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName

如果上述命令輸出未傳回屬於自我管理節點群組的節點,則節點群組中沒有附接 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName Kubernetes 標籤的節點。在這種情況下,遵循以下步驟將標籤附接至節點群組中的節點。

  1. 如果使用 eksctl 建立自我管理節點群組,請使用下列命令將 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName Kubernetes 標籤一次新增至自我管理節點群組 NodeGroupName 中的所有節點。

    kubectl label nodes --selector alpha.eksctl.io/nodegroup-name=NodeGroupName for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName

    如果您未使用 eksctl 建立自我管理節點群組,則需要將上述命令中的選取器取代為附接至節點群組中所有節點的不同 Kubernetes 標籤。

  2. 使用下列命令,確認已正確標記節點:

    kubectl get nodes --show-labels | grep for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName

自我管理節點群組的安全群組必須已附接 for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName 標籤。使用下列步驟將標籤從 AWS Management Console中附接至安全群組。

  1. 導覽至 Amazon EC2 主控台。在左側導覽窗格中,選取安全群組

  2. 選取自我管理節點群組中安全群組旁邊的核取方塊。

  3. 標籤索引標籤下,使用管理標籤按鈕新增標籤 for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName。用適當的值取代 ClusterNameNodeGroupName

將 JEG Pod 關聯至具有隨需執行個體的受管節點群組

也可以定義其他標籤 (稱為 Kubernetes 標籤選取器),以指定其他約束或限制,以便在指定節點或節點群組上執行互動端點。以下範例說明如何將隨需 Amazon EC2 執行個體用於 JEG Pod。

--configuration-overrides '{ "applicationConfiguration": [ { "classification": "endpoint-configuration", "properties": { "managed-nodegroup-name": NodeGroupName, "node-labels": "eks.amazonaws.com/capacityType:ON_DEMAND" } } ] }'
注意

只能將 node-labels 屬性與 managed-nodegroup-nameself-managed-nodegroup-name 屬性搭配使用。

Jupyter Enterprise Gateway (JEG) 組態選項

Amazon EMR on EKS 使用 Jupyter Enterprise Gateway (JEG) 開啟互動端點。建立端點時,可以為允許列出的 JEG 組態設定下列值。

  • RemoteMappingKernelManager.cull_idle_timeout - 以秒為單位的逾時值 (整數),在此時間之後核心會被視為閒置並準備好被剔除。0 或更低的值會停用剔除。對於網路連線不佳的使用者而言,短暫的逾時可能會導致核心被剔除。

  • RemoteMappingKernelManager.cull_interval - 以秒為單位的時間間隔 (整數),會根據該時間值檢查超過剔除逾時值的閒置核心。

修改 PySpark 會話參數

從 EKS 版本 6.9.0 上的 Amazon EMR 開始,在 Amazon EMR 工作室中,您可以通過在 EMR 筆記本電腦單元中執行%%configure魔術命令來調整與 PySpark 會話關聯的 Spark 配置。

下列範例顯示了範例承載,可用來修改 Spark 驅動程式和執行程式的記憶體、核心和其他屬性。對於 conf 設定,可設定 Apache Spark 組態文件中提到的任何 Spark 組態。

%%configure -f { "driverMemory": "16G", "driverCores" 4, "executorMemory" : "32G" "executorCores": 2, "conf": { "spark.dynamicAllocation.maxExecutors" : 10, "spark.dynamicAllocation.minExecutors": 1 } }

下列範例顯示範例承載,可用於將檔案、PyFiles 和 jar 相依性新增至 Spark 執行期。

%%configure -f { "files": "s3://test-bucket-emr-eks/sample_file.txt", "pyFiles": : "path-to-python-files", "jars" : "path-to-jars }

具有互動端點的自訂核心映像

為了確保在 Amazon EMR Studio 中執行互動式工作負載時具有應用程式的正確相依性,您可以為互動端點自訂 Docker 映像檔,並執行自訂的基礎核心映像。若要建立互動端點,並將其與自訂 Docker 映像檔相連,請執行以下步驟。

注意

只能覆寫基礎映像。無法新增核心映像類型。

  1. 建立並發布自訂的 Docker 映像檔。基礎映像包含 Spark 執行期和隨之一起執行的筆記本核心。若要建立映像,可遵循 如何自訂 Docker 映像檔 中的步驟 1 到 4。在步驟 1 中,Docker 檔案中的基礎映像 URI 必須使用 notebook-spark 代替 spark

    ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag

    如需如何選取 AWS 區域 和容器映像標籤的詳細資訊,請參閱如何選擇基礎映像 URI

  2. 建立可與自訂映像搭配使用的互動端點。

    1. 使用下列內容建立 JSON 檔案 custom-image-managed-endpoint.json。此範例使用 Amazon EMR 6.9.0 版。

      { "name": "endpoint-name", "virtualClusterId": "virtual-cluster-id", "type": "JUPYTER_ENTERPRISE_GATEWAY", "releaseLabel": "emr-6.9.0-latest", "executionRoleArn": "execution-role-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" } } ] } ] } }
    2. 使用 JSON 檔案中指定的組態建立互動端點,如下列範例所示。如需詳細資訊,請參閱 使用 create-managed-endpoint 命令建立互動端點

      aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json
  3. 透過 EMR Studio 連接至互動端點。如需詳細資訊和要完成的步驟,請參閱工作坊工作室文件中 EKS 上的 Amazon EMR 一節中的從 AWS 工作室連線