2015-05-14 19 views
5

我想以編程方式收集Spark應用程序驅動程序中的所有執行程序日誌。 (當某些事情失敗時,我想收集並存儲所有相關日誌。)有沒有一種很好的方法可以做到這一點?獲取所有Apache Spark執行程序日誌

其中一個想法是爲每個執行程序創建一個具有一個分區的空RDD。然後我以某種方式確保每個分區實際上在不同的執行器上處理(不知道如何),並執行一個從磁盤加載執行器日誌的mapPartitions,然後collect將它們提取到應用程序。

回答

3

也許有更好的辦法,但我們使用腳本來執行同步日誌,以每5秒

#!/bin/sh 
# This scripts syncs executor log files to S3. 

while [[ $# > 1 ]]; do 
    key="$1" 
    case $key in 
    -l|--log-uri) 
     LOG_BUCKET="$2" 
     shift 
     ;; 
    *) 
     echo "Unknown option: ${key}" 
     exit 1; 
    esac 
    shift 
done 

set -u 

JOB_FLOW_ID=$(cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | sed -e 's,.*"\(j-.*\)".*,\1,g') 

# Start background process that syncs every 5 seconds. 
while true; do aws s3 sync /home/hadoop/spark/work ${LOG_BUCKET}/${JOB_FLOW_ID}/executors/`hostname`/; sleep 5; done & 

我們啓動腳本(存儲在S3在同步executor-文件名爲S3 logs.sh)在自舉動作

--bootstrap-actions Path=s3://path/to/my/script/sync-executor-logs.sh,Name=Sync-executor-logs,Args=[-l,s3://path/to/logfiles] 
+0

謝謝,這是一個很好的解決方案!現在我們大多運行在YARN上,而YARN爲日誌文件提供了一些處理。雖然我還沒有完全想到如何配置它,但它也解決了我們的許多問題。 –

相關問題