跳至內容

如何存取 Amazon EMR 叢集的 Spark 驅動程式日誌?

2 分的閱讀內容
0

我想要存取 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) 執行個體,然後搜尋警告和錯誤。

請完成下列步驟:

  1. 執行以下同步命令來下載步驟日誌:

    aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/steps/s-2M809TD67U2IA/ s-2M809TD67U2IA/
  2. 執行以下命令,以開啟步驟日誌資料夾:

    cd s-2M809TD67U2IA/
  3. 執行以下命令,以解壓縮日誌檔案:

    find . -type f -exec gunzip filename\;

    注意:filename 替換為您檔案的名稱。

  4. 執行以下命令,以從叢集模式日誌中取得 YARN 應用程式 ID:

    grep "Client: Application report for" * | tail -n 1
  5. 執行以下命令,以尋找用戶端模式日誌中的錯誤和警告:

    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 應用程式報告。

若要取得驅動程式日誌,請完成以下步驟:

  1. 從用戶端日誌取得應用程式 ID。
    使用 application_1572839353552_0008 應用程式 ID 的範例輸出。

    19/11/04 05:24:42 INFO Client: Application report for application_1572839353552_0008 (state: ACCEPTED)
  2. 識別應用程式主容器日誌。
    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

  3. 執行以下同步命令,將應用程式主容器日誌下載到執行個體:

    aws s3 sync s3://aws-logs-111111111111-us-east-1/elasticmapreduce/j-35PUYZBQVIJNM/containers/application_1572839353552_0008/ application_1572839353552_0008/
  4. 執行以下命令,以開啟 Spark 應用程式日誌資料夾:

    cd application_1572839353552_0008/
  5. 執行以下命令,以解壓縮日誌檔案:

    find . -type f -exec gunzip {} \;
  6. 執行以下命令,以搜尋所有容器日誌以尋找錯誤和警告:

    egrep -Ril "ERROR|WARN" . | xargs egrep "WARN|ERROR"
  7. 執行以下命令,以取得應用程式主容器執行所在節點的位址。在正在執行的叢集上,您可以使用 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
  8. 對於以叢集模式提交的 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 替換為您的節點位址。

相關資訊

對 Amazon EMR 叢集問題進行疑難排解

設定 Spark

AWS 官方已更新 9 個月前