flume拦截器及问题解决

概述

Flume 除了主要的三大组件 Source、Channel和 Sink,还有一些其他灵活的组件,如拦截器、SourceRunner运行器、Channel选择器和Sink处理器等。

组件框架图

今天主要来看看拦截器,先看下组件框架流程图,熟悉了大致框架流程学习起来必然会更加轻松: 

  1. 接收事件
  2. 根据配置选择对应的Source运行器(EventDrivenSourceRunner 和 PollableSourceRunner)
  3. 处理器处理事件(Load-Balancing Sink 和 Failover Sink 处理器)
  4. 将事件传递给拦截器链
  5. 将每个事件传递给Channel选择器
  6. 返回写入事件的Channel列表
  7. 将所有事件写入每个必需的Channel,只有一个事务被打开
  8. 可选Channel(配置可选Channel后不管其是否写入成功)

拦截器

拦截器(Interceptor)是简单插件式组件,设置在Source和Channel之间,Source接收到event在写入到对应的Channel之前,可以通过调用的拦截器转换或者删除过滤掉一部分event。通过拦截器后返回的event数不能大于原本的数量。在一个Flume 事件流程中,可以添加任意数量的拦截器转换或者删除从单个Source中来的事件,Source将同一个事务的所有事件event传递给Channel处理器,进而依次可以传递给多个拦截器,直至从最后一个拦截器中返回的最终事件event写入到对应的Channel中。 
flume-1.7版本支持的拦截器: 

编写自定义拦截器

自定义的拦截器编写,我们只需要实现一个Interceptor接口即可,该接口的定义如下:

 
 
 
  1. public interface Interceptor {
  2. /* 任何需要拦截器初始化或者启动的操作就可以定义在此,无则为空即可 */
  3. public void initialize();
  4. /* 每次只处理一个Event */
  5. public Event intercept(Event event);
  6. /* 量处理Event */
  7. public List<Event> intercept(List<Event> events);
  8. /*需要拦截器执行的任何closing/shutdown操作,一般为空 */
  9. public void close();
  10. /* 获取配置文件中的信息,必须要有一个无参的构造方法 */
  11. public interface Builder extends Configurable {
  12. public Interceptor build();
  13. }
  14. }

接口中的几个方法或者内部接口含义代码中已经标注,需要留意的地方就是考虑到多线程运行Source时,需要保证编写的代码是线程安全的。这里就不展示自定义拦截器代码了,仿照已有的拦截器,可以很容易的编写一个简单功能的自定义拦截器的。

实际使用及问题

问题:

目前环境中使用的都是tailSource、hdfsSink,在sink时根据时间对日志分割成不同的目录,但是实际过程中存在一些延迟,导致sink写入hdfs时的时间和日志文件中记录的时间存在一些差异;并且不能保留原有的日志文件名。

需求:
  1. 根据日志中记录的时间对文件进行分目录存储
  2. 将source端读取的日志名字符串添加至hdfsSink写入hdfs的文件名中(在hdfs文件中可以根据文件名区分日志)
日志格式如下:
 
 
 
  1. 2017/01/13 13:30:00 ip:123.178.46.252 message:[{ "s":"bbceif1484117100097","u":"354910072847819","id":"2x1kfBk63z","e":
  2. 2017/01/13 14:50:00 ip:123.178.46.252 message:[{ "s":"bbceif1484117100097","u":"354910072847819","id":"2x1kfBk63z","e":
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值