可以存取 Amazon EMR 叢集的 Spark 驅動程式日誌嗎?
我想對 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
相關資訊
相關內容
- 已提問 2 個月前lg...
- 已提問 2 個月前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前