簡體   English   中英

使用 kafka 進行 Spark 流式傳輸 - 從檢查點重新啟動

[英]Spark streaming with kafka - restarting from checkpoint

我們正在使用 Spark Streaming 和 Kafka 構建容錯系統,並正在測試檢查點 Spark 流,以便我們可以選擇在 Spark 作業因任何原因崩潰時重新啟動它。 這是我們的火花過程的樣子:

  • Spark Streaming 每 5 秒運行一次(滑動間隔)從 kafka 讀取數據
  • Kafka 每秒接收大約 80 條消息

我們想要實現的是一種設置,我們可以在其中關閉 Spark 流作業(以模擬故障),然后重新啟動它,並且仍然確保我們處理來自 Kafka 的每條消息。 這似乎工作正常,但是,這是我所看到的,我不知道該怎么做:

  • 在我們重新啟動 Spark 作業后,將為所有丟失的時間創建一個批處理。 因此,例如,如果我們在一分鍾后關閉並重新啟動,則會創建 12 個批次(每 5 秒一個)。 請看下圖
  • 這些批次都沒有處理任何數據。 如下圖所示,這些批次的輸入大小為 0。在開始處理帶有數據的批次之前,我們必須等待所有這些完成。 如果我們在幾個小時的間隔后重新啟動作業,情況會變得更糟,因為創建了數百個不處理任何東西但必須完成的批次

對此的任何意見將不勝感激:

  • 這是預期的嗎? 為什么在不處理任何數據時會創建批處理(kafka 主題正在不斷接收消息)。
  • 還有第二件事令人困惑。 在我們將 spark 進程關閉一分鍾並重新啟動后,kafka 主題中有 4800 (80*60) 條消息等待處理。 看起來這些消息正在被處理,但我沒有在 UI 上看到任何輸入大小為 4800 的批處理

在此處輸入圖片說明

這是預期的嗎? 為什么在不處理任何數據時創建批次

這就是 Sparks 容錯語義所保證的,即使您的服務失敗,它也可以從最后處理的時間點恢復並繼續處理。 Spark 正在讀取檢查點數據並啟動恢復過程,直到它到達當前時間點。 Spark 不知道 0 個事件批次,因此不會對它們進行優化。

看起來這些消息正在處理中,但我在 UI 上沒有看到任何輸入大小為 4800 的批處理

這可能由於各種原因而發生。 一個常見的情況是,如果您將 Sparks 背壓標志設置為 true。 Spark 發現您有明顯的處理延遲,因此它減少了每批讀取的消息數量,以便讓流式作業趕上進度。

這是預期的嗎? 為什么在不處理任何數據時創建批次

實際上,Spark Streaming with Kafka,當從checkpoint 恢復時,spark 會先生成jobs。 所有數據都在一個或多個批次中處理(這取決於某些配置),而在 web ui 中,您只能看到所有那些以 0 事件執行的恢復批次。

還有第二件事令人困惑......

是的,從 web ui 來看,這很令人困惑。 嘗試為每個批次計算事件 num,打印 num。

DStream.foreachRDD(println(_.count))

您會發現 Spark 確實處理由檢查點創建的批處理,而在 web ui 中,事件編號為 0。

如果您的應用程序在從故障中恢復后發現很難在一個批次中處理所有事件,那么如何控制 Spark 創建的批次數?

嘗試搜索 spark.streaming.kafka.maxRatePerPartition => 使用新的 Kafka 直接流 API 時將從每個 Kafka 分區讀取數據的最大速率(每秒記錄數)。

MaxRatePerPartition* partitionOfKafka* YourStreamingBatchDuration * N = eventsNumToProcess

N => After recovered from checkpoint, the num of batches spark need to process.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM