2015-05-14 21 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为日志文件提供了一些处理。虽然我还没有完全想到如何配置它,但它也解决了我们的许多问题。 –

相关问题