记录一次修改flume1.9 taildir source

记录一次修改flume1.9 taildir source,第1张

记录一次修改flume1.9 taildir source

在测试代码中发现taildir不支持windows。且要上传很多小文件并记录文件名字。

使其支持windows很多大佬已经做到,我也是站在巨人的肩膀上,copy他们的。

这里记录修改taildir使其支持windows路径

  1. 在不断的了解flume机制的同时发现了根本问题,hdfs路径不支持冒号作为路径

因为我们获取到的fileHeaderKey 是绝对路径,所以是有冒号

fileHeader 设置为 true ,可以将日志文件的绝对路径存储在事件的header中;
fileHeaderKey 目前来说不需要设置,它指定了存储在header中路径的key 名(header中是以key-value对存储),默认为 file。

例如:Event: { headers:{timestamp=1452581700000, file=D:flume32-FGD1SAN-5-25UNIT1.log} body: 32 30 31 36 2F 30 31 2F 31 32 20 31 34 3A 35 35 2016/01/12 14:55 }

因为hdfsSink可以直接从事件的header中读取字串作为hdfs文件名的一部分,可以通过将日志文件名添加至header中来实现。

通过debug flume的源码 (ReliableTaildirEventReader) 发现fileHeaderKey返回的是绝对路径的所有,那我们只需要把D:去掉就行了,以及把“”转换成“/”。

修改后代码

    Map headers = currentFile.getHeaders();
    if (annotateFileName || (headers != null && !headers.isEmpty())) {
      for (Event event : events) {
        if (headers != null && !headers.isEmpty()) {
          event.getHeaders().putAll(headers);
        }
        if (annotateFileName) {
          //源码
//          event.getHeaders().put(fileNameHeader,
//                  currentFile.getPath();

          //修改后
          event.getHeaders().put(fileNameHeader,
                  currentFile.getPath().substring(2).replaceAll("\\", "/"));

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5696443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存