Spark Stream点滴

~spark stream的工作原理是接收实时输入数据流生成表示RDD序列的Dstream,由spark引擎处理生成按批次的结果流。

~Dstream也提供类似RDD的各种算子,实际上在Dsream上的算子也会传递给起内部的一系列RDD。

DStream 中 有一个HashMap[Time,RDD[T]]类型的对象 generatedRDDs,其中Key为作业开始时间,RDD为该DStream对应的RDD

~Dstream的类型保护InputDstream,TransformedDstream,OutputDstream,其中OutputStream的操作触发job的执行。

~spark stream的流接收器是通过SparkContext.makeRdd方法把receivers集合作为一个RDD[Receiver]进行分区,这样receiver就随着RDD一样分布在各个executor上。这是由Spark Streaming框架完成调度过程而不是Spark内核框架。这样做的目的就是为了避免Spark内核将Receiver当做普通的job而将多个Receiver调度到同一个节点上,例如spark stream+kafka的策略应该是为每个kafka分区分配一个receiver(待验证)

~spark stream v storm:

spark stream使用场景更多,流计算,大数据批处理,sql查询,图计算,机器学习等,storm只适合实时性要求很高的流计算。spark stream因为是批处理,其吞吐量大,容错性也高。

~Driver端的ReceiverTracker管理所有Executor上的Receiver任务,他有一个ReceiverTrakerEndpoint 消息通讯体,这个消息通讯体在startReceiver方法中提交Receiver的job在具体Executor上运行,并接受Executor端发送过来的消息(比如注册Receiver),在Executor端有一个ReceiverSupervisor专门管理Receiver,负责Receiver的注册启动与ReceiverTracker的信息交互

~spark stream大概工作原理

》根据策略为输入源创建多个接收器receiver,所有receiver由driver上的ReceiverTracker跟踪管理,

并以RDD的形式通过Spark Stream框架分布在多个executor上。

》receiver接收数据源的数据,一边保存数据至各个executor上的block块上,一边像ReceiverTracker汇报已保存的数据块。

》spark streaming在driver端根据时间段将数据块生成RDD序列并以Dstream形式展示,由outputDstream触发job,并生成DAG,生成Task序列化后传至至各个executor执行。

~spark stream receiver的接收流程,如下图所示

》Receiver将接收的流数据存入BlockGenerator的currentBuffer中

》BlockGenerator中的定时器recurring timer以时间间隔将数据封装为Block,存入BlockGenerator额blocksForPush队列中

》BlockGenerator中的blockPushingThread将blocksForPush队列中的数据通过BlockManager存入各个executor中的block中,同时把相应的blockID等元数据返回给Driver层ReceiverTrack


 

猜你喜欢

转载自qgl.iteye.com/blog/2317256
今日推荐