Flume日志采集系統——初體驗(Logstash對比版)


這兩天看了一下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。

參數就介紹到這里了。

參考

1 Flume開發者指南

2 Flume使用指南


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM