Fluentd是一個實時日志收集系統,它把日志作為JSON stream,可以同時從多台server上收集大量日志,也可以建構具有層次的日志收集系統。
Fluentd易于安裝,有靈活的插件機制和緩沖,支援日志轉發。它的特點在于各部分均是可定制化的,可以通過簡單的配置,将日志收集到不同的地方。
Fluentd通過hadoop中的webHDFS與HDFS進行通信,是以在配置Fluentd時,一定要保證webHDFS能正常通信。
系統環境:CentOS 6.5
叢集環境:Hadoop 2.2.0
參考Fluentd官網。
安裝
td-agent是Fluentd的一個穩定版本。
CentOS下可以直接運作以下指令安裝:
curl -L https://td-toolbelt.herokuapp.com/sh/install-redhat-td-agent2.sh | sh
啟動
管理腳本是:
/etc/init.d/td-agent
可通過
/etc/init.d/td-agent start
或
service td-agent start
來啟動
配置檔案:
/etc/td-agent/td-agent.conf
重新加載配置檔案:
service td-agent reload
td-agent的日志檔案:
/var/log/td-agent/
配置
Fluentd自帶多個輸入插件和輸出插件,這裡先實作收集本地日志到本地檔案。
## File input
<source>
type tail
path /var/log/mytemp.log
pos_file /var/log/td-agent/mytemp.log.pos
format none
tag td.temp
</source>
#其中:
#1.type tail: tail方式是Fluentd内置的輸入方式,其原理是不停地從源檔案中擷取新的日志,相當于tail –f指令。
#2.path: 指定日志檔案位置。
#3.pos_file:存儲path中日志檔案狀态的檔案。
#4.format none: 指定使用何種日志解析器。
#5.tag: tag被用來對不同的日志進行match。
## File output
<match td.temp>
type file
path /var/log/td-agent/access
</match>
當mytemp.log有更新時,更新内容會添加到access檔案中。
輸出到HDFS
然後我嘗試将收集的日志存放到HDFS上。
Fluentd通過webhdfs與HDFS通信,是以需要開啟webhdfs。
設定Hadoop,修改配置檔案hdfs-site.xml,加入:
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.support.append</name>
<value>true</value>
</property>
<property>
<name>dfs.support.broken.append</name>
<value>true</value>
</property>
重新開機Hadoop,建立一個目錄用來存放日志:
hadoop fs -mkdir /log/
hadoop fs -chmod /log/
td-agent配置檔案中source部分不變,修改match部分:
<match td.temp>
type webhdfs
host namenodehost
port
path /log/a.log
flush_interval s
</match>
# flush_interval辨別資料寫入HDFS的間隔
當td-agent與namenode在一台實體機上時可以正常運作,當不在一台實體機上時,報“Connection refused”錯誤。
參考文獻
fluentd官方文檔
http://docs.fluentd.org/articles/quickstart
Fluentd+Hadoop結合進行日志收集、分析
http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=5636
接下來:
td-agent與namenode是否必須在一台實體機上?
現在采用了append的方式,對于HDFS來說效率較低,可以設定一個中間節點,收集了其他節點的日志之後,彙總成大檔案,然後上傳到HDFS。
td-agent的配置檔案格式。
File Input和WebHDFS Output的具體細節。