我想以编程方式收集Spark应用程序驱动程序中的所有执行程序日志。 (当出现故障时我想收集并存储所有相关日志。)有一种很好的方法吗?
一个想法是创建一个空的RDD,每个执行程序有一个分区。然后我以某种方式确保每个分区实际上在不同的执行器上处理(不知道如何)并执行mapPartitions
我从磁盘加载执行程序日志,然后collect
将它们提取到应用
答案 0 :(得分:4)
也许有更好的方法,但我们使用脚本每5秒将执行程序日志同步到S3
#!/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 &
我们在引导操作中启动脚本(存储在名为sync-executor-logs.sh的文件中的S3上)
--bootstrap-actions Path=s3://path/to/my/script/sync-executor-logs.sh,Name=Sync-executor-logs,Args=[-l,s3://path/to/logfiles]