此文章旨在记录学习源码的过程,欢迎私信交流。
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

看看window
里面做了啥。

window
后面做的是print
,挖源码看看。print
底层还是调用了foreachRDD
,那么很清晰输出流是ForEachDStream

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

isTimeValid
做了啥

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

END