Spark Streaming中空RDD处理及流处理程序优雅的停止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark Streaming中空RDD处理及流处理程序优雅的停止相关的知识,希望对你有一定的参考价值。

本期内容 :

  • 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 所有接收的数据都会被处理完成,才会停止。

 

 

  备注:

    • 资料来源于:王家林(Spark发行版本定制)
    • 新浪微博:http://www.weibo.com/ilovepains

 

以上是关于Spark Streaming中空RDD处理及流处理程序优雅的停止的主要内容,如果未能解决你的问题,请参考以下文章

(版本定制)第18课:Spark Streaming中空RDD处理及流处理程序优雅的停止

流式计算助力实时数据处理spark-streaming入门实战

Spark版本定制八:Spark Streaming源码解读之RDD生成全生命周期彻底研究和思考

仅在处理完我的 RDD 中的所有分区后,如何在 Spark Streaming 中接收输入?

Spark Streaming vs. Structured Streaming

深入理解spark streaming