Spark Streaming SlidDuration&BatchDuration

134 阅读1分钟

此文章旨在记录学习源码的过程,欢迎私信交流。

spark streaming任务的产生是由JobGenerator定时产生的。

// 可以看到,这定时的时间是ssc.graph.batchDuration.milliseconds
  private val timer = new RecurringTimer(clock, ssc.graph.batchDuration.milliseconds,
    longTime => eventLoop.post(GenerateJobs(new Time(longTime))), "JobGenerator")

如果我们的代码是这样写的,那么底层会把3秒设给ssc.graph.batchDuration

val ssc = new StreamingContext(sparkConf, Seconds(3))

当没有使用窗口函数的时候,我们的任务就是3秒产生一个。


当使用窗口函数时,以window为例:

val socket8888 = ssc.socketTextStream("node04", 8888)
socket8888.window(Seconds(9), Seconds(6))

代码中的window用法意思是每6秒计算过去9秒的数据。这时候启动程序,看看ui

看到job(Spark Streaming的job和Spark Core的job不是一回事儿)已经是6秒产生一个了。


看看window里面做了啥。

DStream和RDD类似也是有继承关系的。我这个代码window后面做的是print,挖源码看看。print底层还是调用了foreachRDD,那么很清晰输出流是ForEachDStream

马上谜题就揭开了,为啥我设置的批是3s,现在是6s

看看isTimeValid做了啥

结合我程序的日志看看,其实看源码的技巧有一个就是看日志,从日志反推定位源码。

END