Apache Flume學習筆記之一:基本概念和流程
一、概述
Apache Flume是一個分散式的、可靠的、可用的系統,用於從許多不同的資料來源高效的收集大容量的日誌資料,聚合並傳輸到一個集中的資料儲存。
Apache Flume並不侷限於日誌資料的聚合。由於資料來源是可定製的,Flume可用於傳輸多種事件資料,包括但不限於網路通訊資料、社交媒體資料、郵件資訊等。
Apache Flume是Apache軟體基金會的頂級專案。
Flume目前有兩個系列,0.9.x和1.x,其中0.9.x也稱為flume-og(Flume original generation),1.x也稱為flume-ng(Flume next generation)。
學習筆記基於flume 1.6.0,即flume-ng(當初看到這個詞,還以為是nginx的一個外掛呢)。
二、架構
2.1 資料流
一個Flume事件定義如下:一個有有效載荷和可選字串型別屬性的資料單元。一個Flume代理是一個JVM程序,來主持元素從外部來源流到下一站的整個事件。
Flume source消費的事件通常來源於外部源,如web服務。外部源以一種flume
source認識的格式傳輸事件,如Avro、Thrift等。當flume source收到一個事件,會將其儲存到一個或多個channel中,channel是一個被動的儲存——會儲存事件直到被flume sink消費。sink將事件從channel中移除,並放到一個外部儲存(如HDFS),或轉發到下一個flume代理的source。事件在source和sink上是非同步執行的。
2.2 複合流
Flume允許多種流的組合方式,比如多個代理相連,扇入扇出流,容錯(備用路由)等。
2.3 可靠性
每個代理的事件是儲存在channel上的。事件通過流被傳遞到下一個代理或目標儲存(如HDFS)。事件僅當被儲存到了下一個channel或目標儲存,才會從當前channel中移除。這就是單hop訊息傳遞語義中Flume流的端對端的可靠性。
Flume使用事務機制來保證事件傳輸的可靠性。source和sink被封裝在一個事務中,事件儲存在channel中或由channel提供。這保證了事件點對點傳輸的可靠性。對於多hop的流,前一個hop的sink和下一個hop的source都有自己的事務,以保證資料可以安全儲存在下一個hop的channel中。
2.4 恢復性
事件儲存在channel中,其負責失敗恢復。Flume支援基於本地檔案系統的持久檔案channel,同時還有可以將事件儲存到記憶體佇列的記憶體channel中。這種方式更快,但是代理死掉的時候,仍在記憶體channel中的事件就無法恢復了。
三、配置
3.1 設定並啟動一個agent
每個元件(source、sink、channel)都是獨立配置的,有名字、型別和特有的屬性資訊。這些資訊都寫在一個java風格的配置檔案中,如下面這個例子:
# example.conf: A single-node Flume configuration
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
# Describe the sink
a1.sinks.k1.type = logger
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
配置定義了一個名為a1的代理。a1有一個監聽44444埠的source,一個在記憶體中快取事件資料的channel,一個在螢幕輸出事件資料的sink。配置檔案首先定義了各個元件,然後描述了元件的型別和對應的配置引數,最後將source和sink與channel關聯起來。一個配置檔案中可以配置多個代理,在啟動Flume的時候需要告訴使用哪些代理。
配置完畢後,可以用下面的命令啟動:
$ bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console
如果是完全部署,可能需要指定配置目錄:--conf=<conf-dir>。<conf-dir>目錄可能包含一個shell指令碼flume-env.sh以及log4j.properties配置檔案。在本示例中傳遞了一個java選項,將日誌打在螢幕上,且沒有使用自定義的環境配置指令碼。
開啟另一個終端,使用telnet可以向Flume傳送事件:
$ telnet localhost 44444
在之前執行的Flume終端上會將事件輸出出來,如下:
3.2 基於zookeeper的配置
Flume支援通過zookeeper配置,不過還是一個實驗性的功能。配置檔案需要先上傳到zookeeper,然後進行配置,如:
- /flume
|- /a1 [Agent config file]
|- /a2 [Agent config file]
配置完成後,就可以用下面的命令來啟動:
$ bin/flume-ng agent –conf conf -z zkhost:2181,zkhost1:2181 -p /flume –name a1 -Dflume.root.logger=INFO,console
看到這個,我就在想,怎麼把配置檔案上傳到zookeeper上去,搜了半天,發現solr有個工具可以上傳,不過沒有去嘗試,感興趣的同學可以看看,附上鍊接:https://cwiki.apache.org/confluence/display/solr/Using+ZooKeeper+to+Manage+Configuration+Files
3.3 第三方外掛
Flume是完全基於外掛的體系結構,並且可以自動載入放在plugins.d目錄中的外掛。
plugins.d目錄下每個外掛可以有三個目錄,含義如下:
- lib - 外掛的jar包
- libext - 外掛的依賴jar包
- native - 本地依賴,如.so檔案
四、資料獲取
Flume支援多種資料獲取的方式。
4.1 RPC
可通過內建的avro客戶端,使用avro RPC機制,將檔案傳送到Flume Avro source:
$ bin/flume-ng avro-client -H localhost -p 44444-F /tmp/log
使用這種方式,需要將source的型別改為avro,以上面的配置檔案為例,需要修改的資訊如下:
a1.sources.r1.type = avro
然後和上面一樣,啟動flume代理,再執行本小節的命令。
假設/tmp/log檔案中的內容為hello flume,執行結果截圖如下:
代理輸出:
4.2 命令列
有一個exec source,可以消費命令列的執行結果。每行以\r或\n或兩者的組合結束。注意:Flume不支援將tail命令的結果作為source,不過可以包裝後使用。
4.3 網路流
Flume支援以下機制,從流行的日誌系統讀取資料:
- Avro
- Thrift
- Syslog
- Netcat
五、多agent的組合
5.1 配置多agent的流
為了使資料可以在多個代理或hop傳輸,前一個代理的sink和當前hop的source需要是avro型別,如圖所示。
5.2 合併
在日誌收集中比較常見的場景是大量產生日誌的客戶端將資料傳送到少量的代理,代理連線著儲存子系統,如圖所示。
在Flume中,可以通過配置第一組代理的sink為avro型別,並指向唯一的一個source為avro型別的代理來實現。這個代理將收到的資料合併,然後通過channel交由sink,到達最終的目的地。
5.3. 流的複用
Flume支援將事件分發到一個或多個目的地。可以通過定義channel到多個不同的sink來實現。
上圖展示了代理foo的source扇出到三個不同的channel中。扇出的方式可以是複製,也可以是複用。當為複製時,每個事件都傳輸到三個channel中。當為複用時,事件被傳輸到事件屬性滿足預設值的channel中(通常是一個子集)。
這次學習就到這裡,關於各種source、sink、channel、interceptor這裡就不再介紹了。
後面計劃根據程式碼來學習Flume的這種設計機制,並分析其中幾種source、sink與channel。