flume常用组件模板

本文详细介绍了Flume的配置,包括taildir source用于监控文件夹,kafka source从Kafka消费数据,kafka channel与memory channel、file channel的使用,以及hdfs sink将数据写入HDFS的配置。配置中包含源的拦截器、通道的存储选项和sink的数据滚动策略。

下文中的agent统一取名为a1

#taildir source

a1.sources = r1

a1.sources.r1.type = TAILDIR  #选择source为TAILDIR

a1.sources.r1.filegroups = f1  #需要监控的文件夹组,实现多目录监控

a1.sources.r1.filegroups.f1 = /opt/module/applog/log/app.* # 需要监控的文件夹

a1.sources.r1.positionFile = /opt/module/flume/taildir_position.json # 实现断点续传的临时文件

a1.sources.r1.interceptors =  i1 # 拦截器组,可以自定拦截器

a1.sources.r1.interceptors.i1.type = com.xigema.flume.interceptor.ETLInterceptor$Builder #自定拦截器内部Buider类的包名

#=====================================================================

#kafka source

a1.sources = r1

a1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource # 选择类型为kafka source

a1.sources.r1.kafka.bootstrap.servers = ip地址1:9092,ip地址2:9092,ip地址3:9092 # 需要连接kafka的集群地址,写一个就可以

a1.sources.r1.kafka.topics=topic_log # kafka主题名

a1.sources.r1.interceptors = i1 #拦截器组

a1.sources.r1.interceptors.i1.type= com.xigema.flume.interceptor.TimeStampInterceptor$Builder # 自定义拦截器

a1.sources.r1.batchSize = 5000 # 拉取尺寸的大小

a1.sources.r1.batchDurationMillis = 2000 # 尝试拉取的间隔时间

#=====================================================================

#kafka channel

a1.channels = c1 

a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel # 选择channel类型

a1.channels.c1.kafka.bootstrap.servers = ip地址1:9092,ip地址2:9092 #  选择需要连接的kafka集群

a1.channels.c1.kafka.topic = topic_log # kafka的主题名

a1.channels.c1.parseAsFlumeEvent = false # 去掉头部的信息,使传入kafka的信息为原本信息

#=====================================================================

#memory channel

a1.channels = c1 

a1.channels.c1.type = memory # 选择channel类型

a1.channels.c1.capacity = 1000 # 选择内存存储大小 单位event

a1.channels.c1.transactionCapacity = 100 # 选择抓取尺寸大小

#=====================================================================

#file channel

a1.channels = c1 

a1.channels.c1.type = file #选择channel类型

a1.channels.c1.checkpointDir = /opt/module/flume/checkpoint/behavior1 # 保存的地址

a1.channels.c1.dataDirs = /opt/module/flume/data/behavior1/ # 保存的备份地址

a1.channels.c1.maxFileSize = 2146435071 # 保存的文件大小

a1.channels.c1.capacity = 1000000 # 保存的容量

a1.channels.c1.keep-alive = 6 

在重启flume有时需要将checkpointDir与dataDirs删除

#=====================================================================

#hdfs sink

a1.sinks.k1.type = hdfs # 选择sink类型

a1.sinks.k1.hdfs.path = /origin_data/gmall/log/topic_log/%Y-%m-%d # 保存的hdfs的路径

a1.sinks.k1.hdfs.filePrefix = log- #保存文件的前缀

a1.sinks.k1.hdfs.round = false 

# 控制文件生成的三个参数

a1.sinks.k1.hdfs.rollInterval = 1800 

a1.sinks.k1.hdfs.rollSize = 134217728

a1.sinks.k1.hdfs.rollCount = 0

## 控制输出文件是原生文件。

a1.sinks.k1.hdfs.fileType = CompressedStream

a1.sinks.k1.hdfs.codeC = lzop

### Apache Flume 拦截器的使用与配置 #### 什么是拦截器? 拦截器是 Apache Flume 的一个重要组成部分,主要用于对事件流中的数据进行处理和转换。通过拦截器,可以实现诸如添加元数据、过滤无用的数据、修改事件内容等功能[^1]。 --- #### 常见的内置拦截器及其功能 Flume 提供了一些常用的内置拦截器来简化开发工作: 1. **时间戳拦截器 (TimestampInterceptor)** 时间戳拦截器会自动为每个事件附加当前的时间戳字段。这对于后续基于时间维度分析数据非常有用。 2. **主机名拦截器 (HostInterceptor)** 主机名拦截器会在事件头信息中加入源主机的信息(如 IP 地址或主机名称),便于区分不同来源的数据。 3. **UUID 拦截器 (UuidInterceptor)** UUID 拦截器为每个事件生成唯一的标识符,有助于追踪单个事件在整个流水线中的流动情况。 4. **正则表达式过滤拦截器 (RegexFilterInterceptor)** 正则表达式过滤拦截器可以根据预设的匹配模式筛选符合条件的事件,从而丢弃不需要的日志记录或其他数据。 5. **摩尔斯码拦截器 (MorphlineInterceptor)** MorphlineInterceptor 是一种强大的工具,允许用户编写复杂的 ETL 脚本来执行高级别的日志解析任务。 以上这些标准插件可以直接应用于大多数场景下而无需额外编程支持[^2]。 --- #### 配置拦截器的方法 要启用某个特定类型的拦截器,在 flume-agent.conf 文件里按照如下模板设置即可: ```properties agent.sources.r1.interceptors = i1 agent.sources.r1.interceptors.i1.type = timestamp # 或其他类型比如 host, regex_filter 等 ``` 这里 `i1` 表示第一个使用的拦截器实例名字;`.type` 属性指定了具体采用哪种类别。如果需要同时应用多个,则继续扩展列表项数以及相应参数声明部分。 对于更复杂的情况——例如定制化逻辑或者组合多种行为时,则可能涉及到创建专属类文件并加载至运行环境中去调用它作为新的选项之一参与进来。 --- #### 自定义拦截器的设计思路 当现有的解决方案无法完全适配业务诉求的时候,开发者可以选择自行构建个性化的版本。以下是基本步骤概述: 1. 继承 org.apache.flume.interceptor.Interceptor 接口; 2. 实现 initialize() 方法完成初始化动作; 3. 完成 intercept(Event event) 函数主体用来单独作用于每一个传入对象之上; 4. 如果涉及批量操作的话还需要重写 intercept(List<Event> events); 5. 不忘记释放资源 close(); 下面给出一段简单的例子展示如何增加固定字符串前缀给每条消息体之前的内容片段: ```java public class PrefixAddingInterceptor implements Interceptor { private String prefix; public static class Builder implements Interceptor.Builder { private String prefix; @Override public void configure(Context context) { this.prefix = context.getString("prefix"); } @Override public Interceptor build() { return new PrefixAddingInterceptor(this.prefix); } } private PrefixAddingInterceptor(String prefix){ this.prefix=prefix; } @Override public Event intercept(Event event) { byte[] body=event.getBody(); String oldBody=new String(body); String newBody=this.prefix+oldBody; event.setBody(newBody.getBytes()); return event; } @Override public List<Event> intercept(List<Event> list) { ... } @Override public void close(){} } ``` 之后记得注册该组件并通过适当途径告知系统其存在位置以便动态引入利用起来[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值