

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

# 配置交互式端点的设置
<a name="managed-endpoint-parameters"></a>

本节包含一系列主题，这些主题涵盖交互式端点和容器组（pod）设置的各种配置。它们使您能够监控和排除故障，将日志信息发送到 Amazon S3 或 Amazon CloudWatch Logs，或者创建交互式终端节点，在其中指定自定义 pod 模板。

**Topics**
+ [监控 Spark 任务](monitoring-spark-jobs.md)
+ [使用交互式端点指定自定义 Pod 模板](custom-pod-templates.md)
+ [将 JEG Pod 部署到节点组](managed-endpoint-nodegroups-setup.md)
+ [Jupyter Enterprise Gateway（JEG）配置选项](jeg-config-options.md)
+ [修改 PySpark 会话参数](modify-pyspark-parameters.md)
+ [使用交互式端点的自定义内核映像](custom-kernel.md)

# 监控 Spark 任务
<a name="monitoring-spark-jobs"></a>

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

**配置 Amazon S3 日志的 IAM policy**

任务执行角色的权限策略中必须包含以下权限，内核才能将日志数据发送到 Amazon S3。将 *amzn-s3-demo-destination-bucket* 替换为日志记录存储桶的名称。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket",
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Sid": "AllowS3Putobject"
    }
  ]
}
```

------

**注意**  
Amazon EMR on EKS 也可以创建 S3 存储桶。如果 S3 存储桶不可用，则 IAM policy 应包含 `s3:CreateBucket` 权限。

在授予执行角色将日志发送到 S3 存储桶的权限后，日志数据将发送到以下 Amazon S3 位置。当 `s3MonitoringConfiguration` 在 `create-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 模板
<a name="custom-pod-templates"></a>

您可以创建交互式端点，在其中为驱动程序和执行程序指定自定义 Pod。*Pod 模板*是决定如何运行每个 Pod 的规范。您可以使用 Pod 模板文件定义 Spark 配置不支持的驱动程序或执行程序 Pod 的配置。Amazon EMR 发行版 6.3.0 及更高版本目前支持 Pod 模板。

有关 Pod 模板的更多信息，请参阅《Amazon EMR on EKS 开发指南**》中的[使用 Pod 模板](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/pod-templates.html)。

以下示例展示如何使用 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 部署到节点组
<a name="managed-endpoint-nodegroups-setup"></a>

JEG（Jupyter Enterprise Gateway）Pod 放置功能允许您在特定节点组上部署交互式端点。使用此功能，您可以为交互式端点配置 `instance type` 等设置。

## 将 JEG Pod 关联到托管式节点组
<a name="associate-jegpod-to-nodegroup"></a>

以下配置属性允许您指定 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
   ```

1. 使用以下命令验证节点是否已正确标记：

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

托管式节点组必须与 Amazon EKS 集群的安全组关联，如果您使用 `eksctl` 创建集群和托管式节点组，通常会出现这种情况。您可以使用以下步骤在 AWS 控制台中对此进行验证。

1. 转到 Amazon EKS 控制台中的集群。

1. 转到集群的“网络”选项卡，记下集群安全组。

1. 转到集群的“计算”选项卡，然后单击托管式节点组名称。

1. 在托管式节点组的**详细信息**选项卡下，验证您之前记下的集群安全组是否已列在**安全组**下。

如果托管式节点组未附加到 Amazon EKS 集群安全组，则需要将 `for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName` 标签附加到节点组安全组。使用以下步骤附加此标签。

1. 转到 Amazon EC2 控制台，然后单击左侧导航窗格上的安全组。

1. 单击复选框，选择托管式节点组的安全组。

1. 在**标签**选项卡下，使用**管理标签**按钮添加标签 `for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName`。

## 将 JEG Pod 关联到自托管式节点组
<a name="associate-jegpod-to-self-managed-nodegroup"></a>

以下配置属性允许您指定 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 标签。

1. 使用以下命令验证节点是否已正确标记：

   ```
   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 管理控制台的安全组。

1. 导航到 Amazon EC2 控制台。在左侧导航窗格中，选择**安全组**。

