本博客文章如無特別說明,均爲原創!轉載請註明出處:Big data enthusiast(http://www.lubinsu.com/)
本文鏈接地址:【Kafka】Kafka分佈式流式處理平臺(http://www.lubinsu.com/index.php/archives/472)
作爲一個分佈式消息發佈訂閱系統,Kafka在大數據領域被人們所熟知,在這裏對Kafka的一些基本概念做一個簡介,後續將對Kafka做一整個專題的介紹。希望對大家有所幫助。
Kafka流平臺有如下三個特徵:
Publish and subscribe to streams of records, similar to a message queue or enterprise messaging system.
Store streams of records in a fault-tolerant durable way.
Process streams of records as they occur.
也就是說它類似於消息隊列或者企業級消息系統,可以發佈訂閱流中的數據、可以將接收到的數據持久化達到高容錯性的效果,你還可以通過這個平臺實時處理接收到的流式數據。
API
我們先來看下Kafka的四類主要的API:
Producer API:發佈流數據到一個或者多個topic
Consumer API:用於訂閱一個或者多個topic,並且處理產生的消息
Streams API:作爲一個流處理器,有效的將一個輸入流轉換爲一個輸出流,也就是將一個或者多個topic的數據處理轉換成另一個或者多個topic的數據
Connector API:我們可以通過connector api構建並運行一個可以重複使用的生產者或者消費者,來連接Kafka的topic與應用程序,或者數據系統
概念釋義
開頭說了這麼多,可能大家對一些新的概念還不是很熟悉,這裏我們來了解下幾個專有名詞:
Topic(主題):Kafka集羣分類保存的一系列流數據,這些分類就叫做主題
A topic is a category or feed name to which records are published. Topics in Kafka are always multi-subscriber; that is, a topic can have zero, one, or many consumers that subscribe to the data written to it.
也就是說kafka中的topic支持一個或者多個消費者訂閱它。並且針對每個topic,Kafka維護了一個經過分區的log,如下圖所示:
在這裏,每個分區都是一個有序的、不可變的、不斷追加的日誌序列。並且每一條記錄在這裏都用一個順序生成的id標示了——叫做offset,這個offset唯一標誌了一個partition的一條記錄。不管這些消息有沒有被消費掉,Kafka集羣會根據所配置的時間段將每一條記錄持久化在磁盤中。只要消息在指定的時間內還未過期,我們都可以從中消費到它。
分佈式
所有日誌的分區,分佈在Kafka集羣的服務器上,每臺服務處理其所負責的partition的數據和請求,每個partition根據配置可以擁有多個副本並分佈到不同的服務器上,來達到容錯的效果。
每個partition擁有一個leader,並且有0個或者多個follower,leader負責所有的讀寫,follower負責被動的從leader複製。如果leader失敗了,那麼其中的follower將會自動轉爲leader。每臺服務器扮演了一部分topic的leader,一部分topic的follower,以此達到負載均衡的效果。
Producer(生產者):Kafka的生產者根據指定的邏輯(如:round-robin),將消息分發到指定topic的partition下
Consumer(消費者):Kafka的消費者根據group name來標識自己,每條發佈的消息最終會傳送給每個指定了group name的消費者,同一個消費者(只要group name相同)可以分佈在不同服務器的不同進程中
If all the consumer instances have the same consumer group, then the records will effectively be load balanced over the consumer instances.–同一個group name可以達到負載均衡的效果
If all the consumer instances have different consumer groups, then each record will be broadcast to all the consumer processes.–不同的group name,那麼記錄將會被拷貝多份分發給各個group
由此可見,我們可以通過創建多個同名的consumer,實現消費者的高可用和負載均衡。如果新的同名消費者實例加入進來,那麼它會從其他的同名消費者實例中接管該topic下的部分partition,如果某個實例down了,那麼它接管的partition則會被其他同名消費者接管。另外,Kafka的數據有序性只是在單個partition中有序,而在不同的patition之間的數據是無法保證消費的先後順序的。如果我們需要達到數據消費的有序性,那麼可以將partition的數量設置爲1,而這樣意味着這個topic下的每個group消費實例只能有一個。