如何处理EMR上Spark Structured Streaming应用日志持续增长问题
解决Spark Structured Streaming事件日志持续增长的方案
问题背景
我们运行多个7*24小时持续运行的Spark Structured Streaming应用,启用spark.eventLog.enabled=true后,HDFS中/var/log/spark/apps路径下的.inprogress事件日志文件持续增大,磁盘使用率不断攀升:
[hadoop@ip-xxx-xxx-x-xxx ~]$ hdfs dfs -du -h /var/log/spark/apps 10.6 G 10.8 G /var/log/spark/apps/application_1815393722510_0026_1.inprogress 12.1 G 12.3 G /var/log/spark/apps/application_1815393722510_0028_1.inprogress 9.3 G 9.4 G /var/log/spark/apps/application_1815393722510_0029_1.inprogress 9.9 G 10 G /var/log/spark/apps/application_1815393722510_0030_1.inprogress 5.0 G 5.1 G /var/log/spark/apps/application_1815393722510_0031_1.inprogress 768.0 M 896 M /var/log/spark/apps/application_1815393722510_0065_1.inprogress [hadoop@ip-xxx-xxx-x-xxx ~]$
核心解决方案
1. 配置事件日志滚动策略
针对长期运行的Streaming应用,开启日志滚动避免单个.inprogress文件无限增大:
- 添加以下配置到
spark-defaults.conf,或提交应用时通过--conf指定:
两个滚动条件满足任意一个即触发新文件生成,可根据业务需求调整数值。# 按文件大小滚动,达到10GB时生成新文件 spark.eventLog.rolling.maxFileSize=10g # 按时间间隔滚动,每24小时生成新文件 spark.eventLog.rolling.interval=1d # 启用滚动日志功能 spark.eventLog.rolling.enabled=true
2. 配置事件日志自动清理策略
让Spark自动清理过期日志,无需手动维护:
- 开启清理并设置保留规则:
注意:该功能依赖HDFS文件修改时间,需确保集群时间同步,清理任务会随Spark History Server启动自动运行。# 启用事件日志清理 spark.eventLog.cleanup.enabled=true # 设置日志保留天数,示例为7天 spark.eventLog.cleanup.daysToRetain=7 # 清理任务执行间隔,默认每天一次 spark.eventLog.cleanup.interval=1d
3. Structured Streaming专属优化
针对流式应用的特性,减少不必要的日志输出:
- 降低事件日志详细程度:
# 仅记录WARN及以上级别的关键事件,减少日志体积 spark.eventLog.logLevel=WARN - 禁用非必要的事件跟踪(按需选择):
# 若不需要块管理器相关监控,可关闭对应事件日志 spark.eventLog.blockManagerEvents.enabled=false
4. 临时手动清理方案
若需立即释放磁盘空间,可手动清理已完成的日志文件(请勿删除正在运行的.inprogress文件):
- 清理7天前的非
.inprogress日志文件:hdfs dfs -find /var/log/spark/apps -type f ! -name "*.inprogress" -mtime +7 -delete
验证要点
配置完成后重启Spark应用和Spark History Server,观察:
- 新生成的
.inprogress文件会按滚动策略分割为多个文件 - 过期日志会被自动清理
- HDFS磁盘使用率不再持续攀升
内容的提问来源于stack exchange,提问作者bheem singh
相关产品推荐
相关产品推荐

