Spark发行笔记7 SparkStreaming JobScheduler

来源:互联网 发布:java 创建临时文件夹 编辑:程序博客网 时间:2024/05/21 15:07

感谢DT大数据梦工厂支持提供技术支持,DT大数据梦工厂专注于Spark发行版定制。

本期概览:

1 SparkStreaming JobScheduler深入解析

 2 SparkStreaming JobScheduler源码解析

话不多说,先上图,感谢IMF成员提供图片技术支持,图片如下图所示:


JobScheduler的地位非常的重要,所有的关键都在JobScheduler,它的重要性就相当于是Spark Core当中的DAGScheduler,因此,我们要花重点在JobScheduler上面。

以如下代码为例

我们先进入foreachRDD方法源码中,如下图所示


额外再次说明:DStream是逻辑级别的,RDD是物理级别的。正如DStream是空间维度的层面,空间维度加上时间构成时空维度。

更简单形象的理解可以这样理解:比如你有一个计划,计划是那个空间维度,随着时间的推移,你的计划一步一步的实现,从而慢慢形成空间维度。而DStream是那个空间维度,RDD则是那个时空维度。

分析foreachRDD源码可知:遍历RDD,这些RDD构成了依赖关系。再次强调:DStream是逻辑级别的,RDD是物理级别的。



补充说明:下图中StreamingContext类中的如下线程的创建是和conf.setMaster[6]指定的6个线程是完全没有关系的,下图的线程是从调度层面去创建的,如下图:


总结:当自己写spark代码的时候,可以复用spark官方的工具类ThreadUtils,所以所阅读熟悉ThreadUtils的内部工具方法,对于重写spark源代码和二次开发,甚至做spark的发行版的时候,可以借鉴ThreadUtils的重写和复用。


紧接着:实例化ReceiverTracker和EventLoop(注释说这里的俩个对象是scherduler.start()方法执行之后才创建的)

这里说明任务调度和作业执行分开,代码可维护行很好

总结:我们发现,真正的Job的产生是通过DStream通过new ForeachDStream产生ForeachDStream对象,然后调用对象的generateJob产生,然后再通过jobGenerator调用Job物化,

(DStream子类中,只有ForEachDStream重写了generateJobs)

job生成5大步骤,经典的如下图所示


job提交过程,注意服务器时间不能改,改的话,时间维度混乱了,但是spark有相应的机制


此处可以改变streaming的并发度,这也是一个性能调优的技巧。

spark.streaming.concurrentJobs,可以用在同时多个Job并发运行,多个输出。或者说不同的batch,要并行运行的话,也可以通过spark.streaming.concurrentJobs并发运行。

0 0
原创粉丝点击