第4课:Spark Streaming的Exactly-One的事务处理和不重复输出完全掌握

今天早上的课 主要是讲解在 Spark Streaming 中怎么进行 事务处理安全

 

Exactly Once 的事務處理
1) 數據零掉失,必需有可靠的數據來源和可靠的 Receiver, 且整個應用程序的 metadata 必需進行 checkpoint, 且通過 WAL 來保証數據的安全性。
2) Spark Streaming 1.3 的時候為了免 WAL 的性能損失和實現 Exactly Once 而提供了 Kafka Direct API, 把 Kafka 做為文件存儲系統,此時兼具备流的優勢和文件系統的優勢,至此,Spark Streaming + Kafka 就構成完美的世界。全部的 Executor 通過 kafka API 直接消費數據。直接管理 Offset 才不會重複消費數據。

第一,數據不用copy 副本。
第二,不须要進行 WAL 備份,不會作成没必要要的性能損耗。性能

 

第三, Kafka 的比HDFS 高效不少,因為他內存中採用 memory copy 的方式。大数据

 

數據掉失及其具體的解決方式spa

 

1) 在 Receiver 收到數據且通過 Driver 的調度 Executor 開始計算數據的時候,若是 Driver 忽然崩潰,到此 Executor 會被 Kill 掉,那麼 Executor 中的數據就會掉失,此時就必需通過 e.g. WAL的方式,讓全部的數據都會通過例如 HDFS 的方式首先進行安全性容錯處理,此時若是 Executor 中的數據掉失話就能够通過 WAL 恢復過來orm

 

據重複讀取的情況事务

 

在 Receiver 收到數據並且保存到了 HDFS 等持久化引擊可是沒有來得及進行 updateOffsets, 此時 Receiver 崩潰後从新啟動就會通過管理 Kafka 的 ZooKeeper 中元數據,可是此時 Spark Streaming 認為是成功的,但Kafka 認為是失敗的,因為沒有更新 (updateOffsets 到 Zookeeper 中)。此時導致數據重複消費的情況。kafka

 

性能損失:
1) 通過WAL的方式進行會極大的損傷 Spark Streaming 中 Receiver 接收數據的性能。spark

 

2) 若是通過 Kafka 做為數據來源的話, Kafka中有數據, 然後Receiver接收的時候又會有數據副本,這個數據其實的存儲資源的浪費。io

 

 

關於Spark Streaming 數據輸出屡次重寫及其解決方案:
1) 為什麼會有這個問題,因為 Spark Streaming 在計算的時候會基於 Spark Core, Spark Core 天生會作如下事情會導致 Spark Streaming 的結果(部份)重複輸出。task 重試,慢任務推測,stage 重複,job 重測。

具體解決方案:
設置 spark.task.maxFailure 次數為 1
設置 spark.speculation 為關閉狀態(因為慢任務推測其實很是消耗性能,因此關閉後能够顥著提升 Spark Streaming 處理性能。form

Spark Streaming on Kafka 的話,Job 失敗後能够設置 auto.offset.reset 為 largest 的方式; 

 

最後再次強調 能够通過 transform 和 foreachRDD 基於業務邏輯控制來實現數據不重複消費 和輸出不重複!這兩個方法類似於 Spark Streaming 的後門,能够作任意想象的控制操做

 

 

 

 

 

Thanks for reading

Janice

——————————————————————————————–
Reference: DT大数据梦工厂SPARK版本定制課程 – 第4课:Spark Streaming的Exactly-One的事务处理和不重复输出完全掌握

相关文章
相关标签/搜索