

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

# Amazon EMR on EC2 – 使用自訂指標和日誌透過 CloudWatch 增強監控
<a name="enhanced-custom-metrics"></a>

## 概觀
<a name="enhanced-custom-metrics-overview"></a>

Amazon EMR 提供功能強大、經濟實惠的大數據處理功能。若要將效能和資源使用率最大化，有效監控至關重要。Amazon CloudWatch 為 EMR 叢集提供全面的可觀測性，讓您能夠即時追蹤指標和日誌。本文件概述如何：

1. 設定 CloudWatch 代理程式將 EC2 日誌上的 EMR 傳送至 CloudWatch

1. 透過分類新增自訂 Hadoop、YARN 和 HBase 指標

1. 透過內建儀表板監控指標

1. 透過 CloudWatch 日誌群組追蹤叢集日誌

## 先決條件和背景
<a name="enhanced-custom-metrics-prerequisites"></a>

根據預設，Amazon EMR 會每五分鐘將基本指標傳送至 CloudWatch，無需額外費用。使用 EMR 7.0\$1 版，您可以將 CloudWatch 代理程式部署到：
+ 每隔一分鐘收集 34 個額外的詳細指標 （需支付額外費用）
+ 從所有叢集節點收集指標
+ 在傳送至 CloudWatch 之前，彙總主節點上的資料
+ 透過 EMR 主控台的監控索引標籤或 CloudWatch 主控台存取指標

EMR 7.1 擴展了這些功能，可讓您設定代理程式，以從 Hadoop、YARN 和 HBase 元件擷取特殊指標。對於使用 Prometheus 的環境，指標可以轉送到 Amazon Managed Service for Prometheus。

## 日誌的 CloudWatch 代理程式組態
<a name="enhanced-custom-metrics-agent-config"></a>

若要在 CloudWatch 中擷取 EMR 日誌，請建立 *cloudwatch-config.json* 檔案來定義要收集的日誌檔案：

**cloudwatch-config.json**

```
{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          { 
            "file_path": "/mnt/var/log/hadoop-yarn/hadoop-yarn-resourcemanager-*",
            "log_group_name": "/emr/yarn/resourcemnger",
            "log_stream_name": "{instance_id}",
            "publish_multi_logs" : true
          },
          { 
            "file_path": "/var/log/hadoop-hdfs/hadoop-hdfs-namenode-*",
            "log_group_name": "/emr/hdfs/namenode",
            "log_stream_name": "{instance_id}",
            "publish_multi_logs" : true
          }
        ]
      }
    }
}
```

## CloudWatch 代理程式組態的引導指令碼
<a name="enhanced-custom-metrics-bootstrap-script"></a>

若要將自訂 CloudWatch 組態套用至 EMR 節點，請建立引導指令碼，以使用您的設定重新啟動 CloudWatch 代理程式。此指令碼可確保代理程式在叢集佈建後使用您的特定日誌集合參數執行。

### 建立引導指令碼
<a name="enhanced-custom-metrics-create-bootstrap"></a>

使用下列內容建立名為 *cloudwatch-agent-bootstrap.sh* 的檔案：

```
#!/bin/bash
set -xe

EMR_SECONDARY_BA_SCRIPT=$(cat <<'EOF'
while true; do
NODEPROVISIONSTATE=$(sed -n '/localInstance [{]/,/[}]/ {/nodeProvisionCheckinRecord [{]/,/[}]/ {/status:/ p}}' /emr/instance-controller/lib/info/job-flow-state.txt | awk '{ print $2 }')

if [ "$NODEPROVISIONSTATE" == "SUCCESSFUL" ]; then
sleep 10
echo "Running my post provision bootstrap"
NODETYPE=$(cat /mnt/var/lib/instance-controller/extraInstanceData.json | jq -r '.instanceRole' | awk '{print tolower($0)}')

# Copy config file on the instance
sudo aws s3 cp s3://amzn-s3-demo-bucket1/cloudwatch-config.json /opt/aws/amazon-cloudwatch-agent/etc/stdout_log_config.json

# Start the agent with the created config file
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a append-config -c file:/opt/aws/amazon-cloudwatch-agent/etc/stdout_log_config.json

# Restart CW Agent
sudo systemctl restart amazon-cloudwatch-agent

# Status CW Agent
echo "Status CW Agent"
sudo /usr/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

exit
fi

sleep 10
done
EOF
)

echo "${EMR_SECONDARY_BA_SCRIPT}" | tee -a /tmp/emr-secondary-ba.sh
chmod u+x /tmp/emr-secondary-ba.sh
/tmp/emr-secondary-ba.sh > /tmp/emr-secondary-ba.log 2>&1 &
exit 0
```

