Spark日志过大导致磁盘溢出问题解决方案

一 问题背景

平台近期出现多次spark任务日志文件将磁盘打满,导致平台异常报警和任务失败的情况,这些任务包括Spark-Streaming任务和普通Spark任务。产生该问题的原因主要是:

Spark-Streaming任务运行时间比较长,Executor和Driver进程产生的Spark系统日志数量很大;业务用户在应用代码中使用System.out.print等输出了大量的调试信息(曾有任务运行40分钟打满100G日志文件)。以上信息全部输出在Yarn Container日志路径下的stdoutstderr里面,而Yarn本身没有对这些文件大小做限制,导致文件无限增长,最终将磁盘打满。

二 解决方案
2.1 解决思路

针对该问题,Spark官网给出了解决方案:

spark-yarn-log.png

在此基础上,结合实际情况,制定以下方案:

  • spark yarn contanier(包括executor和driver进程)单独使用一套日志机制,采用Rolling模式滚动删除,保留最新的5G日志数据:单个日志文件最大1G,最多保留5个,开启滚动删除。
  • 业务用户在应用代码输出的调试信息重定向至log4j日志中,限制单个文件大小并应用滚动删除机制。
2.2 实施方案
  • 自定义log4j.properties配置文件,限制文件大小,开启滚动删除。
  • 将该文件放置在$SPARK_HOME/conf/yarn-container-log4j-conf文件夹下面,与$SPARK_HOME/conf/log4j.properties区分。
  • spark-defaults.conf中通过spark.yarn.dist.files配置该文件,实现任务提交时上传,并下发供Executor和Driver进程使用。
  • 增加输出信息重定向日志功能,使业务输出的调试信息重定向至log4j配置的指定日志文件。
  • ApplicationMasterCoarseGrainedExecutorBackend主进程中嵌入重定向函数,实现Driver进程和Executor进程业务调试信息由管道输出转变成日志输出。
  • 同时,针对spark2.0以上版本,社区版本源码中Logging类为内部类,内部版本将Logging类更改为公共类,供业务调用,可替代System.out输出方式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值