Flume+Kafka雙劍合璧玩轉大數據平臺日誌採集

概述

大數據平臺每天會產生大量的日誌,處理這些日誌需要特定的日誌系統。

一般而言,這些系統需要具有以下特徵:

  • 構建應用系統和分析系統的橋樑,並將它們之間的關聯解耦;
  • 支持近實時的在線分析系統和類似於Hadoop之類的離線分析系統;
  • 具有高可擴展性。即:當數據量增加時,可以通過增加節點進行水平擴展。

爲此建議將日誌採集分析系統分爲如下幾個模塊:

 

 

 

 

 

  • 數據採集模塊:負責從各節點上實時採集數據,建議選用Flume-NG來實現。
  • 數據接入模塊:由於採集數據的速度和數據處理的速度不一定同步,因此添加一個消息中間件來作爲緩衝,建議選用Kafka來實現。
  • 流式計算模塊:對採集到的數據進行實時分析,建議選用Storm來實現。
  • 數據輸出模塊:對分析後的結果持久化,可以使用HDFS、MySQL等。

日誌採集選型

大數據平臺每天會產生大量的日誌,處理這些日誌需要特定的日誌系統。目前常用的開源日誌系統有 Flume 和Kafka兩種, 都是非常優秀的日誌系統,且各有特點。下面我們來逐一認識一下。

Flume組件特點

Flume是一個分佈式、可靠、高可用的海量日誌採集、聚合和傳輸的日誌收集系統。支持在日誌系統中定製各類數據發送方,用於收集數據;同時,Flume提供對數據進行簡單處理,並寫到各種數據接受方(可定製)的能力。

Flume的設計目標

  • 可靠性

Flume的核心是把數據從數據源收集過來,再送到目的地。爲了保證輸送一定成功,在送到目的地之前,會先緩存數據,待數據真正到達目的地後,刪除自己緩存的數據。Flume 使用事務性的方式保證傳送Event整個過程的可靠性。

  • 可擴展性

Flume中只有一個角色Agent,其中包含Source、Sink、Channel三種組件。一個Agent的Sink可以輸出到另一個Agent的Source。這樣通過配置可以實現多個層次的流配置。

  • 功能可擴展性

Flume自帶豐富的Source、Sink、Channel實現。用戶也可以根據需要添加自定義的組件實現, 並在配置中使用起來。

Flume的架構

Flume的基本架構是Agent。它是一個完整的數據收集工具,含有三個核心組件,分別是 Source、Channel、Sink。數據以Event爲基本單位經過Source、Channel、Sink,從外部數據源來,向外部的目的地去。

 

 

 

 

 

 

 

 

除了單Agent的架構外,還可以將多個Agent組合起來形成多層的數據流架構:

  • 多個Agent順序連接:將多個Agent順序連接起來,將最初的數據源經過收集,存儲到最終的存儲系統中。一般情況下,應該控制這種順序連接的Agent的數量,因爲數據流經的路徑變長了,如果不考慮Failover的話,出現故障將影響整個Flow上的Agent收集服務。

 

 

 

 

 

  • 多個Agent的數據匯聚到同一個Agent:這種情況應用的場景比較多,適用於數據源分散的分佈式系統中數據流彙總。

 

 

 

 

 

  • 多路(Multiplexing)Agent:多路模式一般有兩種實現方式,一種是用來複制,另一種是用來分流。複製方式可以將最前端的數據源複製多份,分別傳遞到多個Channel中,每個Channel接收到的數據都是相同的。分流方式,Selector可以根據Header的值來確定數據傳遞到哪一個Channel。

 

 

 

 

 

  • 實現Load Balance功能:Channel中Event可以均衡到對應的多個Sink組件上,而每個Sink組件再分別連接到一個獨立的Agent上,這樣可以實現負載均衡。

 

 

 

 

 

Kafka組件特點

kafka實際上是一個消息發佈訂閱系統。Producer向某個Topic發佈消息,而Consumer訂閱某個Topic的消息。一旦有新的關於某個Topic的消息,Broker會傳遞給訂閱它的所有Consumer。

Kafka的設計目標

  • 數據在磁盤上的存取代價爲O(1)

Kafka以Topic來進行消息管理,每個Topic包含多個Partition,每個Partition對應一個邏輯log,由多個Segment組成。每個Segment中存儲多條消息。消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲位置,避免id到位置的額外映射。

  • 爲發佈和訂閱提供高吞吐量

