Flume TaildirSource 实现递归

下载源码

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值