配置交互式端点的设置 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

配置交互式端点的设置

监控 Spark 任务

为了监控故障并排除故障,请配置您的交互式终端节点,以便通过终端节点启动的任务可以向 Amazon S3、Amazon Logs 或两者发送 CloudWatch 日志信息。以下各节介绍如何将您使用 Amazon EMR on EKS 交互式端点启动的 Spark 任务的 Spark 应用程序日志发送到 Amazon S3。

配置 Amazon S3 日志的 IAM policy

任务执行角色的权限策略中必须包含以下权限,内核才能将日志数据发送到 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 policy 应包含 s3:CreateBucket 权限。

在授予执行角色将日志发送到 S3 存储桶的权限后,日志数据将发送到以下 Amazon S3 位置。当 s3MonitoringConfigurationcreate-managed-endpoint 请求的 monitoringConfiguration 部分中传递时,就会发生这种情况。

  • 驱动程序日志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 关联到托管式节点组

以下配置属性允许您指定 Amazon EKS 集群上的托管式节点组的名称,JEG Pod 将在此集群中部署。

//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. 使用以下命令向托管式节点组 NodeGroupName 中的所有节点添加 for-use-with-emr-containers-managed-endpoint-ng=NodeGroupName Kubernetes 标签:

    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 创建集群和托管式节点组,通常会出现这种情况。您可以使用以下步骤在 Amazon 控制台中对此进行验证。

  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 关联到自托管式节点组

以下配置属性允许您指定 Amazon EKS 集群上的自托管式或非托管式节点组的名称,JEG Pod 将在此集群中部署。

//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 标签。使用以下步骤将标签附加到 Amazon Web Services 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 Studio 中,你可以通过在 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 } }

下例显示了一个示例负载,您可以使用该负载向 Spark 运行时添加文件、PyFile 和 jar 依赖项。

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

使用交互式端点的自定义内核映像

您可以为交互式端点自定义 Docker 映像并运行自定义的基本内核映像,以便确保在从 Amazon EMR Studio 运行交互式工作负载时应用程序拥有正确的依赖项。要创建交互式端点并将其连接到自定义 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

    有关如何选择 Amazon Web Services 区域 和容器镜像标签的更多信息,请参阅如何选择基础镜像 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 连接到交互式端点。有关更多信息和要完成的步骤,请参阅 Worksho Amazon p Studio 文档中 EKS 上的 Amazon EMR 部分中的 “从 Studio 连接”。