Flume中的拦截器(Interceptor)介绍与使用(一)

本文介绍了Flume中的拦截器(interceptor),包括TimestampInterceptor、HostInterceptor、StaticInterceptor和UUIDInterceptor等,通过实例展示了如何配置这些拦截器来实现数据清洗。

Flume中的拦截器(interceptor),用户Source读取events发送到Sink的时候,在events header中加入一些有用的信息,或者对events的内容进行过滤,完成初步的数据清洗。这在实际业务场景中非常有用,Flume-ng 1.6中目前提供了以下拦截器:

Timestamp Interceptor;
Host Interceptor;
Static Interceptor;
UUID Interceptor;
Morphline Interceptor;
Search and Replace Interceptor;
Regex Filtering Interceptor;
Regex Extractor Interceptor;

本文对常用的几种拦截器进行学习和介绍,并附上使用示例。

本文中使用的Source为TaildirSource,就是监控一个文件的变化,将内容发送给Sink,具体可参考《Flume中的TaildirSource》,Source配置如下:

 
  1. #-->设置sources名称
  2. agent_lxw1234.sources = sources1
  3. #--> 设置channel名称
  4. agent_lxw1234.channels = fileChannel
  5. #--> 设置sink 名称
  6. agent_lxw1234.sinks = sink1
  7.  
  8. # source 配置
  9. agent_lxw1234.sources.sources1.type = com.lxw1234.flume17.TaildirSource
  10. agent_lxw1234.sources.sources1.positionFile = /tmp/flume/agent_lxw1234_position.json
  11. agent_lxw1234.sources.sources1.filegroups = f1
  12. agent_lxw1234.sources.sources1.filegroups.f1 = /tmp/lxw1234_.*.log
  13. agent_lxw1234.sources.sources1.batchSize = 100
  14. agent_lxw1234.sources.sources1.backoffSleepIncrement = 1000
  15. agent_lxw1234.sources.sources1.maxBackoffSleep = 5000
  16. agent_lxw1234.sources.sources1.channels = fileChannel

Flume Source中使用拦截器的相关配置如下:

 
  1. ## source 拦截器
  2. agent_lxw1234.sources.sources1.interceptors = i1 i2
  3. agent_lxw1234.sources.sources1.interceptors.i1.type = host
  4. agent_lxw1234.sources.sources1.interceptors.i1.useIP = false
  5. agent_lxw1234.sources.sources1.interceptors.i1.hostHeader = agentHost
  6. agent_lxw1234.sources.sources1.interceptors.i2.type = timestamp
  7.  

对一个Source可以使用多个拦截器。

Timestamp Interceptor

时间戳拦截器,将当前时间戳(毫秒)加入到events header中,key名字为:timestamp,值为当前时间戳。用的不是很多。比如在使用HDFS Sink时候,根据events的时间戳生成结果文件,hdfs.path = hdfs://cdh5/tmp/dap/%Y%m%d

hdfs.filePrefix = log_%Y%m%d_%H

会根据时间戳将数据写入相应的文件中。

但可以用其他方式代替(设置useLocalTimeStamp = true)。

Host Interceptor

主机名拦截器。将运行Flume agent的主机名或者IP地址加入到events header中,key名字为:host(也可自定义)。

根据上面的Source,拦截器的配置如下:

 
  1. ## source 拦截器
  2. agent_lxw1234.sources.sources1.interceptors = i1
  3. agent_lxw1234.sources.sources1.interceptors.i1.type = host
  4. agent_lxw1234.sources.sources1.interceptors.i1.useIP = false
  5. agent_lxw1234.sources.sources1.interceptors.i1.hostHeader = agentHost
  6.  
  7. # sink 1 配置
  8. agent_lxw1234.sinks.sink1.type = hdfs
  9. agent_lxw1234.sinks.sink1.hdfs.path = hdfs://cdh5/tmp/lxw1234/%Y%m%d
  10. agent_lxw1234.sinks.sink1.hdfs.filePrefix = lxw1234_%{agentHost}
  11. agent_lxw1234.sinks.sink1.hdfs.fileSuffix = .log
  12. agent_lxw1234.sinks.sink1.hdfs.fileType = DataStream
  13. agent_lxw1234.sinks.sink1.hdfs.useLocalTimeStamp = true
  14. agent_lxw1234.sinks.sink1.hdfs.writeFormat = Text
  15. agent_lxw1234.sinks.sink1.hdfs.rollCount = 0
  16. agent_lxw1234.sinks.sink1.hdfs.rollSize = 0
  17. agent_lxw1234.sinks.sink1.hdfs.rollInterval = 600
  18. agent_lxw1234.sinks.sink1.hdfs.batchSize = 500
  19. agent_lxw1234.sinks.sink1.hdfs.threadsPoolSize = 10
  20. agent_lxw1234.sinks.sink1.hdfs.idleTimeout = 0
  21. agent_lxw1234.sinks.sink1.hdfs.minBlockReplicas = 1
  22. agent_lxw1234.sinks.sink1.channel = fileChannel
  23.  

该配置用于将source的events保存到HDFS上hdfs://cdh5/tmp/lxw1234的目录下,文件名为lxw1234_<主机名>.log

Static Interceptor

静态拦截器,用于在events header中加入一组静态的key和value。

