2016-10-11 68 views
8

我有一些基本的Kafka Streaming代碼,它可以從一個主題讀取記錄,進行一些處理,並將記錄輸出到另一個主題。Kafka Streaming Concurrency?

卡夫卡流處理併發性如何?一切都在單線程中運行嗎?我沒有看到在文檔中提到的這一點。

如果它是單線程的,我希望多線程處理的選項來處理大量的數據。

如果它是多線程的,我需要了解它是如何工作的以及如何處理資源,比如SQL數據庫連接應該在不同的處理線程中共享。

相對於其他選項(Spark,Akka,Samza,Storm等),Kafka的內置流式API不推薦用於大容量場景嗎?

回答

13

卡夫卡流處理併發性如何?一切都在單線程中運行嗎?我沒有看到在文檔中提到的這一點。

這詳細記錄在http://docs.confluent.io/current/streams/architecture.html#parallelism-model。我不想複製粘貼這裏逐字,但我想強調,恕我直言,要了解的關鍵要素是分區(比較卡夫卡的主題分區,在卡夫卡流被推廣爲「流分區」爲並非所有正在處理的數據流都將通過Kafka),因爲當前分區決定了Kafka(代理/服務器端)和使用Kafka Streams API(客戶端)的流處理應用程序的並行性。

如果它是單線程的,我希望多線程處理的選項來處理大量的數據。

處理分區總是會被一個唯一的「線程」,從而確保您沒有運行到併發問題來完成。但是......

如果是多線程的,我需要了解如何工作的,以及如何處理資源,如應在不同的處理線程共享SQL數據庫連接。

...因爲Kafka允許一個主題有多個分區,所以可以進行並行處理。例如,如果一個主題有100個分區,那麼多達100個流任務(或者,有些過分簡化:多達100個不同的機器,每個運行一個應用程序實例)可以並行處理該主題。同樣,每個流任務都將獨佔訪問1個分區,然後處理它。

相對於其他選項(Spark,Akka,Samza,Storm等),Kafka的內置流式API不推薦用於大容量場景嗎?

卡夫卡的流處理引擎是絕對推薦的,並且實際上也被用於大容量場景。關於比較基準測試的工作仍在進行中,但在許多情況下,基於Kafka Streams的應用程序變得更快。查看LINE engineer's blog: Applying Kafka Streams for internal message delivery pipeline獲取LINE Corp的一篇文章,該公司是亞洲最大的社交平臺之一(220M +用戶),他們描述了他們如何在生產中使用Kafka和Kafka Streams API來處理每秒數百萬事件。

+1

鏈接到LINE工程師的博客在此期間被打破。你可以在這裏找到它:https://engineering.linecorp.com/en/blog/detail/80 – Esk

+0

謝謝,更新! –

+0

@ MichaelG.Noll如何在單個流應用程序實例的多個線程之間共享資源。如果我的ValueMapper不是線程安全的,那麼是否可以使用多線程運行應用程序實例? – mrnakumar

4

kstreams config num.stream.threads允許您從1覆蓋線程數。但是,最好僅運行流應用程序的多個實例,並且它們都運行相同的使用者組。這樣,您可以旋轉儘可能多的實例以獲得最佳分區。

相關問題