获取所有Apache Spark执行程序日志
问题描述:
我想以编程方式收集Spark应用程序驱动程序中的所有执行程序日志。 (当某些事情失败时,我想收集并存储所有相关日志。)有没有一种很好的方法可以做到这一点?获取所有Apache Spark执行程序日志
其中一个想法是为每个执行程序创建一个具有一个分区的空RDD。然后我以某种方式确保每个分区实际上在不同的执行器上处理(不知道如何),并执行一个从磁盘加载执行器日志的mapPartitions
,然后collect
将它们提取到应用程序。
答
也许有更好的办法,但我们使用脚本来执行同步日志,以每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]
谢谢,这是一个很好的解决方案!现在我们大多运行在YARN上,而YARN为日志文件提供了一些处理。虽然我还没有完全想到如何配置它,但它也解决了我们的许多问题。 –