如何存取 Amazon EMR 叢集的 Spark 驅動程式日誌?
我想要存取 Amazon EMR 叢集上的 Apache Spark 驅動程式日誌,並對 Spark 應用程式進行疑難排解。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
在 Amazon EMR ,Spark 會以 YARN 應用程式的形式執行,並支援用戶端和叢集部署模式。
用戶端模式工作
用戶端模式是預設部署模式。在用戶端模式下,Spark 驅動程式會在執行 spark-submit 命令的主機上執行。當您在主節點上執行具有 --deploy-mode 用戶端的 spark-submit 命令時,您會在終端視窗中收到驅動程式日誌。Amazon EMR 預設不會封存這些日誌。若要擷取日誌,請將 spark-submit 命令的輸出儲存至檔案。
命令範例:
spark-submit [--deploy-mode client] ... 1>output.log 2>error.log
當您使用 Amazon EMR 步驟提交 Spark 應用程式時,Amazon EMR 會將驅動程式日誌封存至 Amazon Simple Storage Service (Amazon S3) 中的 stderr.gz 檔案中。檔案路徑看起來類似於以下內容:
s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/stderr.gz
如需詳細資訊,請參閱檢視封存至 Amazon S3 的日誌檔案。
若要存取 Spark 驅動程式日誌,請將步驟日誌下載至 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,然後搜尋警告和錯誤。
請完成下列步驟:
-
執行以下同步命令來下載步驟日誌:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/ -
執行以下命令,以開啟步驟日誌資料夾:
cd s-2M809TD67U2IA/ -
執行以下命令,以解壓縮日誌檔案:
find . -type f -exec gunzip filename\;注意: 將 filename 替換為您檔案的名稱。
-
執行以下命令,以從叢集模式日誌中取得 YARN 應用程式 ID:
grep "Client: Application report for" * | tail -n 1 -
執行以下命令,以尋找用戶端模式日誌中的錯誤和警告:
egrep "WARN|ERROR" *
您也可以使用應用程式 (例如 JupyterHub、Apache Livy 或 Apache Zeppelin) 作為用戶端,將 Spark 應用程式提交到叢集。應用程式會將驅動程式日誌儲存在主節點 /mnt/var/log/ 資料夾中的應用程式日誌中。
您也可以在 s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/ Amazon S3 路徑中找到壓縮日誌。
如果您使用 Zeppelin,那麼您可以在 /mnt/var/log/zeppelin/zeppelin-interpreter-spark-##########.log 中找到 Spark 驅動程式日誌。
對於 Jupyter,您可以在 /mnt/var/log/livy/livy-livy-server.out Livy 日誌中找到驅動程式日誌。
叢集模式工作
當你以叢集模式提交 Spark 應用程式時,驅動程式程序會在應用程式主容器中執行。應用程式主容器是當 Spark 應用程式執行時,第一個執行的容器。用戶端會記錄 YARN 應用程式報告。
若要取得驅動程式日誌,請完成以下步驟:
-
從用戶端日誌取得應用程式 ID。
使用 application_1572839353552_0008 應用程式 ID 的範例輸出。19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED) -
識別應用程式主容器日誌。
Spark 應用程式日誌清單範例:`s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stderr.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000001/stdout.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stderr.gz` `s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/container_1572839353552_0008_01_000002/stdout.gz`**注意:**清單中的第一個容器始終是主容器。在上面的清單中,主容器是 container_1572839353552_0008_01_000001。
-
執行以下同步命令,將應用程式主容器日誌下載到執行個體:
aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/ -
執行以下命令,以開啟 Spark 應用程式日誌資料夾:
cd application_1572839353552_0008/ -
執行以下命令,以解壓縮日誌檔案:
find . -type f -exec gunzip {} \; -
執行以下命令,以搜尋所有容器日誌以尋找錯誤和警告:
egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR" -
執行以下命令,以取得應用程式主容器執行所在節點的位址。在正在執行的叢集上,您可以使用 YARN CLI 取得 YARN 應用程式容器日誌:
yarn logs -applicationId application_1585844683621_0001 | grep 'Container: container_1585844683621_0001_01_000001'預期輸出:
20/04/02 19:15:09 INFO client.RMProxy: Connecting to ResourceManager at ip-###-##-##-##.us-west-2.compute.internal/###.##.##.##:8032 Container: container_1585844683621_0001_01_000001 on ip-###-##-##-##.us-west-2.compute.internal_8041 -
對於以叢集模式提交的 Spark 應用程序,請執行以下命令來提取應用程式主容器日誌:
yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-###-##-##-##.us-west-2.compute.internal**注意:**將 applicationId 替換為您的應用程式的 ID,將 containerId 替換為您的容器 ID,並將 nodeAddress ip 替換為您的節點位址。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 2 年前