2017-03-13 40 views
0

因此,我需要指定執行程序應該如何使用來自kafka主題的數據。將kafka分區映射到特定的火花執行器

假設我有兩個主題:t0和t1分別有兩個分區,兩個執行程序e0和e1(都可以在同一個節點上,所以分配策略不起作用,因爲在多執行程序節點的情況下它可以工作基於循環調度,無論第一個可用的執行程序如何使用主題分區)

我想要做的是使e0從t0和t1都消耗分區0,而e1從t0和t1消耗分區1。有沒有辦法解決它,除了搞調度?如果是這樣,最好的辦法是什麼。

這樣做的原因是執行程序將寫入cassandra數據庫,並且由於我們將處於並行上下文中,因此一個執行程序可能與另一個執行程序發生「碰撞」,因此數據將丟失,方法是分配一個我想強制執行的分區執行者依次處理數據。

+0

是否有你想要做的這個特殊的理由?這可能有助於解釋您對分區分配的看法。 –

+0

是的確,我需要強制給定的執行者爲了整體的目的對所有主題進行相同的劃分。執行者將寫入一個cassandra數據庫,因爲我們將處於並行的上下文環境中,一個執行者可能會與另一個執行者「碰撞」,因此數據將會丟失,通過分配一個分區來強制執行者按順序處理數據。 –

回答

1

Spark 2.x支持使用assign選項分配分區,更多信息here

例子:

Dataset<Row> ds2 = spark 
    .readStream() 
    .format("kafka") 
    .option("kafka.bootstrap.servers", "host1:port1,host2:port2") 
    .option("subscribe", "t0,t1") 
    .option("assign", '{"t0": [0], "t1": [0]}') 
    .load() 
+0

所以這是爲主機分配主題分區,在我的情況下主機可以包含不同的執行程序,但我想要針對特定​​的執行程序,而不是整個節點。我必須爲這個計劃煩惱嗎? –

0

下面是我從KafkaRDD和DirectKafkaInputDStream貢獻得到了那些有興趣的答案:

「星火只是真的不是很適合試着對特定計算的特別是執行者,特別是如果你依賴這一點來保證正確性。「

編輯:所以它工作得很好,合併,我能找到我的問題的解決方案:雖然不直接處理執行者一個很好的總結是通過分配策略和合並分配給特定的流所需的分區到單個分區,然後對不同流上的剩餘主題重複相同的過程,最後做一個這些流的聯合。

沒有洗牌,整個事情中都是因爲RDD分區被壓縮成一個一個