Flume同步到hdfs上根據(jù)文件名自動創(chuàng)建目錄源碼更改

背景:

現(xiàn)項目從外圍數(shù)據(jù)接收到文件通過Flume-ng同步到hdfs上,但Flume只能根據(jù)sink配置到指定目錄,無法根據(jù)文件名生成相應的hdfs目錄。

例如: 文件2018070304112301859017101.txt.gz要放到HDFS的路徑/home/hadoop/netlog/source/201807/20180703/2018070304下

通過走讀代碼更改org.apache.flume.sink.hdfs.HDFSEventSink即可。

從CDH網(wǎng)站上下載flume的源碼:

下載

地址:http://archive.cloudera.com/cdh5/cdh/5/

可能導入到myeclipse或idel中進行mvn編譯下載依賴的包(MVN請自行配置,最好用國內阿里的鏡像庫,不要把時間浪費在等待上。)

從sink中讀取文件寫入到HDFS是由process()方法完成。


從上以代碼可以看到realPath,realName即是要寫入到hdfs的路徑及文件名,以下代碼也可以驗證。


我們只需要更改process中realPath的值即可實現(xiàn)根據(jù)文件名realName解析生成路徑,以下代碼為代碼片碼:

因為我們要測試所以嚴格按照日期格式為2018開始后6位全是數(shù)字這種格式來做正則匹配。

如果覺得MVN編輯太慢或有些依賴包無法下載,可以采取以下簡單辦法。

1、新建一個包 包的名字org.apache.flume.sink.hdfs

即HDFSEventSink.java 中包的定義package org.apache.flume.sink.hdfs;

2、在此包下新建class ,名字HDFSEventSink

3、把flume/lib下的jar包全部引入到此工程中,解決代碼中的錯誤

4、對新建的HDFSEventSink進行編譯。會在你的工程下面生成相應的class文件


5、把系統(tǒng)中的flume-hdfs-sink-1.6.0-cdh5.14.0.jar用winRAR打開

6、把第四步編譯好的HDFSEventSink.class復到flume-hdfs-sink-1.6.0-cdh5.14.0.jar即可,并?上傳到flume/lib下。

7、測試在把文件2018070304112301859017101.txt.gz復制到flume配置的源目錄中(spooldir中)

8、在hdfs中正常生成文件及目錄正常復制到hdfs路徑下。

注:更通用的辦法是在flume的配置文件中自己定義參數(shù)在configure進行取值,根據(jù)取的參數(shù)進行解碼走不同的程序流程,程序片段如下:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容