2016-06-14 208 views
4

我有一些用例,我想更加澄清,關於卡夫卡主題分區 - >火花流資源利用率。卡夫卡主題分區火花流

我使用spark獨立模式,所以只有設置是「執行者總數」和「執行者內存」。據我所知,根據文檔,將並行性引入Spark流的方式是使用分區的Kafka主題 - >當我使用spark-kafka直接流集成時,RDD將具有與kafka相同數量的分區。

因此,如果我在主題中有1個分區,並且有1個執行程序核心,那麼這個核心將依次從卡夫卡讀取。

,如果我有什麼影響:

  • 2分區的話題,只有1執行人核心是什麼?這個核心是從一個分區開始,然後是從第二個分區開始讀取的,所以在分割這個主題時沒有任何好處?

  • 主題中的2個分區和2個內核?然後1執行器核心從1分區讀取,第二個核心從第二個分區讀取?

  • 1個kafka分區和2個executor核心?

謝謝。

回答

7

基本規則是你可以縮放高達卡夫卡分區的數量。如果您將spark.executor.cores設置爲大於分區數,則某些線程將空閒。如果它小於分區數量,則Spark將從一個分區讀取線程,然後從另一個分區讀取線程。所以:

  1. 2個分區,1個執行程序:從一個分區讀然後是其他分區。 (我不知道星火如何決定多少切換之前,從每個讀取)

  2. 2P,2C:並行執行

  3. 1P,2C:一個線程空閒

對於情況#1,請注意,擁有比執行者更多的分區是可以的,因爲它允許您稍後擴展而無需重新分區。訣竅是確保你的分區可以被執行者的數量整除。在將數據傳遞到流水線中的下一個步驟之前,Spark必須處理全部分區。所以,如果你有'剩餘'分區,這可能會減慢處理速度。例如,5個分區和4個線程=>處理需要2個分區的時間 - 一次4個,然後一個線程自己運行第5個分區。

另請注意,如果通過明確設置功能中的數據分區數(如reduceByKey()),在整個流水線中保持分區/ RDD的數量相同,還可以看到更好的處理吞吐量。

+0

此外,我建議你看看這個項目:https://github.com/dibbhatt/kafka-spark-consumer,它實現了一個更好的工作 - 分區分區分佈。 – Vale