背景:
現(xiàn)項目從外圍數(shù)據(jù)接收到文件通過Flume-ng同步到hdfs上兆览,但Flume只能根據(jù)sink配置到指定目錄悼沈,無法根據(jù)文件名生成相應(yīng)的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/
可能導(dǎo)入到myeclipse或idel中進行mvn編譯下載依賴的包(MVN請自行配置井辆,最好用國內(nèi)阿里的鏡像庫关筒,不要把時間浪費在等待上。)
從sink中讀取文件寫入到HDFS是由process()方法完成杯缺。
從上以代碼可以看到realPath,realName即是要寫入到hdfs的路徑及文件名蒸播,以下代碼也可以驗證。
我們只需要更改process中realPath的值即可實現(xiàn)根據(jù)文件名realName解析生成路徑萍肆,以下代碼為代碼片碼:
因為我們要測試所以嚴(yán)格按照日期格式為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進行編譯。會在你的工程下面生成相應(yīng)的class文件
5赞草、把系統(tǒng)中的flume-hdfs-sink-1.6.0-cdh5.14.0.jar用winRAR打開
6讹堤、把第四步編譯好的HDFSEventSink.class復(fù)到flume-hdfs-sink-1.6.0-cdh5.14.0.jar即可,并?上傳到flume/lib下厨疙。
7洲守、測試在把文件2018070304112301859017101.txt.gz復(fù)制到flume配置的源目錄中(spooldir中)
8、在hdfs中正常生成文件及目錄正常復(fù)制到hdfs路徑下沾凄。
注:更通用的辦法是在flume的配置文件中自己定義參數(shù)在configure進行取值梗醇,根據(jù)取的參數(shù)進行解碼走不同的程序流程,程序片段如下: