

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

# Amazon EMR
<a name="automation-ref-emr"></a>

 AWS Systems Manager 自動化為 Amazon EMR 提供預先定義的 Runbook。如需有關執行手冊的詳細資訊，請參閱 [Working with runbooks](https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-documents.html)。如需如何檢視 Runbook 內容的詳細資訊，請參閱 [檢視 Runbook 內容](automation-runbook-reference.md#view-automation-json)。

**Topics**
+ [`AWSSupport-AnalyzeEMRLogs`](automation-awssupport-analyzeemrlogs.md)
+ [`AWSSupport-DiagnoseEMRLogsWithAthena`](awssupport-diagnose-emr-logs-with-athena.md)

# `AWSSupport-AnalyzeEMRLogs`
<a name="automation-awssupport-analyzeemrlogs"></a>

 **Description** 

此 Runbook 有助於識別在 Amazon EMR 叢集上執行任務時的錯誤。Runbook 會分析檔案系統上定義的日誌清單，並尋找預先定義的關鍵字清單。這些日誌項目用於建立 Amazon CloudWatch Events 事件，因此您可以根據事件採取任何必要的動作。或者， Runbook 會將日誌項目發佈至您選擇的 Amazon CloudWatch Logs 日誌群組。此 Runbook 目前會在日誌檔案中尋找下列錯誤和模式：
+  container\$1out\$1of\$1memory – YARN 容器記憶體不足，執行中的任務可能會失敗。
+  yarn\$1nodemanager\$1health：CORE 或 TASK 節點磁碟空間不足，無法執行任務。
+  node\$1state\$1change：主節點無法存取 CORE 或 TASK 節點。
+  step\$1failure：EMR 步驟失敗。
+  no\$1core\$1nodes\$1running：目前沒有 CORE 節點正在執行，叢集運作狀態不佳。
+  hdfs\$1missing\$1blocks：缺少可能導致資料遺失的 HDFS 區塊。
+  hdfs\$1high\$1util：HDFS 使用率很高，這可能會影響任務和叢集運作狀態。
+  instance\$1controller\$1restart：Instance-Controller 程序已重新啟動。此程序對於叢集運作狀態至關重要。
+  instance\$1controller\$1restart\$1legacy：Instance-Controller 程序已重新啟動。此程序對於叢集運作狀態至關重要。
+  high\$1load：偵測到高負載平均，可能會影響節點運作狀態報告，或導致逾時或變慢。
+  yarn\$1node\$1blacklisted：YARN 已從執行中的任務將 CORE 或 TASK 節點列入黑名單。
+  yarn\$1node\$1lost：YARN 已將 CORE 或 TASK 節點標記為 LOST，可能是連線問題。

 與您指定的 `ClusterID` 相關聯的執行個體必須由 管理 AWS Systems Manager。您可以執行此自動化一次、排定自動化在特定時間間隔執行，或移除先前由自動化建立的排程。此 Runbook 支援 Amazon EMR 發行版本 5.20 到 6.30。

 [執行此自動化 （主控台）](https://console.aws.amazon.com/systems-manager/automation/execute/AWSSupport-AnalyzeEMRLogs) 

**文件類型**

 自動化

**擁有者**

Amazon

**平台**

Linux、macOS、 Windows

**參數**
+ AutomationAssumeRole

  類型：字串

  描述：（選用） 允許 Systems Manager Automation 代表您執行動作的 (IAM) 角色的 AWS Identity and Access Management Amazon Resource Name (ARN)。如果未指定角色，Systems Manager Automation 會使用啟動此 Runbook 之使用者的許可。
+ ClusterID (ClusterID)

  類型：字串

  描述：（必要） 您要分析其節點日誌的叢集 ID。
+ 作業

  類型：字串

  有效值：執行一次 \$1 排程 \$1 移除排程 

  描述：（必要） 在叢集上執行的操作。
+ IntervalTime

  類型：字串

  有效值：5 分鐘 \$1 10 分鐘 \$1 15 分鐘

   描述：（選用） 執行自動化之間的持續時間。此參數僅適用於您`Schedule`為 `Operation` 參數指定的 。
+ LogToCloudWatchLogs

  類型：字串

  有效值：是 \$1 否

   描述：（選用） 如果您`yes`為此參數的值指定 ，自動化會使用 `CloudWatchLogGroup` 參數中指定的名稱來建立 CloudWatch Logs 日誌群組，以存放任何相符的日誌項目。
+ CloudWatchLogGroup

  類型：字串

   描述：（選用） 您要存放任何相符日誌項目的 CloudWatch Logs 日誌群組名稱。此參數僅適用於您`yes`為 `LogToCloudWatchLogs` 參數指定的 。
+ CreateLogInsightsDashboard

  類型：字串

  有效值：是 \$1 否

   描述：（選用） 如果您指定 `yes` ，如果 CloudWatch 儀表板尚未存在，則會建立該儀表板。只有在您`yes`為 參數指定 時，此`LogToCloudWatchLogs`參數才適用。
+ CreateMetricFilters

  類型：字串

  有效值：是 \$1 否

   描述：（選用） 指定`yes`您是否要為 CloudWatch Logs 日誌群組建立指標篩選條件。只有在您`yes`為 參數指定 時，此`LogToCloudWatchLogs`參數才適用。

**必要的 IAM 許可**

`AutomationAssumeRole` 參數需要下列動作才能成功使用 Runbook。
+  `ssm:StartAutomationExecution` 
+  `ssm:GetDocument` 
+  `ssm:ListDocuments` 
+  `ssm:DescribeAutomationExecutions` 
+  `ssm:DescribeAutomationStepExecutions` 
+  `ssm:GetAutomationExecution` 
+  `ssm:DescribeInstanceInformation` 
+  `ssm:ListCommandInvocations` 
+  `ssm:ListCommands` 
+  `ssm:SendCommand` 
+  `iam:CreateRole` 
+  `iam:DeleteRole` 
+  `iam:GetRolePolicy` 
+  `iam:PutRolePolicy` 
+  `iam:DeleteRolePolicy` 
+  `iam:passrole` 
+  `cloudformation:DescribeStacks` 
+  `cloudformation:DeleteStack` 
+  `cloudformation:CreateStack` 
+  `events:DeleteRule` 
+  `events:RemoveTargets` 
+  `events:PutTargets` 
+  `events:PutRule` 
+  `events:DescribeRule` 
+  `logs:DescribeLogGroups` 
+  `logs:CreateLogGroup` 
+  `logs:PutMetricFilter` 
+  `cloudwatch:PutDashboard` 
+  `elasticmapreduce:ListInstances` 
+  `elasticmapreduce:DescribeCluster` 

 **文件步驟** 
+  `aws:executeAwsApi` - 收集 `ClusterID` 參數中指定之 Amazon EMR 叢集的相關資訊。
+  `aws:branch` - 以輸入為基礎的分支。
  +  如果提供的操作是 `Run Once`或 `Schedule` ：
    +  `aws:assertAwsResourceProperty` - 驗證叢集是否可用。
    +  `aws:executeAwsApi` - 收集叢集中執行之所有執行個體IDs。
    +  `aws:assertAwsResourceProperty` - 驗證 SSM 代理程式是否在叢集中的所有執行個體上執行。
    +  `aws:branch` - 根據您是否指定執行自動化一次或排程進行分支。
      +  如果提供的操作是 `Run Once` ：
        +  `aws:branch` - 根據 `LogToCloudWatchLogs` 參數中指定的值進行分支。
          +  如果`LogToCloudWatchLogs`值為 `yes` ：
            +  `aws:executeScript` - 檢查 參數中指定名稱的 CloudWatch Logs 日誌群組是否`CloudWatchLogGroup`已存在。如果沒有，則會使用指定的名稱建立群組。
            +  `aws:branch` - 根據 `CreateMetricFilters` 參數中指定的值進行分支。
              +  如果`CreateMetricFilters`值為 `yes` ：
                +  `aws:executeAwsApi` - 每個指標篩選條件執行 12 個步驟 
                +  `aws:branch` - 根據 `CreateLogInsightsDashboard` 參數中指定的值進行分支。
                  +  如果`CreateLogInsightsDashboard`值為 `yes` ：
                    +  `aws:executeAwsApi` - 建立 CloudWatch 儀表板，如果它不存在，請使用 `CloudWatchLogGroup` 參數中指定的相同名稱。
                  +  如果`CreateLogInsightsDashboard`值為 `no` ：
                    +  `aws:runCommand` - 執行 shell 指令碼來尋找叢集中每個執行個體的日誌模式。
              +  如果`CreateMetricFilters`值為 `no` ：
                +  `aws:branch` - 根據`CreateLogInsightsDashboard`參數中指定的值進行分支。
                  +  如果`CreateLogInsightsDashboard`值為 `yes` ：
                    +  `aws:executeAwsApi` - 建立 CloudWatch 儀表板，如果它不存在，請使用 `CloudWatchLogGroup` 參數中指定的相同名稱。
                  +  如果`CreateLogInsightsDashboard`值為 `no` ：
                    +  `aws:runCommand` - 執行 shell 指令碼來尋找叢集中每個執行個體的日誌模式。
          +  如果`LogToCloudWatchLogs`值為 `no` ：
            +  `aws:executeAwsApi` - 執行 shell 指令碼來尋找叢集中每個執行個體的日誌模式。
      +  如果提供的操作是 `Schedule` ：
        +  `aws:createStack` - 建立以此 Runbook 為目標的 Amazon EventBridge 事件。
  +  如果提供的操作是 `Remove Schedule` ：
    +  `aws:executeAwsApi` - 驗證叢集是否存在排程。
    +  `aws:deleteStack` - 刪除排程。

 **輸出** 

GetClusterInformation.ClusterName

GetClusterInformation.ClusterState

ListingClusterInstances.InstanceIDs

CreatingScheduleCloudFormationStack.StackStatus

RemovingScheduleByDeletingScheduleCloudFormationStack.StackStatus

CheckIfLogGroupExists.output

FindLogPatternOnEMRNode.CommandId

# `AWSSupport-DiagnoseEMRLogsWithAthena`
<a name="awssupport-diagnose-emr-logs-with-athena"></a>

**Description** 

`AWSSupport-DiagnoseEMRLogsWithAthena` Runbook 可協助診斷使用 Amazon Athena 與 Data Catalog 整合的 Amazon EMR 日誌。 AWS Glue Amazon Athena 用於查詢容器、節點日誌或兩者的 Amazon EMR 日誌檔案，以及特定日期範圍或關鍵字搜尋的選用參數。

Runbook 可以自動擷取現有叢集的 Amazon EMR 日誌位置，也可以指定 Amazon S3 日誌位置。若要分析日誌， Runbook：
+ 建立 AWS Glue 資料庫並在 Amazon EMR Amazon S3 日誌位置上執行 Amazon Athena 資料定義語言 (DDL) 查詢，以建立叢集日誌的資料表和已知問題清單。 Amazon S3 
+ 執行資料處理語言 (DML) 查詢，以搜尋 Amazon EMR 日誌中的已知問題模式。這些查詢會傳回偵測到的問題清單、其出現計數，以及 Amazon S3 檔案路徑的相符關鍵字數量。
+ 結果會上傳至您在字首 下指定的 Amazon S3 儲存貯體`saw_diagnose_EMR_known_issues`。
+ Runbook 會傳回 Amazon Athena 查詢結果，反白顯示從預先定義子集取得的 Amazon 知識中心 (KC) 文章的調查結果、建議和參考。
+  完成或失敗時，會刪除 AWS Glue 資料庫和上傳至 Amazon S3 儲存貯體的已知問題檔案。

 **如何運作？** 

 使用 Amazon Athena `AWSSupport-DiagnoseEMRLogsWithAthena`執行 Amazon EMR 日誌的分析，以偵測錯誤並反白顯示調查結果、建議和相關的 知識中心文章。

Runbook 會執行下列步驟：
+ 使用叢集 ID 或輸入 Amazon S3 位置取得 Amazon EMR 叢集日誌位置，以擷取日誌位置和大小。
+ 根據日誌位置大小提供 Athena 成本估算。
+ 在執行 Athena 查詢並繼續執行後續步驟之前，請求指定 IAM 主體的核准，以繼續取得核准。
+ 將已知問題上傳至指定的 Amazon S3 儲存貯體，並建立 AWS Glue 資料庫和資料表。
+ 在 Amazon EMR 日誌資料上執行 Athena 查詢。查詢可以依日期範圍、關鍵字、兩個條件進行搜尋，也可以根據提供的輸入在沒有篩選條件的情況下執行。
+ 分析結果以反白顯示問題清單、建議和相關的 KC 文章。
+ Amazon Athena DML 查詢結果的輸出連結。
+ 透過移除建立的資料庫、資料表和上傳的已知問題來清除環境。

**文件類型**

 自動化

**擁有者**

Amazon

**平台**

/

AutomationAssumeRole 參數需要下列動作，才能成功使用 Runbook：
+ athena:GetQueryExecution
+ athena:StartQueryExecution
+ athena:GetPreparedStatement
+ athena:CreatePreparedStatement
+ glue:GetDatabase
+ glue:CreateDatabase
+ glue:DeleteDatabase
+ glue:CreateTable
+ glue:GetTable
+ glue:DeleteTable 
+ elasticmapreduce：DescribeCluster
+ s3:ListBucket
+ s3:GetBucketVersioning
+ s3:ListBucketVersions
+ s3:GetBucketPublicAccessBlock
+ s3:GetBucketPolicyStatus
+ s3:GetObject
+ s3:GetBucketLocation
+ pricing：GetProducts
+ pricing：GetAttributeValues
+ pricing：DescribeServices
+ pricing：ListPriceLists

**重要**  
 若要限制僅存取此自動化所需的資源，請將下列政策連接至信任 SSM 服務的 IAM 角色。將分割區、區域和帳戶取代為執行執行手冊的分割區、區域和帳戶號碼的適當值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticmapreduce:DescribeCluster",
                "glue:GetDatabase",
                "athena:GetQueryExecution",
                "athena:StartQueryExecution",
                "athena:GetPreparedStatement",
                "athena:CreatePreparedStatement",
                "s3:ListBucket",
                "s3:GetBucketVersioning",
                "s3:ListBucketVersions",
                "s3:GetBucketPublicAccessBlock",
                "s3:GetBucketPolicyStatus",
                "s3:GetObject",
                "s3:GetBucketLocation",
                "pricing:GetProducts",
                "pricing:GetAttributeValues",
                "pricing:DescribeServices",
                "pricing:ListPriceLists"
            ],
            "Resource": "*"
        },
        {
            "Sid": "RestrictPutObjects",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::*/*/results/*",
                "arn:aws:s3:::*/*/saw_diagnose_emr_known_issues/*"
            ]
        },
        {
            "Sid": "RestrictDeleteAccess",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:DeleteObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::*/*/saw_diagnose_emr_known_issues/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabase",
                "glue:CreateDatabase",
                "glue:DeleteDatabase"
            ],
            "Resource": [
                "arn:aws:glue:us-east-1:111122223333:database/saw_diagnose_emr_database_*",
                "arn:aws:glue:us-east-1:111122223333:table/saw_diagnose_emr_database_*/*",
                "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/saw_diagnose_emr_database_*/*",
                "arn:aws:glue:us-east-1:111122223333:catalog"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateTable",
                "glue:GetTable",
                "glue:DeleteTable"
            ],
            "Resource": [
                "arn:aws:glue:us-east-1:111122223333:table/saw_diagnose_emr_database_*/saw_diagnose_emr_known_issues",
                "arn:aws:glue:us-east-1:111122223333:table/saw_diagnose_emr_database_*/saw_diagnose_emr_logs_table",
                "arn:aws:glue:us-east-1:111122223333:table/saw_diagnose_emr_database_*/j_*",
                "arn:aws:glue:us-east-1:111122223333:database/saw_diagnose_emr_database_*",
                "arn:aws:glue:us-east-1:111122223333:catalog"
            ]
        }
    ]
}
```

------

 **指示** 

請依照下列步驟設定自動化：

1. 在 文件 AWS Systems Manager 下導覽 [AWSSupport-DiagnoseEMRLogsWithAthena](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-DiagnoseEMRLogsWithAthena/description)。

1. 選擇 Execute automation (執行自動化)。

1. 針對輸入參數，輸入下列項目：
   + **AutomationAssumeRole （選用）：**

     (IAM) 角色的 Amazon Resource Name AWS Identity and Access Management (ARN)，允許 Systems Manager Automation 代表您執行動作。如果未指定角色，Systems Manager Automation 會使用啟動此 Runbook 之使用者的許可。
   + **ClusterID （必要）：**

     Amazon EMR 叢集 ID。
   + **S3LogLocation （選用）：**

     Amazon S3 Amazon EMR 日誌位置。輸入路徑樣式 URL Amazon S3 位置，例如：`s3://amzn-s3-demo-bucket/myfolder/j-1K48XXXXXXHCB/`。如果 Amazon EMR 叢集已終止超過 `30` 天，請提供此參數。
   + **S3BucketName （必要）：**

      要上傳已知問題清單的 Amazon S3 儲存貯體名稱，以及 Amazon Athena 查詢的輸出。儲存貯體應[已啟用封鎖公開存取](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html)，且與 Amazon EMR 叢集位於相同的 AWS 區域和帳戶。
   + **核准者 （必要）：**

     能夠核准或拒絕動作的已 AWS 驗證主體清單。您可以使用下列任何格式來指定委託人：使用者名稱、使用者 ARN、IAM 角色 ARN 或 IAM 擔任角色 ARN。核准者的數量上限為 10。
   + **FetchNodeLogsOnly （選用）：**

      如果設定為 `true`，自動化會診斷 Amazon EMR 應用程式容器日誌。預設值為 `false`。
   + **FetchContainersLogsOnly （選用）：**

      如果設定為 `true`，自動化會診斷 Amazon EMR 容器日誌。預設值為 `false`。
   + **EndSearchDate （選用）：**

      日誌搜尋的結束日期。如果提供，自動化將專門搜尋截至指定日期為止產生的日誌，格式為 YYYY-MM-DD （例如：`2024-12-30`)。
   + **DaysToCheck （選用）：**

      `EndSearchDate` 提供 時，需要此參數來判斷從指定的 回溯搜尋日誌的天數`EndSearchDate`。最大值為 `30` 天。預設值為 `1`。
   + **SearchKeywords （選用）：**

      在日誌中搜尋的關鍵字清單，以逗號分隔。關鍵字不能包含單引號或雙引號。  
