flume修改源碼實現source文件名前后綴的更改


業務場景:

需求:通過flume進行數據采集,將本地(windows服務器)不斷產生的csv文件采集到hdfs上。

問題:本地文件在生成的過程中,會出現文件名重復的現象。也就是說,在前一秒生成文件名為aaa.csv,該文件經過flume進行處理之后會進行文件名的更改,默認情況下文件名會更改為aaa.csv.COMPLATED,但是在第二秒的時候,接着又生成了aaa.csv文件,此時flume將該文件處理完進行更名的過程中,就會報錯,例如:

ED1C3E2B-E2D0-4a01-9DC5-240D660057AA

解決:為了避免文件名重復導致flume程序掛的問題,此時有兩種解決方案:

1:在生成aaa.csv的過程中對該文件名增加唯一標識

2:flume在采集文件結束后,更改文件名的時候,對其做唯一標識

這里主要介紹第二種方式,通過修改源碼的方式。

一、flume源碼的下載,導入,編譯

這里我使用的是flume1.9版本

1 下載

    flume包下載:程序包下載

    flume源碼下載:源碼下載

2 導入IDEA

將源碼包進行解壓,解壓之后,解壓之后,目錄結果如下:

image

IDEA進行項目的導入

image

image

一直點擊next,

image

導入成功之后,項目結構如下所示:

image

可以看到項目結構式通過各個model來構成的。

3 編譯

執行命令:mvn clean install -Dmaven.test.skip=true

image

看到BUILD SUCCESS則代表編譯成功,可進行下一步

源碼修改

這里需要找到flume在采集完數據之后進行移動目錄的那個類,這個類一般都是在flume-ng-core這個model下,但是具體是那個類,我們可以從flume采集日志中進行尋找,

image

從這個日志中可以看到,flume在采集完文件后需要對源文件進行一個移動操作,而也就是在此時進行對文件更名,所以我們可以在源碼中找到這個類,通過全局搜索

image

紅框這里就是flume采集完數據之后對源文件進行更改名稱的地方,默認的名稱是”.COMPLATED”,此時我們如果為了給文件進行唯一性區分,我這里采用增加時間戳的方式:

image

添加完成之后,對該類進行重新編譯,唉對應target文件中找到對應的class文件,將其復制,拷貝替換到線上flume的lib目錄下的flume-ng-core.jar包中即可。當然也可以對整個項目進行重新編譯打包,只不過那樣的話比較麻煩一點而已。

image

將上面這個jar包使用360壓縮一起其他的壓縮工具打開,將編譯好的class文件覆蓋進去即可

然后從新運行flume,可以看到,此時文件名的后綴就會變成:

image

成功實現。


免責聲明!

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



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