前言
Spark如何持久化event
SHS启动参数
SHS工作流程
DiskCache
读取eventlog
参考
前言
这篇文章会overall的介绍一下Spark History Server和event log是如何一起工作的。Spark History Server(以下简称SHS)是一个用来debug 你的Spark applications的非常有用的工具,我相信熟悉Spark的对它都并不陌生。SHS是根据通过持久化application的运行过程中的所有events,通常是将定义的event写到一个HDFS的文件,这个文件就叫做event log。注意这个log和运行时产生的stdout/stderr不是一个概念的log。
Spark如何持久化event
SHS并不是负责做event的持久化的,而是你的application在running的时候完成了event持久化。当你提交Spark job的时候,必须通过配置来启动event log并且指定你的log path是SHS读取的event log的path,这样你的job才会被SHS找到。
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenode/shared/spark-logs
那么Spark会记录哪些event呢?我们先来看下SparkListenerEvent, 这是所有event的基类(当然Spark streaming的event没有直接继承SparkListenerEvent)。所有继承了这个类,并且没有把logEvent设置为false的event,都会被EventLoggingListener的logEvent函数以Json的形式写到了event log中,一行为一个event。
@DeveloperApi
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "Event")
trait SparkListenerEvent {
/* Whether output this event to the event log */
protected[spark] def logEvent: Boolean = true
}
举个例子,在EventLoggingListener中,当收到SparkListenerStageSubmitted事件时,会执行onStageSubmitted函数,该函数调用了logEvent,将SparkListenerStageSubmitted转为Json并写入到event log中。
/** Log the event as JSON. */
private def logEven