Flume的TaildirSource配置路径匹配滚动时间(修改源码)

本文介绍了如何修改Flume的TaildirSource源码以支持匹配带时间通配符的目录,并自动创建不存在的父目录。详细讲述了下载源码、分析与修改TaildirSource、ReliableTaildirEventReader和TaildirMatcher等关键部分的代码,以及配置和注意事项,包括可能遇到的问题和解决方案。

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

Flume的TaildirSource配置路径匹配滚动时间(修改源码)

一、背景

最近有个需求,要用flume读取腾讯云CDN的日志,由于日志是运维同学直接挂在到本地服务器上的,每次访问目录下的文件都相当于要与腾讯云之间有个交互,会产生大量的访问量,似乎这部分要收费的,所有要尽可能地少访问。
日志路径如下

/data/cos_dir/tencentcdnlog/2022/04/02/15

在这里插入图片描述
目录是按照时间实时滚动增加的,也就是说16点时02目录下会多一个16的文件夹,16文件夹里会放有那些日志文件
需求:现在要按时间每小时读取对应文件夹下的文件
原本用的采集工具是fluentd,它的采集配置本身支持滚动的时间但现在要用flume了,flume本身是不支持父目录里有通配符的,所以我们需要改下源码
fluentd配置如下

<source>
@type tail
path /data/cos_dir/tencentcdnlog/%Y/%m/%d/%H/*
pos_file /home/john/logs/td-agent/john_cdn_log.log.pos
tag john_cdn_log.bar
read_from_head true
enable_watch_timer false
<parse>
@type none
</parse>
</source>

<match john_cdn_log.bar>
@type kafka_buffered

# list of seed brokers
brokers xxx.xxx.xxx.xxx:9092,xxx.xxx.xxx.xxx:9092,xxx.xxx.xxx.xxx:9092

# buffer settings
buffer_type file
buffer_path /home/john/logs/td-agent/buffer/john_cdn_log/td
buffer_chunk_limit 256m
buffer_queue_limit 64
# 拉取频率
flush_interval 1s
num_threads 2

# topic settings
default_topic john_cdn_log_input

# data type settings
output_data_type attr:message
compression_codec gzip

# producer settings
max_send_retries 1
kafka_agg_max_bytes 1000000
</match>

二、正片(修改TaildirSource源码)

修改完源码后有如下功能:
a、支持带时间通配符的目录
b、支持配置初始化时自动创建不存在的父目录

1、下载源码

本次修改的是1.9版本
官网下载源码包

https://www.apache.org/dyn/closer.lua/flume/1.9.0/apache-flume-1.9.0-src.tar.gz

git上下也行

https://github.com/apache/flume

找到taildirSource对应位置
在这里插入图片描述

2、分析源码

TaildirSource.java

start()方法,主要做三件事,一、开启一个ReliableTaildirEventReader事件监听者,二、开启个线程去校验文件什么时候关闭,三、开启一个线程去维护position位置文件。在这里插入图片描述
configure(Context context)
负责装载配置文件
在这里插入图片描述
process()
负责与channel的交互,把读取到的文件给channel
在这里插入图片描述

ReliableTaildirEventReader.java

看构造方法
会在这里创建TaildirMatcher对象,每个父路径一个对象,待会我们重点改它
在这里插入图片描述
看updateTailFiles(boolean skipToEnd)方法
这个方法很重要,会遍历每个TaildirMatcher(一个TM相当于一个父目录),更新下面的文件信息
在这里插入图片描述
TaildirSource中的process也会调用它
在这里插入图片描述

TaildirMatcher.java

看构造方法
这里,每个TaildirMatcher都会保存一个对应的父目录信息,我们要改的也主要是这里
在这里插入图片描述
这还有个getMatchingFiles()用来更新文件
在这里插入图片描述

3、修改源码

TaildirMatcher.java

主要是在创建TaildirMatcher时,把输入的路径中含有的时间通配符换成了当前时间对应的准确值,由于TaildirMathcer会在一开始判断下配置中给定的文件路径的父目录是否存在,若不存在会报错,而我测试中用的时间目录是精确到分钟的,所以为了我每次启动时不报错,就在配置中加了个配置,让它一开始检测到父目录不存在时可以自动创建父目录
在这里插入图片描述

### 配置 Flume TailDirSource #### 一、理解TailDirSource的工作原理 TailDirSource 是一种用于监控多个文件并实时读取新增内容的数据源。它能够通过指定路径和正则表达式来识别目标文件,并持续跟踪这些文件的新数据,适用于日志文件或其他不断更新的文本文件流处理场景[^2]。 #### 二、创建Flume配置文件 为了设置TailDirSource,在`taildir-hdfs.conf`这样的配置文件中定义相应的参数是非常重要的。下面是一个简单的例子: ```properties # 定义Agent名称及其组件类型 a1.sources = r1 a1.sinks = k1 a1.channels = c1 # 设置sourceTailDirSource a1.sources.r1.type = TAILDIR a1.sources.r1.positionFile = /path/to/position/file # 记录每个被监视文件当前读取位置的状态文件 a1.sources.r1.filegroups = f1 a1.sources.r1.filegroups.f1 = /var/log/test1/\d{8}/.*\.log$ # 使用正则表达式匹配要监听的日志文件路径模式;这里假设日期格式为YYYYMMDD形式存放在test1子目录下的所有.log结尾文件都会被捕获 # 可选属性:忽略已经存在的旧记录,默认false表示不跳过现有内容而从头开始读取 #a1.sources.r1.ignoreExisting = true # Sink部分可以根据实际需求调整,比如发送至HDFS等存储系统 a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://namenode:8020/user/flume/taildir_data/ a1.sinks.k1.hdfs.filePrefix = logs- a1.sinks.k1.hdfs.round = true a1.sinks.k1.hdfs.roundValue = 10 a1.sinks.k1.hdfs.roundUnit = minute # Channel连接source与sink a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # 绑定source, sink 和 channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1 ``` 上述配置展示了如何利用TailDirSource配合其他组件完成基本的任务设定,其中特别注意的是对于filegroups以及其对应的pattern定义,这决定了哪些文件会被纳入到监控范围内[^1]。 #### 三、部署前准备事项 确保所有的依赖库都已正确安装于集群环境中,特别是当自定义拦截器或者其他扩展功能时可能需要用到额外的JAR包。如果是在Cloudera Manager管理的环境下,则应该按照官方指导将必要的资源放置在适当的位置,例如 `/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/flume-ng/lib/` 下面[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值