Flume TaildirSource 实现递归

博客介绍了Flume源码的操作流程,包括下载flume-ng-1.6.0-cdh5.7.0-src.tar.gz源码,修改org.apache.flume.source.taildir.ReliableTaildirEventReader类的getMatchFiles方法,阐述其作用及taildir支持递归的关键,给出修改后代码,还提及编译、测试及配置文件编辑,最后指出apace-flume-1.8.0版本源码有改动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载源码

       flume-ng-1.6.0-cdh5.7.0-src.tar.gz

修改源码

       打开 org.apache.flume.source.taildir.ReliableTaildirEventReader类

       找到 getMatchFiles 方法

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);
    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-src/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.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
bin/flume-ng agent --conf conf --conf-file conf/taildir-channels-logger.conf --name a1 -Dflume.root.logger=INFO,console

#新建窗口
mkdir -p /tmp/flume/f/f1/f2
echo "666" >> /tmp/flume/f/f1/f2/test.log


#控制台打印日志
2019-06-20 21:12:23,352 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO -org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{headerKey1=value1} body: 36 36 36                                        666 }

扩展

    apace-flume-1.8.0版本中这部分源码已经被改了,所以这里不适用。不过原理都是一样的。后续有空在修改。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值