12 Spark Streaming原始碼解讀之Executor容錯安全性
要篇內容介紹Executor的容錯,容錯方式有WAL、訊息重放、其他
- 首先介紹WAL的方法,就是儲存資料前,先把資料寫日誌。從ReceiverSupervisorImpl的pushAndReportBlock的方法開始看,程式碼如下
def pushAndReportBlock(
receivedBlock: ReceivedBlock,
metadataOption: Option[Any],
blockIdOption: Option[StreamBlockId]
) {
val blockId = blockIdOption.getOrElse(nextBlockId)
val time = System.currentTimeMillis
val blockStoreResult = receivedBlockHandler.storeBlock(blockId, receivedBlock)
logDebug(s"Pushed block $blockId in ${(System.currentTimeMillis - time)} ms")
val numRecords = blockStoreResult.numRecords
val blockInfo = ReceivedBlockInfo(streamId, numRecords, metadataOption, blockStoreResult)
trackerEndpoint.askWithRetry[Boolean](AddBlock(blockInfo))
logDebug(s"Reported block $blockId")
}
呼叫receivedBlockHandler的storeBlock方法,receivedBlockHandler決定了採用哪種方式來儲存資料,程式碼如下
private val receivedBlockHandler: ReceivedBlockHandler = {
if (WriteAheadLogUtils.enableReceiverLog(env.conf)) {
if (checkpointDirOption.isEmpty) {
throw new SparkException(
"Cannot enable receiver write-ahead log without checkpoint directory set. " +
"Please use streamingContext.checkpoint() to set the checkpoint directory. " +
"See documentation for more details.")
}
new WriteAheadLogBasedBlockHandler(env.blockManager, receiver.streamId,
receiver.storageLevel, env.conf, hadoopConf, checkpointDirOption.get)
} else {
new BlockManagerBasedBlockHandler(env.blockManager, receiver.storageLevel)
}
}
如果開啟WAL的方式,會將資料儲存到checkpoint目錄,如果checkpoint目錄沒有配置,就丟擲異常。
先看WriteAheadLogBasedBlockHandler,開啟WAL後,採用BlockManager儲存資料時就不需要複本了,否則和WAL同時做容錯就是重複性工作,降低了系統的效能。
再看BlockManagerBasedBlockHandler,就是將資料交給BlockManager儲存,根據使用者定義的儲存級別來儲存,系統一般預設儲存級別為MEMORY_AND_DISK_SER_2,如果對資料安全性要求不高也可以不要複本。
- 訊息重放就是一種非常高效的方式,採用kafka的Direct API介面讀取資料時首先計算offset的位置,如果job異常,根據消費的offset位置重新指定kafka的offset,從失敗的位置讀取。kafka直接做為檔案儲存系統,就像hdfs一樣,具體怎麼使用以後的章節還會介紹。
相關文章
- Spark Streaming 的容錯機制Spark
- spark streaming原始碼分析1 StreamingContextSpark原始碼GCContext
- spark streaming原始碼分析4 DStream相關APISpark原始碼API
- Java併發程式設計之Executor執行緒池原理與原始碼解讀Java程式設計執行緒原始碼
- spark-streaming之 socketTextStreamSpark
- 除錯spark原始碼除錯Spark原始碼
- spark streaming原始碼分析3 排程及執行Spark原始碼
- Spark Streaming之dataset例項Spark
- Vue 原始碼解讀(12)—— patchVue原始碼
- Nebula Graph 原始碼解讀系列 | Vol.05 Scheduler 和 Executor 兩兄弟原始碼
- 【Spark】Spark容錯機制Spark
- spark基礎之spark streaming的checkpoint機制Spark
- Dubbo原始碼分析-叢集容錯之Router原始碼
- React原始碼解讀之setStateReact原始碼
- Spark原始碼分析之MemoryManagerSpark原始碼
- Spark原始碼分析之BlockStoreSpark原始碼BloC
- Spark閉包 | driver & executor程式程式碼執行Spark
- Spark Streaming 之 Kafka 偏移量管理SparkKafka
- Spark Streaming讀取Kafka資料兩種方式SparkKafka
- React原始碼解讀之componentMountReact原始碼
- DeepSort之原始碼解讀原始碼
- Spark 原始碼解析之SparkContextSpark原始碼Context
- Spark原始碼解析之Shuffle WriterSpark原始碼
- Spark原始碼解析之Storage模組Spark原始碼
- mvc原始碼解讀(12)-mvc四大過濾器之ActionFilterMVC原始碼過濾器Filter
- 【原始碼解讀(一)】EFCORE原始碼解讀之建立DBContext查詢攔截原始碼Context
- Spark 原始碼系列(九)Spark SQL 初體驗之解析過程詳解Spark原始碼SQL
- Spark學習進度11-Spark Streaming&Structured StreamingSparkStruct
- spark streaming原始碼分析2 從簡單例子看DStream上的operationSpark原始碼單例
- Spark 系列(十四)—— Spark Streaming 基本操作Spark
- Spark 系列(十五)—— Spark Streaming 整合 FlumeSpark
- spark學習筆記-- Spark StreamingSpark筆記
- Spark Streaming Backpressure分析Spark
- Spark Streaming入門Spark
- Element UI 原始碼解讀之 Table 元件UI原始碼元件
- httprunner3原始碼解讀(1)簡單介紹原始碼模組內容HTTP原始碼
- spark 原始碼分析之十三 -- SerializerManager剖析Spark原始碼
- Spark原始碼分析之DiskBlockMangaer分析Spark原始碼BloC