赞
踩
相信有不少小伙伴在使用spark streaming做微批次处理的时候有过疑问,就是我设置了Duration然后启动任务,那么我的批次任务每次会在啥时候启动呢?相信对于Duration设置比较小的同学来说并不会关心在什么时候执行,但是对于Duration设置比较大或者对数据延时、资源敏感的同学来说,可能就需要知道我的任务到底会在什么时候出发执行,话不多说,我们直接看源码
进入GitHub找到spark源码,链接spark streaming任务调度时间
private[streaming]
object Interval {
def currentInterval(duration: Duration): Interval = {
val time = new Time(System.currentTimeMillis)
val intervalBegin = time.floor(duration)
new Interval(intervalBegin, intervalBegin + duration)
}
}
def floor(that: Duration): Time = {
val t = that.milliseconds
new Time((this.millis / t) * t)
}
def floor(that: Duration, zeroTime: Time): Time = {
val t = that.milliseconds
new Time(((this.millis - zeroTime.milliseconds) / t) * t + zeroTime.milliseconds)
}
通过上面两段scala代码可以看到,每个批次的开始时间是拿当前时间戳除以代码设置的Duration取整得到,也就是说,设置5分钟Duration,那么触发时间就会在05分、10分、15分、20分…这样,想要调整触发时间可以调用第二个函数设置zeroTime实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。