業務場景:
需求:通過flume進行數據采集,將本地(windows服務器)不斷產生的csv文件采集到hdfs上。
問題:本地文件在生成的過程中,會出現文件名重復的現象。也就是說,在前一秒生成文件名為aaa.csv,該文件經過flume進行處理之后會進行文件名的更改,默認情況下文件名會更改為aaa.csv.COMPLATED,但是在第二秒的時候,接着又生成了aaa.csv文件,此時flume將該文件處理完進行更名的過程中,就會報錯,例如:
解決:為了避免文件名重復導致flume程序掛的問題,此時有兩種解決方案:
1:在生成aaa.csv的過程中對該文件名增加唯一標識
2:flume在采集文件結束后,更改文件名的時候,對其做唯一標識
這里主要介紹第二種方式,通過修改源碼的方式。
一、flume源碼的下載,導入,編譯
這里我使用的是flume1.9版本
1 下載
flume包下載:程序包下載
flume源碼下載:源碼下載
2 導入IDEA
將源碼包進行解壓,解壓之后,解壓之后,目錄結果如下:
IDEA進行項目的導入
一直點擊next,
導入成功之后,項目結構如下所示:
可以看到項目結構式通過各個model來構成的。
3 編譯
執行命令:mvn clean install -Dmaven.test.skip=true
看到BUILD SUCCESS則代表編譯成功,可進行下一步
源碼修改
這里需要找到flume在采集完數據之后進行移動目錄的那個類,這個類一般都是在flume-ng-core這個model下,但是具體是那個類,我們可以從flume采集日志中進行尋找,
從這個日志中可以看到,flume在采集完文件后需要對源文件進行一個移動操作,而也就是在此時進行對文件更名,所以我們可以在源碼中找到這個類,通過全局搜索
紅框這里就是flume采集完數據之后對源文件進行更改名稱的地方,默認的名稱是”.COMPLATED”,此時我們如果為了給文件進行唯一性區分,我這里采用增加時間戳的方式:
添加完成之后,對該類進行重新編譯,唉對應target文件中找到對應的class文件,將其復制,拷貝替換到線上flume的lib目錄下的flume-ng-core.jar包中即可。當然也可以對整個項目進行重新編譯打包,只不過那樣的話比較麻煩一點而已。
將上面這個jar包使用360壓縮一起其他的壓縮工具打開,將編譯好的class文件覆蓋進去即可
然后從新運行flume,可以看到,此時文件名的后綴就會變成:
成功實現。










