解決Flume采集數據時在HDFS上產生大量小文件的問題


問題:flume指定HDFS類型的Sink時,采集數據至HDFS指定目錄,會產生大量小文件。

 

問題重現:

1、創建flume配置文件flume-env.sh,:

flume配置文件如下(根據自身需要修改):

    因為flume可以配置多種采集方式,每種采集方式對應一個agent配置文件,flume即通過運行agent完成采集工作,這里為了方便重現問題,直接監控整個目錄。

flume的agent配置文件如下(根據自身需要修改):

 

2、建立待監控目錄:

 

3、執行flume的agent

/mnt/disk1/apache-flume-1.7.0-bin/bin/flume-ng agent -n a1 -c /root/flume_conf_jbw -f /root/flume_agent_conf_jbw/a1.conf -Dflume.root.logger=INFO,console

a1為agent的名稱
a1.conf為flume配置文件的名稱
-c指向log4j.properties文件和flume_env.sh文件所在目錄。
--Dflume.root.logger=INFO,console 在終端輸出運行日志

 

    可見以采集完成的 文件會加上.COMPLETE后綴,注意,若此時再在監控目錄新建同名文件,flume會報錯,因為采集完成后會產生相同的文件名的文件。若發生此情況,需要重新運行flume的agent。

    在HDFS目錄上查看采集到的數據,內容如下,零散小文件:

 

解決方案:

檢查flume配置文件

    

a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.round=true
a1.sinks.k1.hdfs.round=true,

將以上三行刪除,新增如下兩行

a1.sinks.k1.hdfs.rollSize=0
a1.sinks.k1.hdfs.rollCount=0

再次重啟Flume客戶端采集即可。可見不再是小文件了,如下:

 

分析原因:

    Flume可以設置文件

查閱flume配置參數,如下:

rollSize
默認值:1024,當臨時文件達到該大小(單位:bytes)時,滾動成目標文件。如果設置成0,則表示不根據臨時文件大小來滾動文件。

rollCount
默認值:10,當events數據達到該數量時候,將臨時文件滾動成目標文件,如果設置成0,則表示不根據events數據來滾動文件。

round
默認值:false,是否啟用時間上的”舍棄”,類似於”四舍五入”,如果啟用,則會影響除了%t的其他所有時間表達式;

roundValue
默認值:1,時間上進行“舍棄”的值;

roundUnit

默認值:seconds,時間上進行”舍棄”的單位,包含:second,minute,hour

當設置了round、roundValue、roundUnit參數收,需要在sink指定的HDFS路徑上指定按照時間生成的目錄的格式,例如有需求,每采集1小時就在HDFS目錄上生成一個目錄,里面存放這1小時內采集到的數據。

編寫sink部分的配置文件如下:

a1.sinks.k1.hdfs.path = hdfs://nameservice1/tmp/flume/jbw/%y-%m-%d/%H%M%S
a1.sinks.k1.hdfs.round = true
a1.sinks.k1.hdfs.roundValue = 60
a1.sinks.k1.hdfs.roundUnit = minute

當時間為2018-6-7 17:38:59時候,hdfs.path依然會被解析為:

/flume/events/20151016/17:30/00
因為設置的是舍棄10分鍾內的時間,因此,該目錄每10分鍾新生成一個。

此時,若當時間為2018-6-7 10:00:00時候,hdfs.path會被解析為:

hdfs://nameservice1/tmp/flume/jbw/20180607/10:00:00

在時間為2018-6-7 10:59:59時候,hdfs.path依舊會被解析為:

hdfs://nameservice1/tmp/flume/jbw/20180607/10:00:00

在時間為2018-6-7 11:02:00時候,hdfs.path則會被解析為:

hdfs://nameservice1/tmp/flume/jbw/20180607/11:00:00

本次產生大量小文件的原因就是hdfs.path中沒有指定對應的目錄日期對應格式(%y-%m-%d/%H%M%S)。

 

解決方案:

去掉round時間系列參數,並將rollSize和rollCount置0,表示不根據臨時文件大小和event數量來滾動文件(滾動文件即指將HDFS上生成的以.tmp結尾的臨時文件轉換為實際存儲文件)。當然,也可以調大rollSize參數(如調至100000000,表示100MB滾動文件,單位是bytes)。

 

PS:網上還有另一種出現大量小文件對應的解決方案,即設置a1.sinks.k1.hdfs.minBlockReplicas=1。因為文件會因為所在塊的復制而滾動文件。  

 


免責聲明!

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



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