背景:
現(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ù)進行解碼走不同的程序流程,程序片段如下:
