kafka 系列(一)介紹
引言:
網際網路夠公司的日誌無處不在,web日誌,js日誌,搜尋日誌,監控日誌等等。對於這些日誌的離線分析(Hadoop),wget&rsync雖然人力維護成本較高,但可以滿足功能行需求。但對於這些日誌的實時分析需求(例如實時推薦,監控系統),則往往必須要引入一些“高大上”的系統。
傳統的企業訊息系統(例如WebSphere)並不是非常適合大規模的日誌處理系統,理由如下:
1) 過於關注可靠性,這些可靠性增加了系統實現&API的複雜度,而在日誌處理過程中,丟失幾條日誌常常“無傷大雅”
2) 包括API,scale及訊息緩衝的設計理念都不適合Hign Throughput的日誌處理系統
針對這些問題,近些年各個公司都做了一些自己的日誌收集系統,例如:Facebook的Scribe、Yahoo的data highway,Cloudera的Flume,Apache的Chukwa,百度的BigPipe,阿里的RocketMQ。
Kafka是LinkedIn開發並開源出來的一個高吞吐的分散式訊息系統。其具有以下特點:
1) 支援高Throughput的應用
2) scale out:無需停機即可擴充套件機器
3) 持久化:通過將資料持久化到硬碟以及replication防止資料丟失
4) 支援online和offline的場景。
在當前的大資料時代,第一個挑戰是海量資料的收集,另一個就是這些資料的分析。資料分析的型別通常有使用者行為資料、應用效能跟蹤資料、活動資料日誌、事件訊息等。訊息釋出機制用於連線各種應用並在它們之間路由訊息,例如通過message broker。Kafka是快速地將海量資訊實時路由到消費者的解決方案,實現資訊的生產者和消費者的無縫整合。它不會阻塞資訊的生產者,同時資訊生產者不會知道資訊消費者。
Apache Kafka是個開源的分散式訊息釋出訂閱系統。
Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫。架構如下:
Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,它可以處理消費者規模的網站中的所有動作流資料。 這種動作(網頁瀏覽,搜尋和其他使用者的行動)是在現代網路上的許多社會功能的一個關鍵因素。 這些資料通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop的一樣的日誌資料和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過
術語:
- BrokerKafka叢集包含一個或多個伺服器,這種伺服器被稱為broker
- Topic每條釋出到Kafka叢集的訊息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的訊息分開儲存,邏輯上一個Topic的訊息雖然保存於一個或多個broker上但使用者只需指定訊息的Topic即可生產或消費資料而不必關心資料存於何處)
- PartitionPartition是物理上的概念,每個Topic包含一個或多個Partition.
- Producer負責釋出訊息到Kafka broker
- Consumer訊息消費者,向Kafka broker讀取訊息的客戶端。
- Consumer Group每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬於預設的group)。
kafka的訊息分幾個層次:
1) Topic:一類訊息,例如page view日誌,click日誌等都可以以topic的形式存在,kafka叢集能夠同時負責多個topic的分發
2) Partition: Topic物理上的分組,一個topic可以分為多個partition,每個partition是一個有序的佇列。partition中的每條訊息都會被分配一個有序的id(offset)。
3) Message:訊息,最小訂閱單元
具體流程:
1. Producer根據指定的partition方法(round-robin、hash等),將訊息釋出到指定topic的partition裡面
2. kafka叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並保留訊息指定時長(可配置),而不關注訊息是否被消費。
3. Consumer從kafka叢集pull資料,並控制獲取訊息的offset