1. 选中自托管式节点组的安全组旁边的复选框。

1. 在**标签**选项卡下，使用**管理**标签按钮添加标签 `for-use-with-emr-containers-managed-endpoint-sg=ClusterName/NodeGroupName`。用适当的值替换 `ClusterName` 和 `NodeGroupName`。

## 将 JEG Pod 关联到具有按需型实例的托管式节点组
<a name="associate-jegpod-to-on-demand-instances"></a>

您还可以定义其他标签（称为 *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-name` 或 `self-managed-nodegroup-name` 属性一起使用。

# Jupyter Enterprise Gateway（JEG）配置选项
<a name="jeg-config-options"></a>

Amazon EMR on EKS 使用 Jupyter Enterprise Gateway（JEG）启用交互式端点。在创建端点时，您可以为允许列出的 JEG 配置设置以下值。
+ **`RemoteMappingKernelManager.cull_idle_timeout`**：超时时间（以秒为单位的整数），在此时间之后，内核会被视为处于空闲状态并予以剔除。值等于或低于 `0` 便会停用剔除。若用户的网络连接不佳，短暂超时可能会导致内核被剔除。
+ **`RemoteMappingKernelManager.cull_interval`**：检查空闲内核是否超过剔除超时值的间隔（以秒为单位的整数）。

# 修改 PySpark 会话参数
<a name="modify-pyspark-parameters"></a>

从 EKS 版本 6.9.0 上的 Amazon EMR 开始，在 Amazon EMR Studio 中，你可以通过在 EMR 笔记本单元中执行神奇`%%configure`命令来调整与 PySpark 会话关联的 Spark 配置。

下例显示了一个示例负载，您可以使用该负载修改 Spark 驱动程序和执行程序的内存、内核和其他属性。对于 `conf` 设置，您可以配置 [Apache Spark 配置文档](https://spark.apache.org/docs/latest/configuration.html)中提及的任何 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://amzn-s3-demo-bucket-emr-eks/sample_file.txt",
  "pyFiles": : "path-to-python-files",
  "jars" : "path-to-jars
}
```

# 使用交互式端点的自定义内核映像
<a name="custom-kernel"></a>

您可以为交互式端点自定义 Docker 映像并运行自定义的基本内核映像，以便确保在从 Amazon EMR Studio 运行交互式工作负载时应用程序拥有正确的依赖项。要创建交互式端点并将其连接到自定义 Docker 映像，请执行以下步骤。

**注意**  
您只能覆盖基本映像。您无法添加新的内核映像类型。

1. **创建并发布自定义 Docker 映像。**基本镜像包含 Spark 运行时，以及随之运行的 Notebook 内核。要创建映像，您可以按照 [如何自定义 Docker 镜像](docker-custom-images-steps.md) 中的步骤 1 到 4 操作。在步骤 1 中，Docker 文件中的基本映像 URI 必须使用 `notebook-spark` 来代替 `spark`。

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

   有关如何选择 AWS 区域 和容器镜像标签的更多信息，请参阅[如何选择基础映像 URI 的详细信息](docker-custom-images-tag.md)。

1. **创建可与自定义映像配合使用的交互式端点。**

   1. 使用以下内容创建 JSON 文件 `custom-image-managed-endpoint.json`。此示例使用了 Amazon EMR 发行版 6.9.0。  
**Example**  

      ```
      {
          "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"
                              }
                          }
                      ] 
                  }
              ]
          }
      }
      ```

   1. 按如下示例所示，使用该 JSON 文件中指定的配置来创建交互式端点。有关更多信息，请参阅 [使用 `create-managed-endpoint` 命令创建交互式端点](create-managed-endpoint.md#create-using-json-file)。

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

1. **通过 EMR Studio 连接到交互式端点。**有关更多信息和要完成的步骤，请参阅 Worksho AWS p [Studio 文档中 EKS 上的 Amazon EMR 部分中的 “从 Studio 连接](https://emr-on-eks.workshop.aws/advanced/emr-studio/connecting-from-studio.html)”。