可以存取 Amazon EMR 叢集的 Spark 驅動程式日誌嗎?

2 分的閱讀內容
0

我想對 Apache Spark 應用程式進行疑難排解。如何存取 Amazon EMR 叢集的 Spark 驅動程式日誌?

簡短描述

在 Amazon EMR ,Spark 會以 YARN 應用程式的形式執行,並支援兩種部署模式:

  • 用戶端模式: 這是預設的部署模式。在用戶端模式,Spark 驅動程式會在執行 spark-submit 命令的主機執行。
  • 叢集模式: Spark 驅動程式會在應用程式主容器執行。應用程式主容器是 Spark 工作執行時執行的第一個容器。

解決方法

用戶端模式工作

當您在主節點使用 --deploy-mode client 執行 spark-submit 來提交 Spark 應用程式時,驅動程式日誌會在終端視窗顯示。Amazon EMR 預設不會封存這些日誌。若要擷取日誌,請將 spark-submit 命令的輸出儲存至檔案。範例:

$ spark-submit [--deploy-mode client] ... 1>output.log 2>error.log

當使用 Amazon EMR 步驟提交 Spark 應用程式時,驅動程式日誌會封存至 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 的日誌檔案

將步驟日誌下載至 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 {} \;

4.    從叢集模式日誌取得 YARN 應用程式 ID:

grep "Client: Application report for" * | tail -n 1

5.    在用戶端模式日誌尋找錯誤和警告:

egrep "WARN|ERROR" *

也可以使用如 JupyterHub、Apache Livy 或 Apache Zeppelin 等應用程式提交 Spark 應用程式。這些應用程式會變成將 Spark 應用程式提交至叢集的用戶端。在此案例,驅動程式日誌儲存於對應的應用程式日誌 (位於主節點的 /mnt/var/log/ 資料夾)。您也可以在以下 Amazon S3 路徑找到壓縮的日誌:

s3://awsexamplebucket/JOBFLOW_ID/node/MASTER_ID/applications/

例如,如果您使用 Zeppelin,您可以在 /mnt/var/log/zeppelin/zeppelin-interpreter-spark-xxxxxxxxxx.log 找到 Spark 驅動程式日誌。

注意: 如果是 Jupyter,驅動程式日誌儲存於 Livy 日誌:/mnt/var/log/livy/livy-livy-server.out

如需存取應用程式特定日誌的詳細資訊,請參閱檢視封存至 Amazon S3 的日誌檔

叢集模式工作

當在叢集模式提交 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 應用程式日誌的範例清單。在此清單,container_1572839353552_0008_01_000001 是第一個容器,表示它是應用程式主容器。

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

3.    將應用程式主容器日誌下載至 EC2 執行個體:

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 應用程式容器日誌。對於在叢集模式下提交的 Spark 應用程式,您可以提取如下所示的應用程式主容器日誌,來存取 Spark 驅動程式日誌:

# 1. Get the address of the node that the application master container ran on
$ 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-xxx-xx-xx-xx.us-west-2.compute.internal/xxx.xx.xx.xx:8032
Container: container_1585844683621_0001_01_000001 on ip-xxx-xx-xx-xx.us-west-2.compute.internal_8041

# 2. Use the node address to pull the container logs
$ yarn logs -applicationId application_1585844683621_0001 -containerId container_1585844683621_0001_01_000001 -nodeAddress ip-xxx-xx-xx-xx.us-west-2.compute.internal

相關資訊

疑難排解叢集

設定 Spark

AWS 官方
AWS 官方已更新 2 年前