Kafka每秒可以生產約25萬消息(50 MB),每秒處理55萬消息(110 MB)。

  • 分佈式系統,易於向外擴展

所有的Producer、Broker和Consumer都會有多個,均爲分佈式的。無需停機即可擴展機器。

Kafka的架構

Kafka是一個分佈式的、可分區的、可複製的消息系統,維護消息隊列。

Kafka的整體架構非常簡單,是顯式分佈式架構,Producer、Broker和Consumer都可以有多個。Producer,consumer實現Kafka註冊的接口,數據從Producer發送到Broker,Broker承擔一箇中間緩存和分發的作用。Broker分發註冊到系統中的Consumer。Broker的作用類似於緩存,即活躍的數據和離線處理系統之間的緩存。客戶端和服務器端的通信,是基於簡單、高性能、且與編程語言無關的TCP協議。

 

 

 

 

 

 

 

 

 

 

Flume與Kafka的比較

Flume和Kafka都是優秀的日誌系統,其都能實現數據採集、數據傳輸、負載均衡、容錯等一系列的需求, 但是兩者之間還是有着一定的差別。

 

 

 

 

 

由此可見Flume和Kafka還是各有特點的:

  • Flume 適用於沒有編程的配置解決方案,由於提供了豐富的source、channel、sink實現,各種數據源的引入只是配置變更就可實現。
  • Kafka 適用於對數據管道的吞吐量、可用性要求都很高的解決方案,基本需要編程實現數據的生產和消費。

 

日誌採集選型小結

建議採用Flume作爲數據的生產者,這樣可以不用編程就實現數據源的引入,並採用Kafka Sink作爲數據的消費者,這樣可以得到較高的吞吐量和可靠性。如果對數據的可靠性要求高的話,可以採用Kafka Channel來作爲Flume的Channel使用。

Flume對接Kafka

Flume作爲消息的生產者,將生產的消息數據(日誌數據、業務請求數據等)通過Kafka Sink發佈到Kafka中。

對接配置

 

 

 

 

對接示例

假設現有Flume實時讀取/data1/logs/component_role.log的數據並導入到Kafka的mytopic主題中。

環境預設爲:
Zookeeper 的地址爲  zdh100:2181 zdh101:2181 zdh102:2181
Kafka broker的地址爲 zdh100:9092 zdh101:9092  zdh102:9093

配置Flume agent,如下修改Flume配置:

gent1.sources = logsrc
agent1.channels = memcnl
agent1.sinks = kafkasink
 
#source section
agent1.sources.logsrc.type = exec
agent1.sources.logsrc.command = tail -F /data1/logs/component_role.log
agent1.sources.logsrc.shell = /bin/sh -c
agent1.sources.logsrc.batchSize = 50
agent1.sources.logsrc.channels = memcnl
 
# Each sink's type must be defined
agent1.sinks.kafkasink.type = org.apache.flume.sink.kafka.KafkaSink
agent1.sinks.kafkasink.brokerList=zdh100:9092, zdh101:9092,zdh102:9092
agent1.sinks.kafkasink.topic=mytopic
agent1.sinks.kafkasink.requiredAcks = 1
agent1.sinks.kafkasink.batchSize = 20
agent1.sinks.kafkasink.channel = memcnl
 
# Each channel's type is defined.
agent1.channels.memcnl.type = memory
agent1.channels.memcnl.capacity = 1000

啓動該Flume節點:

/home/mr/flume/bin/flume-ng agent -c 
/home/mr/flume/conf -f /home/mr/flume/conf/flume-conf.properties -n agent1 -Dflume.monitoring.type=http -Dflume.monitoring.port=10100

動態追加日誌數據,執行命令向 /data1/logs/component_role.log 添加數據:

echo "測試代碼" >> /data1/logs/component_role.log
echo "檢測Flume+Kafka數據管道通暢" >> /data1/logs/component_role.log

驗證Kafka數據接收結果,執行命令檢查Kafka收到的數據是否正確,應該可以呈現剛纔追加的數據:

/home/mr/kafka/bin/kafka-console-consumer.sh --zookeeper zdh100:2181 --topic mytopic --from-beginning

輸出結果如下:

 

歡迎工作一到五年的Java工程師朋友們加入Java程序員開發: 854393687
羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
 

 

 

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