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 所有接收的數據都會被處理完成,才會停止。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM