要完整去学习spark源码是一件很是不容易的事情,可是咱能够聚沙成塔嘛~那么,Spark Streaming是怎么搞的呢?缓存
本质上,SparkStreaming接收实时输入数据流并将它们按批次划分,而后交给Spark引擎处理生成按照批次划分的结果流:oop
SparkStreaming提供了表示连续数据流的、高度抽象的被称为离散流的Dstream,可使用kafka、Flume和Kiness这些数据源的输入数据流建立Dstream,也能够在其余Dstream上使用map、reduce、join、window等操做建立Dsteram。Dstream本质上呢,是表示RDD的序列。源码分析
Spark Streaming首先将数据切分为必定时间范围(Duration)的数据集,而后积累一批(Batch)Duration数据集后单独启动一个任务线程处理。Spark核心提供的从DAG从新调度任务和并行执行,可以快速完成数据从故障中恢复的工做。学习
那么下来就从SparkStreaming 的StreamingContext初始化开始:spa
StreamingContext传入的参数:一、SparkContext也就是说Spark Streaming的最终处理实际是交给SparkContext。二、Checkpoint:检查点.三、Duration:设定streaming每一个批次的积累时间。固然,也能够不用设置检查点。线程
Dstream是Spark Streaming中全部数据流的抽象,这里对抽象类Dstream定义的一些主要方法:对象
一、dependencies:Dstream依赖的父级Dstream列表。blog
二、comput(validTime:Time):指定时间生成一个RDD。接口
三、isInitialized:Dstream是否已经初始化。事件
四、persist(level:StorageLevel):使用指定的存储级别持久化Dstream的RDD。
五、persist:存储到内存
六、cache:缓存到内存,与persisit方法同样。
(这里详细说下cache与persist的不一样点:cache只有一个默认的缓存级别MEMORY_ONLY ,而persist能够根据状况设置其它的缓存级别。)
七、checkpoint(interval:Duration):设置Dstream及祖宗Dstream的DstreamGraph;
八、getOrCompute(time:Time):从缓存generatedRDDs = new HashMap[Time,RDD[T]]中获取RDD,若是缓存不存在,则生成RDD并持久化、设置检查点放入缓存。
九、generateJob(time:Time):给指定的Time对象生成Job.
十、window(windowDuration:Duration):基于原有的Dstream,返回一个包含了全部在时间滑动窗口中可见元素的新的Dstream.
......
Dsteam本质上是表示连续的一些列的RDD,Dstream中的每一个RDD包含了必定间隔的数据,任何对Dstream的操做都会转化为底层RDD的操做。在Spark Streaming中,Dstream提供的接口与RDD提供的接口很是类似。构建完ReciverInputDStream后,会调用各类Dstream的接口方法,对Dstream进行各类转换,最后各个Dstream之间的依赖关系就造成了一张DStream Graph:
整个流程所涉及的组件为:
一、Reciever:Spark Streaming内置的输入流接收器或用户自定义的接收器,用于从数据源接收源源不断的数据流。
二、currentBuffer:用于缓存输入流接收器接收的数据流。
三、blockIntervalTimer:一个定时器,用于将CurrentBuffer中缓存的数据流封装为Block后放入blocksForPushing。
四、blockForPushing:用于缓存将要使用的Block。
五、blockPushingThread:此线程每隔100毫秒从blocksForPushing中取出一个Block存入存储体系,并缓存到ReceivedBlockQueue。
六、Block Batch:Block批次,按照批次时间间隔,从RecievedBlockQueue中获取一批Block。
七、JobGenerator:Job生成器,用于给每一批Blcok生成一个Job。
下来继续回到StreamingContext,在StreamingContext中new了一个JobScheduler,它里面创了EventLoop,对这个名字是否是很熟悉?没错,就是在Netty通讯交互时建立的对象,主要用于处理JobSchedular的事件。而后启动StrreamingListenerBus,用于更新Spark UI中的StreamTab的内容。 那么最重要的就是下来建立ReceiverTracker,它用于处理数据接收、数据缓存、Block生成等工做。最后启动JobGenerator,负责对DstreamGraph的初始化、Dstream与RDD的转换、生成JOB、提交执行等工做。
曾经是用ReciverTrackerActor接收来自Reciver的消息,包括RegisterReceiver、AddBlock、ReportError、DeregisterReceiver等,如今再也不使用Akka进行通讯,而是使用RPC。
回到launchReceivers,调用了SparkContext的makeRDD方法,将全部Receiver封装为ParallelCollectionRDD,并行度是receivers的数量,makeRDD方法实际调用了parallelize:
今天到此为止。。明天再来会你这磨人的小妖精,玩别的去啦~~~
参考文献:《深刻理解Spark:核心思想与源码分析》