背景
相信经常使用 Spark 的同学肯定知道 Spark 支持将作业的 event log 保存到持久化设备。默认这个功能是关闭的,不过我们可以通过 spark.eventLog.enabled 参数来启用这个功能,并且通过 spark.eventLog.dir 参数来指定 event log 保存的地方,可以是本地目录或者 HDFS 上的目录,不过一般我们都会将它设置成 HDFS 上的一个目录。
但是这个功能有个问题,就是这个 Spark Job 运行的过程中产生的所有 event log 都是写到单个文件中,这就导致了 event log 文件的大小和这个 Spark Job 的并行度、复杂度以及运行的时间有很大关系。如果我们是运行 Spark Streaming 作业,这个问题特别明显,我们经常看到某个 Spark Streaming 作业的 event log 达到几十 GB 大小!我们没办法清理或者删除一些不需要的事件日志,当我们使用 Spark 历史服务器打开这个几十 GB 大小的 event log,打开速度可想而知。
Spark 3.0 终于支持 event logs 滚动了 如果想及时了解Spark、Hadoop或者HBase相关的文章,欢迎关注微信公众号:iteblog_hadoop 如果大家经常使用 Log4j 的话,Log4j 提供了一个 RollingFileAppender,可以使长时间运行应用的日志按照时间或者日志文件大小进行切割,从而达到限制单个日志文件的大小。Spark 的 event log 为什么不可以提供类似功能呢?值得高兴的是,即将发布的 Spark 3.0 为我们带来了这个功能(具体参见 SPARK-28594)。当然,对待 Spark 的 event log 不能像其他普通应用程序的日志那样,简单切割,然后删除很早之前的日志,而需要保证 Spark 的历史服务器能够解析已经 Roll 出来的日志,并且在 Spark UI 中展示出来,以便我们进行一些查错、调优等。
如何使用
事件日志滚动
首先必须使用 Spark 3.0,同时将 spark.eventLog.rolling.enabled 设置为 true(默认是 false)。那么 Spark 在 writeEvent 的时候会判断当前在写的 event log 文件大小加上现在新来的事件日志大小总和是否大于 spark.eventLog.rolling.maxFi