SparkStreaming(源码阅读十二)

  要完整去学习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:核心思想与源码分析》

相关文章
相关标签/搜索