根据上面的Source,拦截器的配置如下:

 
  1. ## source 拦截器
  2. agent_lxw1234.sources.sources1.interceptors = i1
  3. agent_lxw1234.sources.sources1.interceptors.i1.type = static
  4. agent_lxw1234.sources.sources1.interceptors.i1.preserveExisting = true
  5. agent_lxw1234.sources.sources1.interceptors.i1.key = static_key
  6. agent_lxw1234.sources.sources1.interceptors.i1.value = static_value
  7.  
  8. # sink 1 配置
  9. agent_lxw1234.sinks.sink1.type = hdfs
  10. agent_lxw1234.sinks.sink1.hdfs.path = hdfs://cdh5/tmp/lxw1234
  11. agent_lxw1234.sinks.sink1.hdfs.filePrefix = lxw1234_%{static_key}
  12. agent_lxw1234.sinks.sink1.hdfs.fileSuffix = .log
  13. agent_lxw1234.sinks.sink1.hdfs.fileType = DataStream
  14. agent_lxw1234.sinks.sink1.hdfs.useLocalTimeStamp = true
  15. agent_lxw1234.sinks.sink1.hdfs.writeFormat = Text
  16. agent_lxw1234.sinks.sink1.hdfs.rollCount = 0
  17. agent_lxw1234.sinks.sink1.hdfs.rollSize = 0
  18. agent_lxw1234.sinks.sink1.hdfs.rollInterval = 600
  19. agent_lxw1234.sinks.sink1.hdfs.batchSize = 500
  20. agent_lxw1234.sinks.sink1.hdfs.threadsPoolSize = 10
  21. agent_lxw1234.sinks.sink1.hdfs.idleTimeout = 0
  22. agent_lxw1234.sinks.sink1.hdfs.minBlockReplicas = 1
  23. agent_lxw1234.sinks.sink1.channel = fileChannel

看看最终Sink在HDFS上生成的文件结构:

flume interceptor

UUID Interceptor

UUID拦截器,用于在每个events header中生成一个UUID字符串,例如:b5755073-77a9-43c1-8fad-b7a586fc1b97。生成的UUID可以在sink中读取并使用。根据上面的source,拦截器的配置如下:

 
  1. ## source 拦截器
  2. agent_lxw1234.sources.sources1.interceptors = i1
  3. agent_lxw1234.sources.sources1.interceptors.i1.type = org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder
  4. agent_lxw1234.sources.sources1.interceptors.i1.headerName = uuid
  5. agent_lxw1234.sources.sources1.interceptors.i1.preserveExisting = true
  6. agent_lxw1234.sources.sources1.interceptors.i1.prefix = UUID_
  7.  
  8. # sink 1 配置
  9. agent_lxw1234.sinks.sink1.type = logger
  10. agent_lxw1234.sinks.sink1.channel = fileChannel

运行后在日志中查看header信息:

flume interceptor

Morphline Interceptor

Morphline拦截器,该拦截器使用Morphline对每个events数据做相应的转换。关于Morphline的使用,可参考

http://kitesdk.org/docs/current/morphlines/morphlines-reference-guide.html

后续再研究这块。

### Flume自定义拦截器Interceptor.Builder未找到的解决方案 Flume个分布式、可靠且高可用的日志收集系统。在开发自定义拦截器时,`Interceptor.Builder` 的缺失通常以下几个方面有关:类路径配置错误、依赖版本不匹配或代码实现不符合规范。 以下是解决该问题的具体方法: #### 1. 确保正确实现 `Builder` 接口 Flume 拦截器需要实现 `org.apache.flume.interceptor.Interceptor` 接口,并提供个静态内部类 `Builder`,用于创建拦截器实例[^1]。如果未实现 `Builder` 类,则会引发 `Interceptor.Builder not found` 错误。 以下是个正确的自定义拦截器示例: ```java package com.example.flume.interceptor; import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.interceptor.Interceptor; import java.util.ArrayList; import java.util.List; import java.util.Map; public class CustomInterceptor implements Interceptor { @Override public void initialize() { // 初始化逻辑 } @Override public Event intercept(Event event) { // 自定义事件处理逻辑 return event; } @Override public List<Event> intercept(List<Event> events) { List<Event> intercepted = new ArrayList<>(); for (Event event : events) { intercepted.add(intercept(event)); } return intercepted; } @Override public void close() { // 清理资源 } // 静态内部类 Builder,必须实现 public static class Builder implements Interceptor.Builder { @Override public Interceptor build() { return new CustomInterceptor(); } @Override public void configure(Context context) { // 配置逻辑 } } } ``` #### 2. 检查依赖版本 确保使用Flume 版本拦截器代码兼容。例如,Flume 1.9 和 Flume 1.10 在 API 上可能存在差异[^2]。可以通过以下方式检查依赖版本: - 在 Maven 项目中,检查 `pom.xml` 文件中的 Flume 依赖版本。 - 在 Gradle 项目中,检查 `build.gradle` 文件中的 Flume 依赖版本。 以下是个 Maven 依赖示例: ```xml <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-core</artifactId> <version>1.9.0</version> </dependency> ``` #### 3. 验证类路径配置 如果拦截器 JAR 文件未正确加载到 Flume 的类路径中,也会导致 `Builder` 类找不到。确保自定义拦截器的 JAR 文件已放置在 Flume 的 `lib` 目录下[^3]。 #### 4. 检查 Flume 配置文件 Flume 配置文件中需要正确指定拦截器的全限定类名。例如: ```properties agent.sources.r1.interceptors = i1 agent.sources.r1.interceptors.i1.type = com.example.flume.interceptor.CustomInterceptor$Builder ``` 注意:`type` 属性应指向 `Builder` 类的全限定名。 --- ### 示例代码总结 通过实现 `Interceptor.Builder` 接口并正确配置依赖和类路径,可以有效解决 `Interceptor.Builder not found` 的问题。 ```java // 自定义拦截器实现 public class CustomInterceptor implements Interceptor { public static class Builder implements Interceptor.Builder { @Override public Interceptor build() { return new CustomInterceptor(); } @Override public void configure(Context context) { // 配置逻辑 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值