我想了解Kafka和Spark(Streaming)節點之間的通信是如何發生的。我有以下問題。Spark Streaming:Spark和Kafka的通訊如何發生?
- 如果Kafka服務器和Spark節點位於兩個獨立的羣集中,通信將如何進行。需要配置它們的步驟是什麼?
- 如果兩者都在相同的羣集中,但在不同的節點中,將如何進行通信。
通信我這裏的意思是,它是否是一個RPC或插口進行通信。我想了解內部解剖
任何幫助表示讚賞。
在此先感謝。
我想了解Kafka和Spark(Streaming)節點之間的通信是如何發生的。我有以下問題。Spark Streaming:Spark和Kafka的通訊如何發生?
通信我這裏的意思是,它是否是一個RPC或插口進行通信。我想了解內部解剖
任何幫助表示讚賞。
在此先感謝。
首先,它不計,如果卡夫卡節點和星火節點是相同的羣集或不在,但他們應該能夠相互連接(開放的端口的防火牆)。
有兩種方法可以使用舊版的KafkaUtils.createStream()
API和更新版的KafkaUtils.createDirectStream()
方法,使用Spark Streaming從Kafka中讀取數據。
我並不想進入它們之間的區別,這是有據可查的here(簡而言之,直接流比較好)。
解決您的問題,溝通如何發生(內部解剖):找出最佳方法是查看Spark源代碼。
createStream()
API使用一組來自官方org.apache.kafka
包的卡夫卡消費者。這些卡夫卡消費者擁有自己的客戶名爲NetworkClient
,您可以查詢here。總之,NetworkClient
使用套接字進行通信。
createDirectStream()
API確實使用來自相同org.apache.kafka
包的Kafka SimpleConsumer
。該SimpleConsumer
類從卡夫卡讀到一個java.nio.ReadableByteChannel
這是java.nio.SocketChannel
子類,所以它到底是用插座要做的事,但多一點間接使用Java的非阻塞I/O API的便利。
所以要回答你的問題:它是用套接字完成的。