![\[Input parameters form for AWS Systems Manager Automation with various fields and options.\]](http://docs.aws.amazon.com/zh_tw/systems-manager-automation-runbooks/latest/userguide/images/awssupport-diagnose-emr-logs-with-athena_input_parameters.png)

1. 選取**執行**。

1. 自動化會啟動。

1. 文件會執行下列步驟：
   + **getLogLocation：**

     透過查詢指定的 Amazon EMR 叢集 ID 來擷取 Amazon S3 日誌位置。如果自動化無法從 Amazon EMR 叢集 ID 查詢日誌位置，則 Runbook 會使用 `S3LogLocation`輸入參數。
   + **branchOnValidLog：**

     驗證 Amazon EMR 日誌位置。如果位置有效，請繼續預估在 Amazon EMR 日誌上執行查詢時 Amazon Athena 的潛在成本。
   + **estimateAthenaCosts：**

     決定 Amazon EMR 日誌的大小，並提供在日誌資料集上執行 Athena 掃描的成本估算。對於非商業區域 （非AWS 分割區），此步驟只會提供日誌大小，而不會估算成本。您可以使用指定區域中的 Athena 定價文件來計算成本。
   + **approveAutomation：**

     等待指定的 IAM 主體核准，以繼續執行自動化的後續步驟。核准通知包含 Amazon EMR 日誌上 Amazon Athena 掃描的預估成本，以及自動化佈建之資源的詳細資訊。
   + **uploadKnownIssuesExecuteAthenaQueries：**

     將預先定義的已知問題上傳至 `S3BucketName` 參數中指定的 Amazon S3 儲存貯體。建立 AWS Glue 資料庫和資料表。根據輸入參數在 AWS Glue 資料庫中執行 Amazon Athena 查詢。
   + **getQueryExecutionStatus：**

     等到 Amazon Athena 查詢執行處於 `SUCCEEDED` 狀態。Amazon Athena DML 查詢會搜尋 Amazon EMR 叢集日誌中的錯誤和例外狀況。
   + **analyzeAthenaResults：**

     分析 Amazon Athena 結果，以提供源自預先定義映射集的調查結果、建議和知識中心 (KC) 文章。
   + **getAnalyzeResultsQuery1ExecutionStatus：**

     等待查詢執行處於 `SUCCEEDED` 狀態。Amazon Athena DML 查詢會分析先前 DML 查詢的結果。此分析查詢將傳回與解析和 KC 文章相符的例外狀況
   + **getAnalyzeResultsQuery2ExecutionStatus：**

     等待查詢執行處於 `SUCCEEDED` 狀態。Amazon Athena DML 查詢會分析先前 DML 查詢的結果。此分析查詢將傳回每個 Amazon S3 日誌路徑中偵測到的例外狀況/錯誤清單。
   + **printAthenaQueriesMessage：**

     列印 Amazon Athena DML 查詢結果的連結。
   + **cleanupResources：**

     刪除建立的 AWS Glue 資料庫並刪除在 Amazon EMR 日誌儲存貯體中建立的已知問題檔案，以清除資源。

1. 完成後，請檢閱輸出區段以取得執行的詳細結果：

   **輸出為 Athena 查詢結果提供三個連結：**
   + 在 Amazon EMR 叢集日誌中找到的所有錯誤和經常發生的例外狀況清單，以及對應的日誌位置 (Amazon S3 字首）。
   + Amazon EMR 日誌中符合的唯一已知例外狀況摘要，以及有助於故障診斷的建議解決方案和 KC 文章。
   + Amazon S3 日誌路徑中出現特定錯誤和例外狀況的詳細資訊，以支援進一步診斷。  
![\[Output section showing query links for exception summaries and analysis in AWS logs.\]](http://docs.aws.amazon.com/zh_tw/systems-manager-automation-runbooks/latest/userguide/images/awssupport-diagnose-emr-logs-with-athena_outputs.png)

 **參考** 

Systems Manager Automation
+ [執行此自動化 （主控台）](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-DiagnoseEMRLogsWithAthena/description)
+ [執行自動化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-working-executing.html)
+ [設定 自動化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-setup.html)
+ [支援自動化工作流程登陸頁面](https://aws.amazon.com/premiumsupport/technology/saw/)

AWS 服務文件
+ 如需詳細資訊，請參閱[疑難排解 Amazon EMR 叢集](https://docs.aws.amazon.com//emr/latest/ManagementGuide/emr-troubleshoot.html) 