

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

# 設定 Amazon EMR 叢集記錄和偵錯
<a name="emr-plan-debugging"></a>

在您規劃叢集時，要決定的一件事便是您要提供多少偵錯支援。在您第一次開發您的資料處理應用程式時，我們建議在叢集上測試該應用程式，處理小型但具有代表性的資料子集。當您執行此操作時，您可能會想要利用所有 Amazon EMR 提供的偵錯工具 (例如存檔日誌檔案) 給 Amazon S3。

當您完成開發，並將您的資料處理應用程式投入全面生產時，您可以選擇縮減偵錯。如此一來可以節省在 Amazon S3 中儲存日誌檔案封存的成本，並減少叢集上的處理負載，因為它不再需要將狀態寫入至 Amazon S3。當然，做為取捨，如果出現問題，您可以用來調查問題的工具便少了些。

## 預設日誌檔案
<a name="emr-plan-debugging-logs"></a>

根據預設，每個叢集都會在所有節點上寫入日誌檔案。這些會寫入至 `/mnt/var/log/` 目錄。您可以使用 SSH 連線到任何節點來存取這些節點，如中所述[使用 SSH 連線至 Amazon EMR 叢集主節點](emr-connect-master-node-ssh.md)。Amazon EMR 會收集 Amazon EMR 協助程式和其他 Amazon EMR 程序所產生的特定系統和應用程式日誌，以確保有效的服務操作。

**注意**  
如果您使用 Amazon EMR 6.8.0 版或更早版本，日誌檔案不會在叢集終止期間儲存至 Amazon S3，因此一旦節點終止，您就無法存取日誌檔案。Amazon EMR 6.9.0 版及更新版本會在叢集縮減規模期間將日誌封存至 Amazon S3，因此即使在節點終止後，叢集上產生的日誌檔案仍然存在。

您不需要啟用任何項目，即可在所有節點上寫入日誌檔案。這是 Amazon EMR 與 Hadoop 的預設行為。

Amazon EMR 會擷取 S3 記錄的三種日誌類別：
+ **系統日誌**：EMR 協助程式日誌
+ **應用程式日誌**：Hadoop、Spark、Hive 和叢集上執行之其他應用程式的架構日誌
+ **持久性 UI 日誌**：持久性應用程式 UIs 所需的日誌，例如 Spark 歷史記錄伺服器和 Tez UI

在本機檔案系統上，叢集會在 中產生多種類型的日誌檔案`/mnt/var/log`，包括：
+ **步驟日誌** – 這些日誌是由 Amazon EMR 服務所產生，且包含有關叢集和每個步驟結果的資訊。日誌檔案儲存在主節點上的 `/mnt/var/log/hadoop/steps/` 目錄中。每個步驟都將其結果記錄在一個單獨編號的子目錄中：第一個步驟為 `/mnt/var/log/hadoop/steps/s-stepId1/`，第二個步驟為 `/mnt/var/log/hadoop/steps/s-stepId2/`，以此類推。13 個字元的步驟識別符 (例如 stepId1、stepId2) 對叢集來說是唯一的。
+ **Hadoop 和 YARN 元件日誌** — 例如，與 Apache YARN 和 MapReduce 相關聯的元件日誌包含在所有節點`/mnt/var/log`的 中的不同資料夾中。`/mnt/var/log` 下的 Hadoop 元件日誌檔案位置如下：hadoop-hdfs，hadoop-mapreduce，hadoop-httpfs 與 hadoop-yarn。hadoop-state-pusher 目錄用於 Hadoop 狀態推送器程序的輸出。
+ **引導操作日誌** – 如果您的作業使用引導操作，這些動作的結果都會加以記錄。日誌檔案存放在所有節點上的 /mnt/var/log/bootstrap-actions/ 中。每個引導操作都將其結果記錄在一個單獨編號的子目錄中：第一個引導操做為 `/mnt/var/log/bootstrap-actions/1/`，第二個引導操做為 ` /mnt/var/log/bootstrap-actions/2/`，以此類推。
+ **執行個體狀態日誌** – 這些日誌提供有關節點的 CPU、記憶體狀態和廢棄項目收集器執行緒的資訊。日誌檔案存放在所有節點`/mnt/var/log/instance-state/`的 中。

## 將日誌檔案封存至 Amazon S3
<a name="emr-plan-debugging-logs-archive"></a>

**注意**  
您目前不能以 `yarn logs` 公用程式使用日誌彙總至 Amazon S3。

Amazon EMR 6.9.0 版及更新版本會在叢集縮減規模期間將日誌封存至 Amazon S3，因此即使在節點終止後，叢集上產生的日誌檔案仍然存在。此行為會自動啟用，因此您無需執行任何操作即可開啟。對於 Amazon EMR 6.8.0 版及更早版本，您可以設定叢集，以定期將儲存在所有節點上的日誌檔案封存至 Amazon S3。這可確保日誌檔案在叢集終止 (無論是透過正常關閉還是由於錯誤關閉) 後仍可使用。Amazon EMR 會以 5 分鐘為間隔將日誌檔案封存至 Amazon S3。

若要將 Amazon EMR 6.8.0 版及更早版本的日誌檔案封存至 Amazon S3，當您啟動叢集時必須啟用此功能。您可以使用主控台、CLI 或 API 來執行這項作業。在預設情況下，使用主控台啟動的叢集便已啟用了日誌封存。對於使用 CLI 或 API 啟動的叢集，則必須手動啟用對 Amazon S3 的日誌記錄。

------
#### [ Console ]

**使用新主控台將日誌檔案封存至 Amazon S3**

1. 登入 AWS 管理主控台，並在 https：//[https://console.aws.amazon.com/emr](https://console.aws.amazon.com/emr) 開啟 Amazon EMR 主控台。

1. 在左側導覽窗格中的 **EC2 上的 EMR** 下，選擇**叢集**，然後選擇**建立叢集**。

1. 在**叢集日誌**下，選取**將叢集特定日誌發布至 Amazon S3** 核取方塊。

1. 在 **Amazon S3 位置**欄位中，鍵入 (或瀏覽至) Amazon S3 路徑來儲存您的日誌。如果您鍵入的資料夾名稱並不存在於儲存貯體，Amazon S3 會建立該資料夾。

   當您設定此值時，Amazon EMR 會將叢集中的 EC2 執行個體日誌檔案複製到 Amazon S3。這可避免日誌檔案在叢集結束且 EC2 終止託管叢集的執行個體時遺失。這些日誌對於故障排除非常實用。如需詳細資訊，請參閱[檢視日誌檔案](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)。

1. 選擇性地選取**加密叢集特定的日誌**核取方塊。然後，從清單中選擇 AWS KMS 金鑰、輸入金鑰 ARN，或建立新的金鑰。僅 Amazon EMR 5.30.0 版及更新版本提供此選項，但 6.0.0 版不提供。若要使用此選項，請將許可新增至 EC2 執行個體描述檔和 Amazon EMR 角色 AWS KMS 的 。如需詳細資訊，請參閱[使用 AWS KMS 客戶受管金鑰加密存放在 Amazon S3 中的日誌檔案](#emr-log-encryption)。

1. 選擇適用於您的叢集的任何其他選項。

1. 若要啟動您的叢集，請選擇**建立叢集**。

------
#### [ CLI ]

**使用 將日誌檔案封存至 Amazon S3 AWS CLI**

若要使用 將日誌檔案封存至 Amazon S3 AWS CLI，請輸入 `create-cluster`命令並使用 `--log-uri` 參數指定 Amazon S3 日誌路徑。

1. 若要記錄檔案至 Amazon S3，請鍵入下列命令，並將 *myKey* 取代為您的 EC2 金鑰對名稱。

   ```
   aws emr create-cluster --name "Test cluster" --release-label emr-7.12.0 --log-uri s3://DOC-EXAMPLE-BUCKET/logs --applications Name=Hadoop Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3
   ```

1. 如果您在未使用 `--instance-groups` 參數的情況下指定執行個體計數，即會啟動單一主節點，且剩餘執行個體會以核心節點的形式啟動。所有節點都將使用命令中指定的執行個體類型。
**注意**  
如果您先前尚未建立預設 Amazon EMR 服務角色和 EC2 執行個體設定檔，請先輸入 `aws emr create-default-roles` 來建立這些項目，然後再鍵入 `create-cluster` 子命令。

------

### 使用 AWS KMS 客戶受管金鑰加密存放在 Amazon S3 中的日誌檔案
<a name="emr-log-encryption"></a>

使用 Amazon EMR 5.30.0 版和更新版本 (Amazon EMR 6.0.0 除外），您可以使用 AWS KMS 客戶受管金鑰加密存放在 Amazon S3 中的日誌檔案。若要在主控台中啟用此選項，請依照[將日誌檔案封存至 Amazon S3](#emr-plan-debugging-logs-archive)中的步驟執行。您的 Amazon EC2 執行個體設定檔和 Amazon EMR 角色必須符合下列先決條件：
+ 用於叢集的 Amazon EC2 執行個體設定檔必須具有使用 `kms:GenerateDataKey` 的許可。
+ 用於叢集的 Amazon EMR 角色必須具有使用 `kms:DescribeKey` 的許可。
+ 必須將 Amazon EC2 執行個體描述檔和 Amazon EMR 角色新增至指定 AWS KMS 客戶受管金鑰的金鑰使用者清單，如下列步驟所示：

  1. 開啟位於 https：//[https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) 的 AWS Key Management Service (AWS KMS) 主控台。

  1. 若要變更 AWS 區域，請使用頁面右上角的區域選擇器。

  1. 選取要修改的 KMS 金鑰別名。

  1. 在 **Key Users (金鑰使用者)** 下的金鑰詳細資訊頁面上，選擇 **Add (新增)**。

  1. 在**新增金鑰使用者**對話方塊中，選取您的 Amazon EC2 執行個體設定檔和 Amazon EMR 角色。

  1. 選擇**新增**。
+ 您也必須設定 KMS 金鑰，以允許 `persistentappui.elasticmapreduce.amazonaws.com`和 `elasticmapreduce.amazonaws.com` 服務主體使用 `kms:GenerateDataKey`、 `kms:GenerateDataKeyWithoutPlaintext`和 `kms:Decrypt`。這可讓 EMR 將 KMS 金鑰加密的日誌讀取和寫入受管儲存。使用者 IAM 角色必須具有使用 `kms:GenerateDataKey`和 的許可`kms:Decrypt`。

  ```
  {
     "Sid": "Allow User Role to use KMS key",
     "Effect": "Allow",
     "Principal": {
          "AWS": "User Role"
      },
      "Action": [
          "kms:Decrypt", 
          "kms:GenerateDataKey"
     ],
      "Resource": "*",
      "Condition": {
          "StringLike": {
              "kms:EncryptionContext:aws:elasticmapreduce:clusterId": "j-*",
             "kms:ViaService": "elasticmapreduce.region.amazonaws.com"
         }
      }
  },
  {
      "Sid": "Allow Persistent APP UI to validate KMS key for write",
      "Effect": "Allow",
      "Principal":{
          "Service": [
              "elasticmapreduce.amazonaws.com"
          ]
       },
       "Action": [
         "kms:GenerateDataKeyWithoutPlaintext"
        ],
       "Resource": "*",
       "Condition": {
          "StringLike": {
              "aws:SourceArn": "arn:aws:elasticmapreduce:region:account:cluster/j-*",
              "kms:EncryptionContext:aws:elasticmapreduce:clusterId": "j-*"
          }
       }
  },
  {
      "Sid": "Allow Persistent APP UI to Write/Read Logs",
      "Effect": "Allow",
      "Principal":{
          "Service": [
              "persistentappui.elasticmapreduce.amazonaws.com",
              "elasticmapreduce.amazonaws.com"
          ]
       },
       "Action": [
         "kms:Decrypt",
         "kms:GenerateDataKey"
       ],
       "Resource": "*",
       "Condition": {
          "StringLike": {
              "aws:SourceArn": "arn:aws:elasticmapreduce:region:account:cluster/j-*",
              "kms:EncryptionContext:aws:elasticmapreduce:clusterId": "j-*",
              "kms:ViaService": "s3.region.amazonaws.com"
          }
       }
  }
  ```

  作為安全最佳實務，我們建議您新增 `kms:EncryptionContext`和 `aws:SourceArn`條件。這些條件有助於確保金鑰僅供 Amazon EMR on EC2 使用，且僅用於從特定叢集中執行之任務產生的日誌。

如需詳細資訊，請參閱 [Amazon EMR 使用的 IAM 服務角色](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-service-roles.html)，以及 AWS Key Management Service 開發人員指南中的[使用金鑰政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。

### 使用 在 Amazon S3 中彙總日誌 AWS CLI
<a name="emr-log-aggregate-CLI"></a>
**注意**  
您目前不能以 `yarn logs` 公用程式使用日誌彙總。您僅能使用此程序支援的彙總。

日誌彙總 (Hadoop 2.x) 會將來自個別應用程式的所有容器日誌編譯為單一檔案。若要使用 啟用 Amazon S3 的日誌彙總 AWS CLI，您可以在叢集啟動時使用引導操作來啟用日誌彙總，並指定儲存貯體來存放日誌。
+ 若要啟用日誌彙總，請建立下列稱為 `myConfig.json` 的組態檔案，其中包含下列項目：

  ```
  [
    {
      "Classification": "yarn-site",
      "Properties": {
        "yarn.log-aggregation-enable": "true",
        "yarn.log-aggregation.retain-seconds": "-1",
        "yarn.nodemanager.remote-app-log-dir": "s3:\/\/DOC-EXAMPLE-BUCKET\/logs"
      }
    }
  ]
  ```

  鍵入下列命令，然後將 *`myKey`* 取代為 EC2 金鑰對的名稱。您還可以將任何紅色文字取代為您自己的組態。

  ```
  aws emr create-cluster --name "Test cluster" \
  --release-label emr-7.12.0 \
  --applications Name=Hadoop \
  --use-default-roles \
  --ec2-attributes KeyName=myKey \
  --instance-type m5.xlarge \
  --instance-count 3 \
  --configurations file://./myConfig.json
  ```

  如果您在未使用 `--instance-groups` 參數的情況下指定執行個體計數，即會啟動單一主節點，且剩餘執行個體會以核心節點的形式啟動。所有節點都將使用命令中指定的執行個體類型。
**注意**  
如果您先前尚未建立預設 EMR 服務角色和 EC2 執行個體設定檔，請先執行 `aws emr create-default-roles` 來建立這些設定檔，然後再執行 `create-cluster` 子命令。

如需在 中使用 Amazon EMR 命令的詳細資訊 AWS CLI，請參閱 [AWS CLI 命令參考](https://docs.aws.amazon.com/cli/latest/reference/emr)。

### Amazon EMR 自我診斷和疑難排解工具
<a name="emr-troubleshooting-saw-diagnostics"></a>

此 Runbook 有助於識別在 Amazon EMR 叢集上執行任務時的錯誤。Runbook 會分析檔案系統上定義的日誌清單，並尋找預先定義的關鍵字清單。這些日誌項目用於建立 Amazon CloudWatch Events 事件，因此您可以根據事件採取任何必要的動作。或者， Runbook 會將日誌項目發佈至您選擇的 Amazon CloudWatch Logs 日誌群組。[AWSSupport-AnalyzeEMRLogs](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-analyzeemrlogs.html)。

此 Runbook 使用 Amazon Athena 與 Glue Data Catalog 整合，協助診斷 S3 上的 Amazon EMR AWS 日誌。 Amazon Athena Amazon Athena 用於查詢容器、節點日誌或兩者的 Amazon EMR 日誌檔案，以及特定日期範圍或關鍵字搜尋的選用參數。此 Runbook 提供在 Amazon EMR 叢集日誌中找到的所有錯誤和經常發生的例外狀況清單，以及對應的 S3 日誌位置。它還提供 Amazon EMR 日誌中符合的唯一已知例外狀況摘要，以及建議的解決方案和知識中心/re：Post 文章，以協助對 [AWSSupport-DiagnoseEMRLogsWithAthena](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/awssupport-diagnose-emr-logs-with-athena.html) 進行故障診斷。

## 日誌位置
<a name="emr-log-list"></a>

下列清單包含所有日誌類型及其在 Amazon S3 中的位置。您可以使用這些日誌對 Amazon EMR 問題進行疑難排解。

**步驟日誌**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/steps/<step-id>/`

**應用程式記錄**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/containers/`  
此位置包括容器 `stderr` 和 `stdout`、`directory.info`、`prelaunch.out` 及 `launch_container.sh` 日誌。

**資源管理員日誌**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hadoop-yarn/`

**Hadoop HDFS**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-hdfs/`  
此位置包括 NameNode、DataNode 和 YARN TimelineServer 日誌。

**節點管理員日誌**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-yarn/`

**執行個體狀態日誌**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/daemons/instance-state/`

**Amazon EMR 佈建日誌**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/provision-node/*`

**Hive 日誌**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hive/*`  
+ 若要尋找叢集上的 Hive 日誌，請移除星號 (`*`) 並將 `/var/log/hive/` 附加至上面的連結。
+ 若要尋找 HiveServer2 日誌，請移除星號 (`*`) 並將 `var/log/hive/hiveserver2.log` 附加至上面的連結。
+ 若要尋找 HiveCLI 日誌，請移除星號 (`*`) 並將 `/var/log/hive/user/hadoop/hive.log` 附加至上面的連結。
+ 若要尋找 Hive Metastore Server 日誌，請移除星號 (`*`) 並將 `/var/log/hive/user/hive/hive.log` 附加至上面的連結。
如果您的故障是在 Tez 應用程式的主要或任務節點中，請提供適當 Hadoop 容器的日誌。

## 控制 S3 記錄行為 (Amazon EMR 7.13.0 和更新版本）
<a name="s3-logging-configuration"></a>

從 Amazon EMR 7.13.0 開始，您可以透過 S3LoggingConfiguration 功能控制上傳行為。這可讓您為不同的日誌類型指定不同的上傳政策：系統日誌、應用程式日誌和持久性 UI 日誌。

### 上傳政策
<a name="s3-logging-upload-policies"></a>

對於每個日誌類型，您可以指定下列其中一個上傳政策。未指定的日誌類型預設為標準行為 (emr 受管）：

**emr 受管 （預設）**  
標準行為。日誌會依 LogUri 中的設定上傳至 Amazon S3，服務會保留特定日誌，以供操作支援和故障診斷之用。

**on-customer-s3only**  
僅限客戶受管儲存。日誌只會上傳到客戶指定的 S3 儲存貯體。這需要您在建立叢集時指定 LogUri。Persistent-ui-logs 不能有客戶限定政策。允許的 persistent-ui-logs 政策會受到 emr 管理並停用。

**disabled**  
此日誌類型沒有 S3 上傳。

### 組態範例
<a name="s3-logging-config-examples"></a>

您可以在透過 AWS CLI、 或 AWS SDKs 建立新的 Amazon EMR 叢集時設定 S3 記錄。組態是透過 MonitoringConfiguration 參數指定。

**範例：預設行為**  
如果您未指定 S3LoggingConfiguration，則所有日誌類型預設為 emr 受管行為：

```
aws emr create-cluster \
--name "MyCluster" \
--release-label emr-7.13.0 \
--instance-type m5.xlarge \
--instance-count 3 \
--log-uri s3://my-bucket/logs/ \
--use-default-roles
```

**範例：自訂 S3 記錄組態**  
此範例說明如何為每個日誌類型設定不同的上傳政策：

```
aws emr create-cluster \
--name "MyCluster" \
--release-label emr-7.13.0 \
--instance-type m5.xlarge \
--instance-count 3 \
--log-uri s3://my-bucket/logs/ \
--use-default-roles \
--monitoring-configuration '{
    "S3LoggingConfiguration": {
        "LogTypeUploadPolicy": {
            "application-logs": "on-customer-s3only",
            "persistent-ui-logs": "disabled"
        }
    }
}'
```

此組態只會將應用程式日誌上傳至客戶 S3 儲存貯體，並完全停用持久性 UI 日誌上傳。未指定的日誌類型 （系統日誌） 遵循預設 (emr 受管） 行為。

### 考量事項
<a name="s3-logging-considerations"></a>
+ S3 記錄組態只能在叢集建立時間設定，且無法針對執行中的叢集進行修改。
+ Persistent-ui-logs 不能有客戶限定政策。允許的 persistent-ui-logs 政策會受到 emr 管理並停用。
+ **LogUri 需求**：針對 system-logs 或 application-logs 使用客戶限定政策時，您必須指定 LogUri 參數。如果沒有 LogUri，叢集建立將會失敗。
+ **預設行為**：如果未指定 S3LoggingConfiguration，則所有日誌類型預設為 emr 受管行為。