在第一篇文章中我們是将log4j的日志輸出到了agent的日志檔案當中。配置檔案如下:
tier1.sources=source1
tier1.channels=channel1
tier1.sinks=sink1
tier1.sources.source1.type=avro
tier1.sources.source1.bind=0.0.0.0
tier1.sources.source1.port=44444
tier1.sources.source1.channels=channel1
tier1.channels.channel1.type=memory
tier1.channels.channel1.capacity=10000
tier1.channels.channel1.transactioncapacity=1000
tier1.channels.channel1.keep-alive=30
tier1.sinks.sink1.type=logger
tier1.sinks.sink1.channel=channel1
本次我們把log4j的日志直接采集輸出到hdfs中去。需要修改flume.conf中sink的配置:
tier1.sinks.sink1.type=hdfs
tier1.sinks.sink1.hdfs.path=hdfs://master68:8020/flume/events
tier1.sinks.sink1.hdfs.filetype=datastream
tier1.sinks.sink1.hdfs.writeformat=text
tier1.sinks.sink1.hdfs.rollinterval=0
tier1.sinks.sink1.hdfs.rollsize=10240
tier1.sinks.sink1.hdfs.rollcount=0
tier1.sinks.sink1.hdfs.idletimeout=60
簡單說明一下修改的部分,我們将sink的type由logger變為hdfs,然後指定輸出path, 預設是輸出到hdfs後為sequencefile,裡面的内容無法直接打開浏覽,為了便于直覺看到我們輸出的日志資訊,是以我這裡将filetype為datastream, writeformat=text,這樣就可以直接打開生成的檔案進行檢視了。
下面幾個roll開頭的參數都是用來控制滾動日志輸出的,官方文檔上的說明也很詳細,我這裡配置的隻按檔案大小來滾動rollsize=10240,也就是10k滾動生成一個新的檔案用來接收新的events。實際中這個size應該更大一些,我覺得設定成hdfs的blocksize大小應該挺合适的。
idletimeout設定為60秒(預設值為0),這裡面的原理是這樣的,flume裡面每生成一個接收檔案時的命名規則如:flumedata.1406251462179.tmp,.tmp表示這個檔案正在被使用來接收events,當滿10k之後,這個檔案會被rename成flumedata.1406251462179,把.tmp字尾去掉,但是如果你停止了應用程式後,flumedata.1406251462179.tmp還沒滿10k,按照預設的idletimeout設定,不會将它rename,也就是.tmp字尾一直在,造成了這個檔案一直在使用當中的一個假象,這是有問題的,我們設定idletimeout=60,即60秒後這個檔案還沒有被寫入資料,就會關閉它然後rename它去掉.tmp,以後新進來的events,會新開一個.tmp檔案來接收。
我們再運作第一篇文章中的那個示例應用程式,然後去path指定的目錄下面就能看到log4j輸出的日志資訊了。
補充注意點(針對cm安裝的flume):
首先在hdfs上建立/flume目錄:hadoop fs -mkdir /flume
給該目錄授權給flume使用者群組:hadoop fs -chown -r flume:flume /flume
注意給目錄授權很重要,不然會報錯。