[英]Concurrent Spark stream job from one Kafka topic source
我們有一個簡單的火花 stream 來自一個 kafka 主題(有 8 個分區),如下所示創建並提交了 2 個執行程序(每個執行程序 4 個核心)。
dataSet
.writeStream()
.trigger(Trigger.ProcessingTime(0))
.format("kafka");
.start();
現在考慮這種情況:
我們的期望是 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.