將範例儲存貯體取代為您的儲存貯體名稱。

### 重要組態備註
<a name="enhanced-custom-metrics-configuration-note"></a>

**重要**  
上傳指令碼之前，請將 取代**<amzn-s3-demo-bucket1>**為您儲存上一個步驟 *cloudwatch-config.json* 檔案的 S3 儲存貯體實際名稱。這可確保引導指令碼可以在叢集初始化期間擷取您的組態檔案。

此引導指令碼將：
+ 等待節點佈建完成
+ 下載您的自訂 CloudWatch 組態
+ 停止任何執行中的 CloudWatch 代理程式
+ 使用特定組態重新啟動代理程式
+ 記錄客服人員的狀態以進行故障診斷

## Hadoop、YARN 和 HBase 的自訂指標分類
<a name="enhanced-custom-metrics-custom-metric-classifications"></a>

除了預設 CloudWatch 指標之外，您還可以透過為 EMR 叢集元件設定自訂應用程式特定的指標來增強監控功能。Amazon EMR 的組態 API 提供靈活的方式來定義您要收集的指標。

### 設定自訂指標
<a name="enhanced-custom-metrics-configuring-custom-metrics"></a>

您可以透過兩種方式實作自訂指標集合：
+ 在建立新叢集的叢集期間
+ 透過 EMR 主控台重新設定現有叢集

### 建立分類檔案
<a name="enhanced-custom-metrics-creating-classification-file"></a>

分類檔案定義應從您的叢集收集哪些特定元件指標。以下是收集自訂 Hadoop 指標的範例結構：

```
[
  {
    "Classification": "emr-metrics",
    "Configurations": [
      {
        "Classification": "emr-hadoop-hdfs-datanode-metrics",
        "Properties": {
          "Hadoop:service=DataNode,name=DataNodeActivity-*": "DatanodeNetworkErrors,TotalReadTime,TotalWriteTime,BytesRead,BytesWritten,RemoteBytesRead,RemoteBytesWritten,ReadBlockOpNumOps,ReadBlockOpAvgTime,WriteBlockOpNumOps,WriteBlockOpAvgTime",
          "otel.metric.export.interval": "30000"
        }
      },
      {
        "Classification": "emr-hadoop-yarn-nodemanager-metrics",
        "Properties": {
          "Hadoop:service=NodeManager,name=JvmMetrics": "MemNonHeapUsedM,MemNonHeapCommittedM,MemNonHeapMaxM,MemHeapUsedM,MemHeapCommittedM,MemHeapMaxM,MemMaxM",
          "Hadoop:service=NodeManager,name=NodeManagerMetrics": "ContainerCpuUtilization,NodeCpuUtilization,ContainersCompleted,ContainersFailed,ContainersKilled,ContainersLaunched,ContainersRolledBackOnFailure,ContainersRunning,ContainerUsedMemGB,ContainerUsedVMemGB,ContainerLaunchDurationNumOps,ContainerLaunchDurationAvgTime",
          "otel.metric.export.interval": "20000"
        }
      }
    ],
    "Properties": {}
  }
]
```

### 實作步驟
<a name="enhanced-custom-metrics-implementation-steps"></a>

1. 使用所需的指標分類建立 JSON 檔案。

1. 根據您的監控需求自訂指標。

1. 儲存檔案並上傳至您的 S3 儲存貯體。

1. 建立新叢集或重新設定現有叢集時，請參考此檔案。

### 最佳實務
<a name="enhanced-custom-metrics-best-practices"></a>
+ 僅收集為您的工作負載提供有意義的洞見的指標。
+ 根據您的監控需求考慮指標收集間隔。
+ 檢閱 AWS 文件以取得每個元件可用指標的完整清單。
+ 在相同分類中將相關指標分組，以獲得更好的組織。

此方法可讓您將監控重點放在特定 EMR 應用程式的最重要指標上，讓您更深入了解叢集效能。

## 使用 CloudWatch 整合部署 EMR 叢集
<a name="enhanced-custom-metrics-emr-cloudwatch-deployment"></a>

請依照下列步驟建立 Amazon EMR 叢集，自動將日誌和自訂指標傳送至 CloudWatch：

### 步驟 1：啟用 CloudWatch 代理程式
<a name="enhanced-custom-metrics-enable-cloudwatch-agent"></a>

透過 AWS 管理主控台建立 EMR 叢集時：

1. 在叢集建立期間導覽至**應用程式**區段。

