spark從kafka讀取並發問題


某些spark分區已經處理完數據,另一些分區還在處理數據,從而導致這個批次的作業消耗時間變長,甚至導致spark作業無法及時消費kafka中的數據。

解決辦法:

1)修改kafkaRDD類的getPartition方法:

就是通過設置 topic.partition.subconcurrency 參數,如果這個參數等於1,整個函數的執行效果和之前一樣。但是如果這個參數大於1,則之前一個 Kafka 分區由一個 Spark 分區消費的數據變成由 topic.partition.subconcurrency 個 Spark 分區去消費,每個 Spark 分區消費的數據量相等。這個無疑會加快 Kafka 數據的消費,但是這種方法的問題也很明顯:

如果數據的順序很重要,這種方法會存在亂序的問題。
Spark 設計的 KafkaRDD 目的是讓 Kafka Partition 和 Spark RDD Partition 一一對應,這樣可以保證同一個分區里面的數據順序,但是這種方法實現變成了 Kafka Partition 和 Spark RDD Partition 一對多的關系,無疑破壞了官方的原有設計。

2)通過 repartition 或 coalease 對數據進行重分區:

優點:對同一類型的數據,先后順序是不會亂的,因為同一類型的數據,經過重分區還是會分發到同一分區中。

總結:上述兩種方法均無法解決kafka端數據傾斜導致的數據處理過慢的問題(消費時間過長)。針對這種情況,我們需要考慮kafka分區設置是否合理?

如果不是kafka分區設置不合理,而是本來kafka分區數量就很大,我們可以考慮增加kafka分區或調節spark資源來解決。建議最好別使用多線程來處理同一個kakfa分區的數據。(因每個Consumer都需要一個TCP鏈接,會造成大量的系統性能損耗)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM