簡體   English   中英

來自一個 Kafka 主題源的並發 Spark stream 作業

[英]Concurrent Spark stream job from one Kafka topic source

我們有一個簡單的火花 stream 來自一個 kafka 主題(有 8 個分區),如下所示創建並提交了 2 個執行程序(每個執行程序 4 個核心)。

dataSet
   .writeStream()
   .trigger(Trigger.ProcessingTime(0))
   .format("kafka");
   .start();

現在考慮這種情況:

  1. 一個請求來到此主題的分區 #0。
  2. 一個 Spark 作業將從 8 個任務開始,其中只有一個正在運行(其他都是成功的)。
  3. 假設處理這個請求需要 1 分鍾。
  4. 在這 1 分鍾內,有 100 個請求到達該主題(在所有 8 個分區中)。
  5. Spark 等待當前作業完成,然后創建另一個作業來處理新請求。

我們的期望是 Spark 在處理第一個請求時在另一個作業中處理其他請求,但這並沒有發生。 現在假設第一個作業需要 1 小時而不是 1 分鍾,而其他請求在 7 個核心空閑時等待處理。 那是我們的問題。

我已經嘗試從 4 個不同的線程多次(如 4 次)發送此作業,但行為仍然相同。 我還嘗試將此配置spark.streaming.concurrentJobs設置為大於 1 但沒有變化!

所以我的問題是,一個kafka stream 數據集是否可以有多個工作 如果是的話怎么辦?

我們正在使用 Spark 2、Kafka 1 和 Java 8。

因此,經過幾天的學習和測試,我終於發現,在不同線程中設置並發作業或發送作業都不是解決方案。

唯一可行的解決方案是為每個(或一組)主題分區創建不同的流

kafka 中的並行性因素是分區。 Spark(和 kafka)具有這種只能從特定分區讀取的能力。 因此,如果我們的分區有 4 個主題,我將 Spark 作業分成 4 個不同的作業,每個作業都在監聽(分配)一個分區,但它們都沉入同一個目標。

所以現在如果一個作業忙於一個耗時的過程,其他作業(這里是 3)仍然可以處理來自其分配的分區的數據,他們不需要等待其他分區上的完成過程。

配置如下:

assign: {"topic-name":[0,1,2]}

代替

subscribe: "topic-name"

注意配置結構,它應該是一個有效的 JSON並且主題列表應該以逗號分隔的字符串提及(不支持范圍或排除)

暫無
暫無

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

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