Spark Streaming基礎概念介紹

五柳-先生發表於2016-01-29

有很多文章講解storm與spark streaming的區別,都非常詳細。

本文就介紹一下spark streaming比較重要的概念

一、術語介紹:

  • 離散流(discretized stream)或DStream:這是Spark Streaming對內部持續的實時資料流的抽象描述,即我們處理的一個實時資料流,在Spark Streaming中對應於一個DStream 例項。
  • 批資料(batch data):這是化整為零的第一步,將實時流資料以時間片為單位進行分批,將流處理轉化為時間片資料的批處理。隨著持續時間的推移,這些處理結果就形成了對應的結果資料流了。
  • 時間片或批處理時間間隔( batch interval):這是人為地對流資料進行定量的標準,以時間片作為我們拆分流資料的依據。一個時間片的資料對應一個RDD例項。
  • 視窗長度(window length):一個視窗覆蓋的流資料的時間長度。必須是批處理時間間隔的倍數,
  • 滑動時間間隔:前一個視窗到後一個視窗所經過的時間長度。必須是批處理時間間隔的倍數,預設同批處理時間間隔
  • Input DStream :一個input DStream是一個特殊的DStream,將Spark Streaming連線到一個外部資料來源來讀取資料。
二、特點
  • Storm可以實現亞秒級時延的處理,而每次只處理一條event,而Spark Streaming可以在一個短暫的時間視窗裡面處理多條(batches)Event。所以說Storm可以實現亞秒級時延的處理,而Spark Streaming則有一定的時延。
  • 在Storm中,每條記錄在系統的移動過程中都需要被標記跟蹤,所以Storm只能保證每條記錄最少被處理一次(Trident代價很大)。storm可以由一個spout和多個blot組成,每個bolt處理不同的業務邏輯,只有在成功處理spout和所有bolt之後才認為這條tuple處理成功,否則失敗。這樣就有可能導致一些bolt處理成功,一些bolt處理失敗的時候。當處理失敗的tuple重新處理時,之前成功處理的bolt又被處理了一次,在一些業務場景中有可能導致錯誤。而Spark streaming底層依賴spark core,每個批處理資料都是一個RDD。這個原始的RDD經過一系列的轉換,最終由action觸發執行。如果某個分割槽處理失敗,這個partition會被標記為失敗。對於輸入源資料,會自動地持久化在記憶體中供後續操作使用,並複製到不同的節點以保證容錯。
  • spark streaming會將接收到的資料全部儲存於內部的記憶體區域中,所以需要設定合理的spark.cleaner.ttl來及時清理超時無用資料。這個引數需要小心設定以免後續操作中所需資料被超時而錯誤清理。更合適的方式是將spark.streaming.unpersist設定為true,使系統自動清理不需要使用的RDD。
三、節點失效
1、工作節點失效:由於輸入資料在hdfs或者有備份資料,每次轉換結果都是一致的,因此總會得到相同的結果。而對於輸出而言,只能確保“至少處理一次”。
2、驅動節點失效:如果driver掛掉了,那streamingContext就消失了。通過ssc.checkpoint<dir>設定記錄點,週期性的將DStream元資訊寫入HDFS。一旦失效,就能恢復出來。通過呼叫函式streamingContext.getOrCreate來開啟這個特性。注意,如果程式重新編譯了,那就必須重建streamingContext,否則就可能讀取時反序列化失敗。在驅動節點失效的情況下,standalone模式下可以自動恢復,而其他模式需要依賴其它機制。
轉載: http://blog.csdn.net/yueqian_zhu/article/details/48788037

具體實現原理見 spark streaming原始碼分析

相關文章