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