

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

# 設定 Docker 以搭配 Amazon EMR 叢集使用
<a name="emr-plan-docker"></a>

Amazon EMR 6.x 支援 Hadoop 3，允許 YARN NodeManager 直接在 Amazon EMR 叢集上或 Docker 容器內部啟動容器。Docker 容器提供執行應用程式程式碼的自訂執行環境。自訂執行環境與 YARN NodeManager 和其他應用程式的執行環境隔離。

Docker 容器可以包含由應用程式使用的程式庫，也可以提供不同版本的原生工具和程式庫，如 R 和 Python。您可以使用熟悉的 Docker 工具來為您的應用程式定義程式庫和執行時間依存項目。

依預設，Amazon EMR 6.x 叢集設定為允許 YARN 應用程式 (如 Spark) 使用 Docker 容器執行。若要自訂容器組態，請在 `/etc/hadoop/conf` 目錄中編輯可用的 `yarn-site.xml` 和 `container-executor.cfg` 檔案裡定義的 Docker 支援選項。如需有關每個組態選項及其使用方式的詳細資訊，請參閱[使用 Docker 容器啟動應用程式](https://hadoop.apache.org/docs/r3.1.0/hadoop-yarn/hadoop-yarn-site/DockerContainers.html)。

您可以選擇在提交任務時使用 Docker。使用下列變數來指定 Docker 執行時間和 Docker 影像。
+ `YARN_CONTAINER_RUNTIME_TYPE=docker`
+ `YARN_CONTAINER_RUNTIME_DOCKER_IMAGE={{{DOCKER_IMAGE_NAME}}}`

當您使用 Docker 容器來執行 YARN 應用程式時，YARN 會下載您在提交任務時指定的 Docker 影像。為了讓 YARN 解析此 Docker 影像，它必須使用 Docker 登錄檔進行設定。Docker 登錄檔的組態選項，取決於您使用公有子網路或私有子網路來部署叢集。

## Docker 登錄檔
<a name="emr-docker-registries"></a>

Docker 登錄檔是 Docker 影像的儲存和分配系統。對於 Amazon EMR，建議您使用 Amazon ECR，它是全受管 Docker 容器登錄檔，可讓您建立自己的自訂映像，並將它們託管在高可用性和可擴展的架構中。

**部署考量**

Docker 登錄檔需要從叢集中的每個主機進行網路存取。這是因為當您的 YARN 應用程式在叢集上執行時，每個主機都會從 Docker 登錄檔下載映像。依照您是否將 Amazon EMR 叢集部署到公有或私有子網路，這些網路連線需求可能會限制您選擇的 Docker 登錄檔。

**公有子網路**

當 EMR 叢集部署在公有子網路中時，執行 YARN NodeManager 的節點可以直接透過網際網路存取任何可用的登錄檔。

**私有子網路**

當 EMR 叢集部署在私有子網路中時，執行 YARN NodeManager 的節點無法直接存取網際網路。Docker 映像可以在 Amazon ECR 中託管並透過 存取 AWS PrivateLink。

如需有關如何使用 AWS PrivateLink 在私有子網路案例中允許存取 Amazon ECR 的詳細資訊，請參閱[AWS PrivateLink 設定 Amazon ECS 和 Amazon ECR](https://aws.amazon.com/blogs/compute/setting-up-aws-privatelink-for-amazon-ecs-and-amazon-ecr/)。

## 設定 Docker 登錄檔
<a name="emr-docker-hub"></a>

若要將 Docker 登錄檔與 Amazon EMR 搭配使用，您必須將 Docker 設定為信任您要用來解析 Docker 映像檔的特定登錄檔。預設信任登錄檔是本機 (私有) 和 centos。若要使用其他公有儲存庫或 Amazon ECR，您可以透過 `container-executor` 分類索引鍵來使用 EMR 分類 API 來覆寫 `/etc/hadoop/conf/container-executor.cfg` 中的 `docker.trusted.registries` 設定。

下列範例顯示如何將叢集設定為信任名為 `your-public-repo` 的公有儲存庫和 ECR 登錄端點 (`123456789123.dkr.ecr.us-east-1.amazonaws.com`)。如果您是使用 ECR，請以您的特定 ECR 端點取代此端點。

```
[
  {
    "Classification": "container-executor",
    "Configurations": [
        {
            "Classification": "docker",
            "Properties": {
                "docker.trusted.registries": "local,centos,{{your-public-repo}},123456789123.dkr.ecr.us-east-1.amazonaws.com",
                "docker.privileged-containers.registries": "local,centos,your-public-repo,123456789123.dkr.ecr.us-east-1.amazonaws.com"
            }
        }
    ]
  }
]
```

若要使用此組態啟動 Amazon EMR 6.0.0 叢集 AWS Command Line Interface (AWS CLI)，`container-executor.json`請使用上述 ontainer-executor JSON 組態的內容建立名為 的檔案。然後，使用下列命令來啟動叢集。

```
export KEYPAIR=<{{Name of your Amazon EC2 key-pair}}>
export SUBNET_ID=<{{ID of the subnet to which to deploy the cluster}}>
export INSTANCE_TYPE=<{{Name of the instance type to use}}>
export REGION=<{{Region to which to deploy the cluster}}>

aws emr create-cluster \
    --name "EMR-6.0.0" \
    --region $REGION \
    --release-label emr-6.0.0 \
    --applications Name=Hadoop Name=Spark \
    --service-role EMR_DefaultRole \
    --ec2-attributes KeyName=$KEYPAIR,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=$SUBNET_ID \
    --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=$INSTANCE_TYPE InstanceGroupType=CORE,InstanceCount=2,InstanceType=$INSTANCE_TYPE \
    --configuration file://container-executor.json
```

## 設定 YARN 以存取 EMR 6.0.0 及更早版本上的 Amazon ECR
<a name="emr-docker-ECR"></a>

如果您是 Amazon ECR 的新使用者，請遵循 [Amazon ECR 入門](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_GetStarted.html)中的指示進行操作，並確認您可以從 Amazon EMR 叢集中的每個執行個體存取 Amazon ECR。

在 EMR 6.0.0 及更早版本上，若要使用 Docker 命令存取 Amazon ECR，您必須先產生憑證。若要確認 YARN 可以從 Amazon ECR 存取映像，請使用容器環境變數 `YARN_CONTAINER_RUNTIME_DOCKER_CLIENT_CONFIG`，以將參考傳遞給您所產生的憑證。

在其中一個核心節點上執行下列命令，以取得 ECR 帳戶的登入行。

```
aws ecr get-login --region us-east-1 --no-include-email
```

此 `get-login` 命令會產生正確的 Docker CLI 命令，以執行來建立登入資料。複製並從 `get-login` 中執行輸出。

```
sudo docker login -u AWS -p <{{password}}> https://<{{account-id}}>.dkr.ecr.us-east-1.amazonaws.com
```

此命令會在 `/root/.docker` 資料夾中產生一個 `config.json` 檔案。將此檔案複製到 HDFS，以便提交給叢集的作業可以用來驗證 Amazon ECR。

執行以下命令以將 `config.json` 檔案複製到您的主目錄。

```
mkdir -p ~/.docker
sudo cp /root/.docker/config.json ~/.docker/config.json
sudo chmod 644 ~/.docker/config.json
```

執行以下命令以將 config.json 放入 HDFS，以便讓叢集上執行的任務使用。

```
hadoop fs -put ~/.docker/config.json /user/hadoop/
```

YARN 可以作為 Docker 影像登錄檔來存取 ECR，並在任務執行期間提取容器。

設定 Docker 登錄檔和 YARN 後，您可以使用 Docker 容器執行 YARN 應用程式。如需詳細資訊，請參閱[使用 Amazon EMR 6.0.0 透過 Docker 執行 Spark 應用程式](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark-docker.html)。

在 EMR 6.1.0 及更新版本中，您不必手動設定 Amazon ECR 的身分驗證。如果在 `container-executor` 分類金鑰中偵測到 Amazon ECR 登錄檔，則 Amazon ECR 自動身分驗證功能會啟用，而 YARN 會在您提交具有 ECR 映像的 Spark 作業時處理身分驗證程序。您可以透過在 yarn-site 中檢查 `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled` 來確認是否已啟用自動身分驗證。如果 `docker.trusted.registries` 包含 ECR 登錄檔 URL，則會啟用自動身分驗證並將 YARN 身分驗證設定設為 `true`。

**使用自動向 Amazon ECR 進行身分驗證的先決條件**
+ EMR 6.1.0 版或更新版本
+ 組態中包含的 ECR 登錄檔與叢集位於相同區域
+ 具有取得授權字符和提取任何映像的許可的 IAM 角色

如需詳細資訊，請參閱[使用 Amazon ECR 進行設定](https://docs.aws.amazon.com/AmazonECR/latest/userguide/get-set-up-for-amazon-ecr.html)。

**如何啟用自動身分驗證**

遵循 [設定 Docker 登錄檔](#emr-docker-hub) 以將 Amazon ECR 登錄檔設定為受信任的登錄檔，並確保 Amazon ECR 儲存庫和叢集位於相同區域。

若要啟用此功能，即使在受信任登錄檔中未設定 ECR 登錄檔，請使用組態分類將 `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled` 設定為 `true`。

**如何停用自動身分驗證**

依預設，如果在受信任的登錄檔中未偵測到 Amazon ECR 登錄檔，則會停用自動身分驗證。

若要停用自動身分驗證，即使在受信任的登錄檔中已設定 Amazon ECR 登錄檔，請使用組態分類將 `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled` 設定為 `false`。

**如何檢查叢集上是否已啟用自動身分驗證**

在主節點上，使用 `vi` 等文字編輯器檢視檔案內容：`vi /etc/hadoop/conf.empty/yarn-site.xml`。檢查 `yarn.nodemanager.runtime.linux.docker.ecr-auto-authentication.enabled` 的值。