拦截器
拦截器是处理从source到channel的的数据处理
-
静态拦截器:
#指定拦截器的名字a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = static #指定键的名称 a1.sources.r1.interceptors.i1.key = type #指定值得名称 a1.sources.r1.interceptors.i1.value = access
可以通过%{type}获取对应的值
-
时间戳拦截器:
``` a1.sinks.k1.hdfs.useLocalTimeStamp = true ```
-
自定义拦截器:
流程:-
新建一个类,实现Interceptor接口,重写intercept(Event event)方法
-
新建一个类,实现Interceptor.Builder接口,重写configure(Context context)和build()方法
-
打成jar包放到flume的lib目录下
-
编写相应的flume.conf文件,将type值使用类的全限定名指定我们的拦截器。如果有自定义属性,需要配置该自定义属性。
#加入的依赖 <dependencies> <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-sdk</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>org.apache.flume</groupId> <artifactId>flume-ng-core</artifactId> <version>1.8.0</version> </dependency> </dependencies>
/** * 自定义拦截器,实现Interceptor接口,并且实现其抽象方法 */ public class CustomInterceptor implements Interceptor { //自定义拦截器参数,用来接收自定义拦截器flume配置参数 private static String param = ""; /** * 拦截器构造方法,在自定义拦截器静态内部类的build方法中调用,用来创建自定义拦截器对象。 */ public CustomInterceptor() { } /** * 该方法用来初始化拦截器,在拦截器的构造方法执行之后执行,也就是创建完拦截器对象之后执行 */ @Override public void initialize() { } /** * 用来处理每一个event对象,该方法不会被系统自动调用,一般在 List<Event> intercept(List<Event> events) 方法内部调用。 * * @param event * @return */ @Override public Event intercept(Event event) { /* 这里编写event的处理代码 */ return event; } /** * 用来处理一批event对象集合,集合大小与flume启动配置有关,和transactionCapacity大小保持一致。一般直接调用 Event intercept(Event event) 处理每一个event数据。 * * @param events * @return */ @Override public List<Event> intercept(List<Event> events) { /* 这里编写对于event对象集合的处理代码,一般都是遍历event的对象集合,对于每一个event对象,调用 Event intercept(Event event) 方法,然后根据返回值是否为null, 来将其添加到新的集合中。 */ List<Event> results = new ArrayList<>(); Event event; for (Event e : events) { event = intercept(e); if (event != null) { results.add(event); } } return results; } /** * 该方法主要用来销毁拦截器对象值执行,一般是一些释放资源的处理 */ @Override public void close() { } /** * 通过该静态内部类来创建自定义对象供flume使用,实现Interceptor.Builder接口,并实现其抽象方法 */ public static class Builder implements Interceptor.Builder { /** * 该方法主要用来返回创建的自定义类拦截器对象 * * @return */ @Override public Interceptor build() { return new CustomInterceptor(); } /** * 用来接收flume配置自定义拦截器参数 * * @param context 通过该对象可以获取flume配置自定义拦截器的参数 */ @Override public void configure(Context context) { /* 通过调用context对象的getString方法来获取flume配置自定义拦截器的参数,方法参数要和自定义拦截器配置中的参数保持一致+ */ param = context.getString("param"); } } }
-
配置flume
```
a1.sources.r1.interceptors =i1
a1.sources.r1.interceptors.i1.type =cn.itcast.CustomInterceptor
a1.sources.r1.interceptors.i1.param=ss实现自定义的source
```
实现自定义的source
-
创建一个类,继承自 AbstractSource 并实现 Configurable 和( EventDrivenSource 或者PollableSource )
-
PollableSource是类似于jms类的消息进行推送,要外部驱动来确定source中是否有消息可以使用,EventDrivenSource 不需要外部驱动,得自己实现事件驱动机制
-
实现相关方法,以下是简单的一个生成序列的source
-
需要的jar包flume-ng-configuration-1.7.0.jar, flume-ng-core-1.7.0.jar ,flume-ng-sdk-1.7.0.jar
public class MySource extends AbstractSource implements Configurable,PollableSource { /** *假设没有获取到数据,线程休眠时间,会有一个累计次数与累计次数相乘和最大休眠时间比较 */ @Override public long getBackOffSleepIncrement() { return 0; } /** *假设没有获取到数据,线程休眠的最大时间 */ @Override public long getMaxBackOffSleepInterval() { return 0; } /** *具体执行的逻辑,返回值status只有PollableSource 才需要,记录了每次拉取的状态,出现异常记为BACKOFF,成功记为READY */ @Override public Status process() throws EventDeliveryException { } /** *configure方法主要是放置一些配置信息,在这里把需要的变量定位全局变量 */ @Override public void configure(Context arg0) { } }
将包打包放到lib下
flume的配置:
# 指定Flume source类的路径(要监听的路径)
a1.sources.r1.type = com.harderxin.flume.test.MySource