1. 選取主要應用程式的核取方塊 (Hadoop、Spark 等）。

1. 捲動以尋找並選取 **Amazon CloudWatch Agent** 選項。

1. 這可在叢集上啟用 代理程式，這對於收集增強型指標和日誌至關重要。

CloudWatch Agent 將安裝在叢集中的所有節點上，允許它以設定的間隔收集系統和應用程式指標。

![\[應用程式套件\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/metrics_name_applications.png)


**注意**  
CloudWatch Agent 可在 EMR 7.0 版及更新版本中使用。本指南所述的自訂指標收集和日誌轉送需要啟用此元件。

### 步驟 2：新增日誌收集的引導操作
<a name="enhanced-custom-metrics-add-bootstrap-action"></a>

若要設定 CloudWatch 代理程式以收集特定日誌檔案並將其轉送至 CloudWatch：

1. 在 EMR 叢集建立精靈中，導覽至**引導操作**區段

1. 按一下**新增引導操作**

1. 從下拉式選單中選取**自訂動作** 

1. 為您的引導操作提供名稱 （例如，**設定 CloudWatch Agent**)

1. 在**指令碼位置**欄位中，輸入 cloudwatch-agent-bootstrap.sh 指令碼的 S3 路徑 （例如 s3：//your-bucket-name/cloudwatch-agent-bootstrap.sh)

1. 按一下**新增**以儲存引導操作

此引導操作將在叢集啟動期間執行，確保 CloudWatchagent 已正確設定您的自訂設定，以收集和轉送組態檔案中指定的日誌檔案。

佈建節點後，代理程式會自動開始收集日誌，透過 CloudWatch Logs 提供近乎即時的叢集操作可見性。

![\[引導操作\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/metrics_bootstrap_actions.png)


### 步驟 3：設定自訂指標集合
<a name="enhanced-custom-metrics-configure-custom"></a>

若要啟用超過預設設定的自訂 Hadoop、YARN 或 HBase 指標集合：

1. 在 EMR 叢集建立精靈中**，導覽至組態**區段。

1. 按一下**編輯組態**按鈕以展開組態選項。

1. 從組態方法下拉式清單中選取**從 Amazon S3 載入 JSON** 選項。

1. 輸入自訂指標分類檔案的 S3 URI 路徑 （例如 s3：//amzn-s3-demo-bucket1/emr-metrics-classification.json)。

1. 按一下**載入**以剖析組態。

1. 確認組態正確顯示在主控台界面中。

1. 按一下**儲存變更**，將這些指標組態套用至您的叢集。

此步驟會指示 CloudWatch 代理程式收集分類檔案中定義的特定元件指標。這些指標將依您組態中指定的間隔收集，並發佈至 CloudWatch，以便視覺化和分析。

自訂指標可讓您更深入了解叢集的效能特性，以便更精確地監控和疑難排解 EMR 應用程式。

![\[軟體設定\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/metrics_software_setting.png)


### 更新執行中叢集的指標組態
<a name="enhanced-custom-metrics-update-configuration"></a>

您可以依照下列步驟修改現有 EMR 叢集的指標集合設定，而不會中斷操作：

1. 在 AWS 管理主控台中導覽至作用中的 EMR 叢集。

1. 在叢集詳細資訊檢視中選取**組態**索引標籤。

1. 尋找**執行個體群組組態**區段。

1. 按一下**重新設定**按鈕來修改設定。

1. 選擇**從 Amazon S3 載入 JSON** 或直接編輯組態。

1. 輸入更新後的指標分類檔案位置，或在編輯器中進行變更。

1. 套用變更以更新指標收集行為。

此重新設定功能可讓您隨著工作負載需求的變化，微調監控方法。CloudWatch 代理程式會自動適應新組態，收集更新的指標集，而不需要叢集重新啟動或停機。

**重要**  
組態變更可能需要幾分鐘的時間才能傳播到叢集中的所有節點。繼續監控您的 CloudWatch 儀表板，以確認新指標如預期顯示。

![\[Configurations tab showing 叢集 and instance group settings with options to view JSON and reconfigure.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/metrics_cluster_config.png)


## 驗證您的 CloudWatch 整合
<a name="enhanced-custom-metrics-validating-cloudwatch"></a>

完成組態步驟後，是時候驗證您的監控設定是否正常運作了：

### 步驟 1：部署 EMR 叢集
<a name="enhanced-custom-metrics-deploy-emr-cluster"></a>

1. 檢閱所有組態設定的準確性。

1. 確保正確參考引導操作和分類檔案。

1. 按一下**建立叢集**以啟動 EMR 環境。

1. 等待叢集達到**執行**中狀態 （通常為 5-15 分鐘）。

### 步驟 2：執行測試應用程式
<a name="enhanced-custom-metrics-execute-test"></a>

提交數個測試 Spark 應用程式來產生有意義的指標：
+ 執行處理範例資料的簡易 Spark 任務。
+ 執行長時間執行的分析任務，以觀察資源使用率。
+ 測試不同的應用程式組態，以比較效能指標。

應用程式完成後 （或執行時）：
+ 導覽至 CloudWatch 主控台。
+ 檢查您設定的日誌群組是否有應用程式日誌。
+ 檢查指標儀表板，以觀察 CPU、記憶體和應用程式特定的指標。
+ 確認分類檔案中定義的自訂指標出現在 CloudWatch 中。

此驗證程序會確認您的 CloudWatch 整合正確擷取日誌和指標，讓您全面了解 EMR 叢集的效能和應用程式行為。

## 在 CloudWatch Log Groups 中存取 EMR Logs
<a name="enhanced-custom-metrics-accessing-emr-logs"></a>

在您的 EMR 叢集執行並正確設定 CloudWatch 代理程式後，您的應用程式和系統日誌將可在 CloudWatch Logs 中使用。請依照下列步驟存取和分析它們：

### 檢視您的日誌群組
<a name="enhanced-custom-metrics-viewing-log-groups"></a>

1. 導覽至 AWS 管理主控台中的 CloudWatch 主控台。

1. 從左側導覽窗格中選取**日誌群組**。

1. 尋找您的組態建立的日誌群組，例如：
   + /emr/yarn/resourcemnger for YARN ResourceManager 日誌。
   + /emr/hdfs/namenode for HDFS NameNode 日誌。
   + 組態檔案中指定的任何其他日誌群組。

每個日誌群組都包含依執行個體 ID 整理的日誌串流，可讓您將日誌追蹤到叢集中的特定節點。

### 使用日誌資料
<a name="enhanced-custom-metrics-working-with-log-data"></a>
+ *搜尋日誌資料：*使用 CloudWatch Logs Insights 跨日誌群組執行結構化查詢。
+ *建立指標：*從日誌模式擷取指標，以建立自訂 CloudWatch 指標。
+ *設定警示：*根據特定錯誤模式或日誌頻率設定警示。
+ *匯出日誌：*下載日誌以進行離線分析或封存。

### 日誌保留
<a name="enhanced-custom-metrics-log-retention"></a>

**注意**  
根據預設，日誌會保留 30 天。如果需要用於合規或分析目的，您可以修改每個日誌群組的保留政策，以將日誌保留更長的時間。

CloudWatch Logs 為您的所有 EMR 日誌資料提供集中的位置，無需 SSH 到個別叢集節點來排除問題或分析應用程式行為。

## 在 EMR 監控儀表板中檢視自訂指標
<a name="viewing-custom-metrics"></a>

使用 CloudWatch 代理程式和自訂指標組態執行 EMR 叢集之後，您可以直接在 EMR 主控台輕鬆監控這些指標：

### 存取您的自訂指標
<a name="accessing-custom-metrics"></a>

1. 在 AWS 管理主控台中導覽至 EMR 叢集。

1. 在叢集詳細資訊頁面中選取**監控**索引標籤。

1. 在監控儀表板頂端附近找到**篩選條件指標分類**下拉式清單。

1. 使用此篩選條件來選取特定指標類別：
   + 選擇 **HDFS** 以檢視 NameNode 和 DataNode 指標。
   + 選取 **YARN** 以查看 ResourceManager 和容器指標。
   + 為 **HBase** 特定的效能資料挑選 HBase。
   + 選取您定義的自訂指標分類。

儀表板會動態更新，以顯示所選指標的圖表，顯示一段時間內的效能趨勢。

### 使用指標視覺化
<a name="working-with-metric-visualizations"></a>
+ *調整時間範圍：*變更時間範圍以檢視最近的活動或歷史趨勢。
+ *比較指標：*side-by-side顯示多個相關指標以進行相互關聯分析。
+ *縮放功能：*專注於出現異常或模式的特定時段。
+ *重新整理資料：*近乎即時地使用最新的指標資料更新視覺效果。

這種整合式監控方法可讓您在統一的儀表板中追蹤標準 EMR 指標和自訂指標，讓您更輕鬆地識別效能問題、資源限制或應用程式瓶頸，而無需離開 EMR 主控台。

![\[EMR 叢集 monitoring dashboard showing CloudWatch metrics and filter options.\]](http://docs.aws.amazon.com/zh_tw/emr/latest/ManagementGuide/images/metrics_cloudwatch_metrics.png)
