Flume的拦截器很简单,大致操作如下
1、导入flume的jar包
2、准备一个类实现flume提供的interceptor接口,并在其中定义一个静态内部类,实现interceptor的内部接口builder
3、Interceptor的实现类有四个方法,intercept单个event的处理,另一个intercept是处理多个event,close关闭资源、initialize初始化方法
4、Builder的实现类有两个方法,build是如何构造自己的拦截器对象、configure可以获取我们自己编写的agent文件中的配置
5、按照要求的业务逻辑编写号时候,将打好的jar包发送到流程线的第一台flume中的lib目录下,就是在哪个服务器上的flume使用这个jar就放在哪个中
下面给大家准备了一个,通过数据中的第一位数据给数据打上一个是否是数字或字母的标签
要导入的jar
<dependencies>
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>1.7.0</version>
</dependency>
</dependencies>
代码如下
package wy;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.List;
import java.util.Map;
public class MyInter implements Interceptor{
@Override
public void initialize() {
}
@Override
public Event intercept(Event event) {
//取出event的header头数据
Map<String, String> headers = event.getHeaders();
//取出event的body
byte[] body = event.getBody();
//数据不空则处理,这一步就是考虑到意外情况
if(headers!=null && body!=null){
//用body的第一位数据觉得是数值还是字母
if(body[0]>='a' && body[0]<='z' || body[0]>='A' && body[0]<='Z'){
headers.put("type","onnumber");
}else{
headers.put("type","number");
}
}
return event;
}
@Override
public List<Event> intercept(List<Event> list) {
for (Event event : list) {
intercept(event);
}
return list;
}
@Override
public void close() {
}
public static class MyBuilder implements Interceptor.Builder{
@Override
public Interceptor build() {
return new MyInter();
}
@Override
public void configure(Context context) {
}
}
}
如上拦截器使用时,可以使用source的分发功能判断header中的type数据,从而决定发出到不同的channel