大數據開發之kafka基礎知識點

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可能拋出的異常記錄到錯誤日誌中而非在向上傳遞。這在使用過程中要特別留意

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章