下载源码
flume-ng-1.6.0-cdh5.7.0-src.tar.gz
flume-ng-1.6.0-cdh5.7.0 源码编译
https://blog.csdn.net/qq_38976805/article/details/102658779
修改源码
打开 org.apache.flume.source.taildir.ReliableTaildirEventReader类
找到 getMatchFiles 方法
路径 flume-ng-1.6.0-cdh5.7.0/flume-ng-sources/flume-taildir-source/src/main/java/org/apache/flume/source/taildir
private List<File> getMatchFiles(File parentDir, final Pattern fileNamePattern) {
FileFilter filter = new FileFilter() {
public boolean accept(File f) {
String fileName = f.getName();
if (f.isDirectory() || !fileNamePattern.matcher(fileName).matches()) {
return false;
}
return true;
}
};
File[] files = parentDir.listFiles(filter);
ArrayList<File> result = Lists.newArrayList(files);
Collections.sort(result, new TailFile.CompareByLastModifiedTime());
return result;
}
上面这段flume源代码的作用是:
1、获取监听目录下所有符合正则匹配规则的文件,放入集合中并返回
2、taildir source 就是判断去这个方法返回的所有文件,查看文件中是否是新增或被修改过,然后读取根据偏移量读取文件内容的
因此taildir支持递归的关键在与获取监听文件夹下的所有子文件,包括其子文件夹下的文件
修改后的代码(包含两个新增方法)
/**
* 修改flume源码,使其支持递归
* @param parentDir
* @param fileNamePattern
* @return
*/
private List<File> getMatchFiles(File parentDir, final Pattern fileNamePattern) {
//所有指定文件夹下的所有文件,在通过正则匹配规则过滤不符合条件的文件
List<File> result = Lists.newArrayList();
for(File f: getAllFiles(parentDir)){
String fileName = f.getName();
if (fileNamePattern.matcher(fileName).matches()) {
result.add(f);
}
}
Collections.sort(result, new TailFile.CompareByLastModifiedTime());
return result;
}
/**
* 新增方法
* 获取指定目录下的所有文件,通过递归的方式
* @param parentDir
* @return
*/
private List<File> getAllFiles(File parentDir){
List<File> fileList = Lists.newArrayList();
getAllFiles(parentDir,fileList);
return fileList;
}
/**
* 新增方法
*/
private void getAllFiles(File parentDir,List<File> fileList){
File[] files = parentDir.listFiles();
if(null != files){
for(File file: parentDir.listFiles()){
if(file.isDirectory()){
getAllFiles(file,fileList);
}else{
fileList.add(file);
}
}
}
}
编译
cd flume-ng-1.6.0-cdh5.7.0/flume-ng-1.6.0-cdh5.7.0/flume-ng-sources/flume-taildir-source
mvn clean package
#构建成功后将 target下的 flume-taildir-source-1.6.0-cdh5.7.0.jar 拷贝到flume应用程序的lib下
测试
编辑flume配置文件
a1.sources=r1
a1.sinks=k1
a1.channels=c1
a1.sources.r1.type=TAILDIR
a1.sources.r1.bind = hadoop001
a1.sources.r1.port = 44444
a1.sources.r1.filegroups=f1
a1.sources.r1.filegroups.f1=/tmp/flume/.*.log
a1.sources.r1.positionFile=/tmp/flume/position/taildir_position.json
a1.sources.r1.headers.f1.headerKey1=value1
a1.sinks.k1.type=logger
a1.channels.c1.type=memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
flume-ng agent --name a1 --conf-file /home/hadoop/script/flume/simple.conf --conf $FLUME_HOME/conf -Dflume.root.logger=INFO,console
#新建窗口
mkdir -p /tmp/flume/f/f1/f2
echo "666" >> /tmp/flume/f/f1/f2/test.log
2019-11-30 11:11:29,112 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO - org.apache.flume.sink.LoggerSink.process(LoggerSink.java:95)] Event: { headers:{headerKey1=value1} body: 36 36 36 666 }