Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考

Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考 -
http://www.jianshu.com/p/dff0dbf0ced0

一:Receiver启动的方式设想

1.Spark Streaming通过Receiver持续不断的从外部数据源接收数据,并把数据汇报给Driver端,由此每个Batch Durations就可以根据汇报的数据生成不同的Job,在不同的机器之上启动,每个reveiver 相当于一个分片,由于Sapark core 感觉不到它的特殊性,按普通的调度,即有可能在同一个Executor之中启动多个Receiver,这种情况之下导致负载不均匀或者由于Executor运行本身的故障,task 有可能启动失败,整个job启动就失败,即receiver启动失败。

启动Receiver

  1. 从Spark Core的角度来看,Receiver的启动Spark Core并不知道, Receiver是通过Job的方式启动的,运行在Executor之上的,由task运行。

  2. 一般情况下,只有一个Receiver,但是可以创建不同的数据来源的InputDStream.

3.启动Receiver的时候,实其上一个receiver就是一个partition分片,由一个Job启动,这个Job里面有RDD的transformations操作和action的操作,随着定时器触发,不断的产生有数据接收,每个时间段中产生的接收数据实其上就是一个partition分片,

  1. 以上设计思想产生的如下问题:

(1)如果有多个InputDStream,那就要启动多个Receiver,每个Receiver也就相当于分片partition,那我启动Receiver的时候理想的情况下是在不同的机器上启动Receiver,但是SparkCore的角度来看就是应用程序,感觉不到Receiver的特殊性,所以就会按照正常的Job启动的方式来处理,极有可能在一个Executor上启动多个Receiver.这样的话就可能导致负载不均衡。(2)有可能启动Receiver失败,只要集群存在,Receiver就不应该启动失败。

(3)从运行过程中看,一个Reveiver就是一个partition的话,启动的由一个Task,如果Task启动失败,相应的Receiver也会失败。由此,可以得出,对于Receiver失败的话,后果是非常严重的,那么在SparkStreaming如何防止这些事的呢?Spark Streaming源码分析,在Spark Streaming之中就指定如下信息:

一是Spark使用一个Job启动一个Receiver.最大程度的保证了负载均衡。

二是Spark Streaming已经指定每个Receiver运行在那些Executor上,在Receiver运行之前就指定了运行的地方!

三是 如果Receiver启动失败,此时并不是Job失败,在内部会重新启动Receiver.

在StreamingContext的start方法被调用的时候,JobScheduler的start

文/阳光男孩spark(作者)
原文链接:http://www.jianshu.com/p/dff0dbf0ced0
著作权归作者所有,转载请联系作者获得授权,并标注“作者”。

你可能感兴趣的:(Spark Streaming源码解读之Receiver生成全生命周期彻底研究和思考)