這兩天看了一下Flume的開發文檔,並且體驗了下Flume的使用。
本文就從如下的幾個方面講述下我的使用心得:
- 初體驗——與Logstash的對比
- 安裝部署
- 啟動教程
- 參數與實例分析
Flume初體驗
Flume的配置是真繁瑣,source,channel,sink的關系在配置文件里面交織在一起,沒有Logstash那么簡單明了。

Flume與Logstash相比,我個人的體會如下:
- Logstash比較偏重於字段的預處理;而Flume偏重數據的傳輸;
- Logstash有幾十個插件,配置靈活;FLume則是強調用戶的自定義開發(source和sink的種類也有一二十個吧,channel就比較少了)。
- Logstash的input和filter還有output之間都存在buffer,進行緩沖;Flume直接使用channel做持久化(可以理解為沒有filter)
Logstash淺談:
Logstash中:
- input負責數據的輸入(產生或者說是搜集,以及解碼decode);
- Filter負責對采集的日志進行分析,提取字段(一般都是提取關鍵的字段,存儲到elasticsearch中進行檢索分析);
- output負責把數據輸出到指定的存儲位置(如果是采集agent,則一般是發送到消息隊列中,如kafka,redis,mq;如果是分析匯總端,則一般是發送到elasticsearch中)

在Logstash比較看重input,filter,output之間的協同工作,因此多個輸入會把數據匯總到input和filter之間的buffer中。filter則會從buffer中讀取數據,進行過濾解析,然后存儲在filter於output之間的Buffer中。當buffer滿足一定的條件時,會觸發output的刷新。
Flume淺談:
在Flume中:
- source 負責與Input同樣的角色,負責數據的產生或搜集(一般是對接一些RPC的程序或者是其他的flume節點的sink)
- channel 負責數據的存儲持久化(一般都是memory或者file兩種)
- sink 負責數據的轉發(用於轉發給下一個flume的source或者最終的存儲點——如HDFS)

Flume比較看重數據的傳輸,因此幾乎沒有數據的解析預處理。僅僅是數據的產生,封裝成event然后傳輸。傳輸的時候flume比logstash多考慮了一些可靠性。因為數據會持久化在channel中(一般有兩種可以選擇,memoryChannel就是存在內存中,另一個就是FileChannel存儲在文件種),數據只有存儲在下一個存儲位置(可能是最終的存儲位置,如HDFS;也可能是下一個Flume節點的channel),數據才會從當前的channel中刪除。這個過程是通過事務來控制的,這樣就保證了數據的可靠性。
不過flume的持久化也是有容量限制的,比如內存如果超過一定的量,也一樣會爆掉。
安裝
在官網下載最新版本http://flume.apache.org/download.html,目前最新的版本是1.6.0
默認flume是不支持windows的,沒有bat的啟動命令。不過有一個flume-ng.cmd,其實它也不是啟動文件,只是啟動了一個powershell而已,如果你本地有這個軟件,就可以在windows下運行了。
powershell.exe -NoProfile -InputFormat none -ExecutionPolicy unrestricted -File %~dp0flume-ng.ps1 %*
目錄介紹
bin
存放了啟動腳本
lib
啟動所需的所有組件jar包
conf
提供了幾個測試配置文件
docs
文檔
tools
跟日志輸出有關的一個jar包(不知道有什么不同)
先來看看配置文件
# 關於license的一大堆 blabla
# 配置sources,channels,sinks的名稱
agent.sources = seqGenSrc
agent.channels = memoryChannel
agent.sinks = loggerSink
# 配置sources是哪一種類型,注意可以由多個source哦!
# seq 是專門給測試用的,會自動產生一大堆數據。
# (其實我覺得stdin最好,不過flume沒這個source)
agent.sources.seqGenSrc.type = seq
# 配置source輸出的channel為memoryChannel(名稱,你也可以叫c1)
agent.sources.seqGenSrc.channels = memoryChannel
# 配置sink是哪一種類型,本例子為logger,即log4j輸出。
# (log4j會參考conf下的log4j.properties文件,一般開啟consoleAppender做測試就行)
agent.sinks.loggerSink.type = logger
# 配置sink取數據的channel為memoryChannel,注意跟上面的名字保持一致哦!
agent.sinks.loggerSink.channel = memoryChannel
# 配置channel的類型
agent.channels.memoryChannel.type = memory
# 配置channel的容量
agent.channels.memoryChannel.capacity = 100
然后在flume目錄下,輸入下面的命令:
bin/flume-ng agent --conf-file conf/flume-conf.properties.template --name agent -Dflume.root.logger=INFO,console -C .
然后就可以看到滿屏滾動的信息了!
注意:上面啟動命令沒一個字母是廢話!
啟動參數詳解
你可以輸入flume-ng help 獲得幫助提示:
[root@10 /xinghl/flume]$ bin/flume-ng hekp
Usage: bin/flume-ng <command> [options]...
commands:
help display this help text
agent run a Flume agent
avro-client run an avro Flume client
version show Flume version info
global options:
--conf,-c <conf> use configs in <conf> directory
--classpath,-C <cp> append to the classpath
--dryrun,-d do not actually start Flume, just print the command
--plugins-path <dirs> colon-separated list of plugins.d directories. See the
plugins.d section in the user guide for more details.
Default: $FLUME_HOME/plugins.d
-Dproperty=value sets a Java system property value
-Xproperty=value sets a Java -X option
agent options:
--name,-n <name> the name of this agent (required)
--conf-file,-f <file> specify a config file (required if -z missing)
--zkConnString,-z <str> specify the ZooKeeper connection to use (required if -f missing)
--zkBasePath,-p <path> specify the base path in ZooKeeper for agent configs
--no-reload-conf do not reload config file if changed
--help,-h display help text
avro-client options:
--rpcProps,-P <file> RPC client properties file with server connection params
--host,-H <host> hostname to which events will be sent
--port,-p <port> port of the avro source
--dirname <dir> directory to stream to avro source
--filename,-F <file> text file to stream to avro source (default: std input)
--headerFile,-R <file> File containing event headers as key/value pairs on each new line
--help,-h display help text
Either --rpcProps or both --host and --port must be specified.
這里就挑重要的參數將了:
commands 命令參數
這個是很重要的參數,因為flume可以使用不同的角色啟動,比如agent以及client等等。暫時搞不清楚avro-client有什么特殊的,先了解一下吧!平時啟動就使用agent就可以了。
global options 全局參數
--conf 或者 -c ,指定去conf目錄下加載配置文件
--classpath 或者 -C,指定類加載的路徑(不知道為什么我下載flume版本啟動的時候找不到log4j配置,只能加上 -C .才能啟動!)
command 指定
-Dproperty=value 這個參數比較重要,比如logger就需要它來指定傳輸的級別等信息。如果沒有這個參數,logger就不好使了。
agent options agent啟動選項
其中最終要的就是 --name 或者 -n ,它指定了啟動agent的名稱,注意是啟動agent的名稱。
這個名稱必須與配置文件中的一樣
這個名稱必須與配置文件中的一樣
這個名稱必須與配置文件中的一樣
重要的事情重復三遍!
如果寫錯了!一段小異常就跑來了~(比如我配置文件中為agent,啟動命令中寫agent123)
2016-06-30 17:04:19,529 (conf-file-poller-0) [WARN - org.apache.flume.node.AbstractConfigurationProvider.getConfiguration(AbstractConfigurationProvider.java:133)] No configuration found for this host:agent123
另外,就是通過--conf-file 或者 -f 指定配置文件。如果配置文件放在conf,也等同於--conf。
參數就介紹到這里了。
