本期内容 :
- Spark Streaming中的空RDD处理
- Spark Streaming程序的停止
由于Spark Streaming的每个BatchDuration都会不断的产生RDD,空RDD有很大概率的,如何进行处理将影响其运行的效率、资源的有效使用。
Spark Streaming会不断的接收数据,在不清楚接收的数据处理到什么状态,如果你强制停止掉的话,会涉及到数据不完整操作或者一致性相关问题。
一、 Spark Streaming中的空RDD处理 :
ForEachRDD是产生Dstreams真正的Action操作的核心的方法(算子)。
数据写入数据库期间,当RDD为空时,如果也进行ForEachPartition及写数据库操作,或者数据保存在HDFS上等操作,此时虽然并没有做什么事情,也需要获取计算资源。
如何最大化的节约资源与提高效率呢?在处理之前增加判断:
都是上面对数据进行判断的方法还是不够理想,因为count操作会启动Job进行操作,还是会浪费资源,我们进行梳理以下方法:
如果在有若干个Partitions ,但是Partition的内容是空的话,take就可能启动Job :
假如没有数据的情况下会如何处理 :
数据为空时的操作 :
从上面可以观察到,会生成RDD ,但是RDD里面没有Partition ,没有数据的时候不会生成Block ,但是会生成RDD,不过里面一个Partition都没有而已。
有Partition但是如果没有BlockID也是不会执行的 :
总结:
其实也可以不生成RDD ,是因为需要维持一个概念,每个BachDuration都会产生一个Job,Job如果没有RDD的话就无法产生;
在每个时间间隔都会产生Job,如果提交的时候都没有Job,你的Action作用于什么呢,从表面上看不产生RDD有效率;
但是在调度层面的依赖是每个BatchDuration产生的Job,调度层面要判断是否有RDD,没有RDD作业将无法执行。
二、 Spark Streaming程序的停止 :
一般情况下Spark Streaming是采用什么方式停止呢?
以上的停止方式会把这个Streams停止掉,但是不会等待所有的数据处理完成默认情况下SparkContext也会被停止掉。
使用StopGraceFully方式处理 :
应用程序启动的时候会调用 StopOnShutdown ,会把回调传进去。
如果提示数据没有处理完成就被停止掉了:
总结:使用 StopGraceFully 所有接收的数据都会被处理完成,才会停止。