kafka
一、理性認知
在流式計算中,kafka一般用來緩存數據,Storm通過消費kafka的數據進行計算
1、Apache kafka是一個開源消息系統,由Scala寫成。是由Apache軟件基金會開發的一個開源消息系統項目
2、kafka最初是由LinkedIn開發,並於2011年初開源。該項目的目標是爲處理實時數據提供一個統一、高通量、低等待的平臺
3、kafka是一個分佈式消息隊列。kafka對消息保存時根據Topic進行歸類,發送消息者稱爲Producer,消息接收者稱爲Consumer,此外kafka集羣有多個kafka實例組成,每個實例(server)稱爲broker
4、無論是kafka集羣還是producer和consumer都依賴於zookeeper集羣保存一些meta信息,來保證系統的可用性
HA,hive,HBASE
內部實現原理
1、點對點模式(一對一,消費者主動拉取數據,消息收到後消息清除)
2、發佈/訂閱模式(一對多,數據生產後,推送給所有的訂閱者)
爲什麼需要消息隊列
1、解耦
2、冗餘
3、擴展性
4、靈活性&峯值處理能力
5、可恢復性
6、保證順序性
7、緩衝
8、異步通信
可以持久化168小時七天,或者是內存達到一定的容量
二、安裝部署
環境準備
集羣規劃
jar包下載
虛擬機準備
安裝jdk
安裝zookeeper
配置kafka
server.properties
/etc/profile
操作
kafka-topics.sh --list --zookeeper hlh001:2181
kafka-topics.sh --create --zookeeper hlh001:2181 --topic fist --replication-factor 3 --partitions 3
kafka-topics.sh --delete --zookeeper hlh001:2181 --topic fist
發送消息
kafka-console-producer.sh --broker-list hlh001:9092 --topic first
./kafka-console-consumer.sh --topic first --zookeeper hlh002:2181 --from-beginning
kafka-topics.sh --describe --zookeeper hlh001:2181 --topic first
三、工作流程分析
kafka生產過程分析
1、寫入方式
producer採用推(push)模式將消息發佈到broker,每條消息都被追加(append)到分區(patition)中,屬於順序寫磁盤(順序寫磁盤效率比隨機寫內存要高,保障kafka吞吐率)
2、分區
消息發送時都被髮送到一個topic,其本質就是一個目錄,而topic是由一些Partition Logs(分區日誌)組成,每個Partition中的消息都是有序的,生產的消息被不斷追加到Partition log上,其中的每一個消息都被賦予了一個唯一的offset值。
1)分區的原因
(1)方便在集羣中擴展,每個Partition可以通過調整以適應它所在的機器,而一個topic又可以有多個Partition組成,因此整個集羣就可以適應任意大小的數據了;(2)可以提高併發,因爲可以以Partition爲單位讀寫了。
2)分區的原則
(1)指定了patition,則直接使用;(2)未指定patition但指定key,通過對key的value進行hash出一個patition(3)patition和key都未指定,使用輪詢選出一個patition。(DefaultPartitioner)
3、副本
4、寫入流程
broker保存消息
1、存儲方式
物理上把topic分成一個或多個patition(對應 server.properties 中的num.partitions=3配置),每個patition物理上對應一個文件夾(該文件夾存儲該patition的所有消息和索引文件)
2、存儲策略
無論消息是否被消費,kafka都會保留所有消息。有兩種策略可以刪除舊數據:
1)基於時間:log.retention.hours=168
2)基於大小:log.retention.bytes=1073741824
需要注意的是,因爲Kafka讀取特定消息的時間複雜度爲O(1),即與文件大小無關,所以這裏刪除過期文件與提高 Kafka 性能無關
3、zookeeper存儲結構
producer不在zk中註冊,消費者在zk中註冊
kafka消費過程分析
高級API
低級API
消費者組
消費方式
攔截器原理
Producer攔截器(interceptor)是在Kafka 0.10版本被引入的,主要用於實現clients端的定製化控制邏輯
對於producer而言,interceptor使得用戶在消息發送前以及producer回調邏輯前有機會對消息做一些定製化需求,比如修改消息等。同時,producer允許用戶指定多個interceptor按序作用於同一條消息從而形成一個攔截鏈(interceptor chain)。Intercetpor的實現接口是org.apache.kafka.clients.producer.ProducerInterceptor
其定義的方法包括
(1)configure(configs)
獲取配置信息和初始化數據時調用
(2)onSend(ProducerRecord):
該方法封裝進KafkaProducer.send方法中,即它運行在用戶主線程中。Producer確保在消息被序列化以計算分區前調用該方法。用戶可以在該方法中對消息做任何操作,但最好保證不要修改消息所屬的topic和分區,否則會影響目標分區的計算
(3)onAcknowledgement(RecordMetadata, Exception):
該方法會在消息被應答之前或消息發送失敗時調用,並且通常都是在producer回調邏輯觸發之前。onAcknowledgement運行在producer的IO線程中,因此不要在該方法中放入很重的邏輯,否則會拖慢producer的消息發送效率
(4)close:
關閉interceptor,主要用於執行一些資源清理工作
如前所述,interceptor可能被運行在多個線程中,因此在具體實現時用戶需要自行確保線程安全。另外倘若指定了多個interceptor,則producer將按照指定順序調用它們,並僅僅是捕獲每個interceptor可能拋出的異常記錄到錯誤日誌中而非在向上傳遞。這在使用過程中要特別留意