Spark Standalone模式下如何聚合指定应用的Executor日志?
Spark Standalone模式下聚合指定应用日志的方法
当然可以实现类似YARN的日志聚合效果,Spark Standalone本身没有内置的统一日志查询命令,但可以通过以下几种方式快速聚合指定application-id的所有Executor日志:
1. 直接用Shell命令聚合
利用Linux/Unix的文件操作命令,一次性将目标应用目录下所有Executor的stderr和stdout日志合并到一个文件中:
方法一:通配符直接拼接
cat /apache-spark/3.5.0/libexec/work/app-20231003110238-0000/*/{stderr,stdout} > app-20231003110238-0000-all.log
方法二:find命令灵活匹配
如果目录结构更复杂,或者需要过滤特定日志文件,用find命令更可靠:
find /apache-spark/3.5.0/libexec/work/app-20231003110238-0000 -type f \( -name "stderr" -o -name "stdout" \) -exec cat {} + > app-all-logs.log
2. 通过Spark Standalone UI查看/下载日志
访问Spark Master节点的UI(默认端口8080),找到目标应用的详情页面:
- 在"Executors"列表中,每个Executor条目右侧有"Logs"链接,点击可在线查看该Executor的
stderr和stdout - 日志页面提供"Download"按钮,可以单独下载每个Executor的日志文件,之后自行合并
3. 封装脚本简化操作
将上述Shell命令封装成可复用的脚本,避免每次手动输入路径:
#!/bin/bash # 脚本功能:聚合指定Spark Standalone应用的所有Executor日志 if [ $# -ne 1 ]; then echo "用法: $0 <application-id>" exit 1 fi APP_ID=$1 BASE_LOG_DIR="/apache-spark/3.5.0/libexec/work" TARGET_DIR="${BASE_LOG_DIR}/${APP_ID}" OUTPUT_FILE="${APP_ID}-combined-logs.log" if [ ! -d "${TARGET_DIR}" ]; then echo "错误:找不到应用目录 ${TARGET_DIR}" exit 1 fi find "${TARGET_DIR}" -type f \( -name "stderr" -o -name "stdout" \) -exec cat {} + > "${OUTPUT_FILE}" echo "日志聚合完成,已保存到 ${OUTPUT_FILE}"
保存为aggregate-spark-standalone-logs.sh,添加执行权限后即可使用:
chmod +x aggregate-spark-standalone-logs.sh ./aggregate-spark-standalone-logs.sh app-20231003110238-0000
内容的提问来源于stack exchange,提问作者cpawali
相关产品推荐
相关产品推荐

