第1章 简介
在生产环境中,系统应用的日志千奇百怪,千万不能将这些乱七八糟的数据上传到HDFS上之后,再来做数据的清洗整理。通常的做法是,我们再上传HDFS之前,在Flume采集传输的时候,就将日志进行一层过滤和整理,经过这一层整理之后,我们再将数据上传到HDFS,以减少在HDFS上清洗数据的频次。
这里,我们就需要用到Flume拦截器。Flume有很多预置好的拦截器,直接配置Agent即可使用,详见官方手册:https://flume.apache.org/FlumeUserGuide.html#flume-interceptors
本章主要介绍自定义拦截器的基本使用方法。
第2章 创建Maven项目
新建一个Maven项目,在pom.xml添加flume依赖
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-core</artifactId>
<version>1.9.0</version>
</dependency>
建立class继承Interceptor接口,在intercept方法内对event进行获取并处理,最终返回event即可(注:在Flume中,event是数据传输的对象,是Flume的基本单位),代码如下:
package com.lotemall.interceptor;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class LogFormatInterceptor implements Interceptor {
public void initialize() {
}
public Event intercept(Event event) {
/**
* 实现自己对event的逻辑处理,最终返回event(本方法内容仅供参考)。
*/
if (event == null) return null;
Map<String, String> headers = event.getHeaders();
String body = new String(event.getBody());
if (body.indexOf("content:{") <= 0) return null;
String date = body.substring(0, 10);
String country = body.substring(body.indexOf("country") + 10, body.indexOf("area") - 3);
String area = body.substring(body.indexOf("area") + 7, body.length() - 2);
event.setBody(String.format("%s,%s,%s", date, country, area).getBytes());
return event;
}
public List<Event> intercept(List<Event> list) {
List<Event> lst = new ArrayList<Event>();
Iterator<Event> it = list.iterator();
while (it.hasNext()) {
Event event = it.next();
Event eventSingle = intercept(event);
if (eventSingle != null) {
lst.add(eventSingle);
}
}
return lst;
}
public void close() {
}
public static class Builder implements Interceptor.Builder{
public Interceptor build() {
return new LogFormatInterceptor();
}
public void configure(Context context) {
}
}
}
第3章 打包与使用
将编写好的Maven项目打包成jar包,放置Flume的lib目录下,并修改Agent配置文件,添加自定义拦截器内容:
#Interceptor
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.lotemall.interceptor.LogFormatInterceptor$Builder
添加完成后,启动Agent即可生效。