在source读取文件时,定义拦截器:
咱们对source 读取到的event进行分辨
event: header, body
如果body 内容hello 开头 则给当前的event header 打入hello标签
如果body 内容hi 开头 则给当前的event header 打入hi 标签
maven需要这个 :
<dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-core</artifactId> <version>1.6.0</version> </dependency>
java代码,一小例子:
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 IntercaptorDemo implements Interceptor { ArrayList<Event> addHeaderEvents = null; //初始化拦截器 @Override public void initialize() { addHeaderEvents = new ArrayList<>(); } //拦截器实现 @Override public Event intercept(Event event) { Map<String, String> headers = event.getHeaders(); byte[] body = event.getBody(); String bodyStr = new String(body); if (bodyStr.startsWith("hello")){ headers.put("type","hello"); } else if (bodyStr.startsWith("hi")) { headers.put("type","he"); }else { headers.put("type","other"); } return event; } //把接收到的event集合进行处理 @Override public List<Event> intercept(List<Event> list) { addHeaderEvents.clear(); for (Event e:list){ Event opEvent = intercept(e); addHeaderEvents.add(opEvent); } return addHeaderEvents; } //释放资源 @Override public void close() { addHeaderEvents.clear(); addHeaderEvents=null; } //builder名称可以自己定义 //可以用这种语法,来创建拦截器对象,build() public static class Builder implements Interceptor.Builder{ @Override public Interceptor build() { return new IntercaptorDemo(); } @Override public void configure(Context context) { } } }
写好,打包,放在flume/lib下
再在flume配置文件里加这2句就好了,sources部分
第一句是:定义拦截器的名称
第二句是:创建拦截器对象吧,(全类名,加,$之前代码里实现拦截器builder的类名)
a.sources.interceptorSource.interceptors = interceptor111
a.sources.interceptorSource.interceptors.interceptor111.type = cn.flume.InterceptorDemo$Builder