Apache Flume
拦截器
作用于Source组件,对Source封装的Event数据进行拦截或者是装饰 ,Flume内建了许多拦截器
- Timestamp Interceptor
该拦截器将事件处理的时间(以毫秒为单位)插入到事件标头中。此拦截器将插入一个具有关键timestamp 的标头(或由header属性指定),其值是相关的时间戳记。如果配置中已经存在该时间戳,则该拦截器可以保留现有时间戳。
- Host Interceptor
该拦截器将插入正在运行该代理的主机的主机名或IP地址。它会根据配置插入带有密钥主机或已配置密钥的标头,其值是主机的主机名或IP地址。
- Static Interceptor
静态拦截器允许用户向所有事件添加带有静态值的静态标头。 - Remove Header Interceptor
该拦截器通过删除一个或多个标头来操纵Flume事件标头。它可以删除静态定义的标头,基于正则表达式的标头或列表中的标头。如果这些都没有定义,或者没有标题与条件匹配,则不会修改Flume事件。
物业名称 默认 描述
类型 – 组件类型名称必须为remove_header
withName – 要删除的标题的名称
fromList – 要删除的标头列表,由fromListSeparator指定的分隔符分隔
fromListSeparator \ s *,\ s * 正则表达式,用于分隔fromList指定的列表中的多个标头名称。默认为逗号,由任意数量的空格字符包围
匹配 – 名称与该正则表达式匹配的所有标头都将被删除
- UUID Interceptor
该拦截器在所有被拦截的事件上设置一个通用的唯一标识符。示例UUID是b5755073-77a9-43c1-8fad-b7a586fc1b97,它表示128位值。
如果没有可用的事件级别的应用程序唯一键,请考虑使用UUIDInterceptor为事件自动分配UUID。在事件进入Flume网络后立即为事件分配UUID,这一点很重要。也就是说,在流的第一个Flume Source中。面对旨在实现高可用性和高性能的Flume网络中的复制和重新交付,这可以实现事件的后续重复数据删除。如果应用程序级别密钥可用,则它比自动生成的UUID更好,因为它允许使用所述众所周知的应用程序级别密钥对数据存储中的事件进行后续更新和删除。
- Search and Replace Interceptor
该拦截器基于Java正则表达式提供简单的基于字符串的搜索和替换功能。还可以进行回溯/组捕获。该拦截器使用与Java Matcher.replaceAll()方法相同的规则。
- Regex Filtering Interceptor
该拦截器通过将事件主体解释为文本并将文本与已配置的正则表达式进行匹配来选择性地过滤事件。提供的正则表达式可用于包含事件或排除事件。
- Regex Extractor Interceptor
该拦截器使用指定的正则表达式提取正则表达式匹配组,并将匹配组附加为事件的标头。它还支持可插入序列化程序,用于在将匹配组添加为事件标头之前对其进行格式化。
启动flume
[root@Centos ~]# cd /usr/apache-flume-1.9.0-bin/
[root@Centos apache-flume-1.9.0-bin]# ./bin/flume-ng version
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9
案例一装饰头:
创建example11.properties
[root@Centos conf]# vim example11.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = Centos
a1.sources.s1.port = 44444
# 添加拦截器
a1.sources.s1.interceptors = i1 i2 i3 i4
a1.sources.s1.interceptors.i1.type = timestamp
a1.sources.s1.interceptors.i2.type = host
a1.sources.s1.interceptors.i3.type = static
a1.sources.s1.interceptors.i3.key = from
a1.sources.s1.interceptors.i3.value = baizhi
a1.sources.s1.interceptors.i4.type=org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder
a1.sources.s1.interceptors.i4.headerName = uuid
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动flume
[root@Centos apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example11.properties -Dflume.root.logger=INFO,console
启动netcat 输入数据
[root@Centos ~]# telnet Centos 44444
Trying 192.168.17.150...
Connected to Centos.
Escape character is '^]'.
todat this is a demo
OK
today is 2020 0601
OK
hello world
OK
happy every day
OK
flume端结果
表头里存在装饰信息
案例二查找替换拦截器
删除案例一中的from消息头,并且查找替换以jiansiyu为开头的输入数据,修改为handsome and violent
创建文件example12.properties
[root@Centos conf]# vim example12.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = Centos
a1.sources.s1.port = 44444
# 添加拦截器
a1.sources.s1.interceptors = i1 i2 i3 i4 i5 i6
a1.sources.s1.interceptors.i1.type = timestamp
a1.sources.s1.interceptors.i2.type = host
a1.sources.s1.interceptors.i3.type = static
a1.sources.s1.interceptors.i3.key = from
a1.sources.s1.interceptors.i3.value = baizhi
a1.sources.s1.interceptors.i4.type =org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder
a1.sources.s1.interceptors.i4.headerName = uuid
a1.sources.s1.interceptors.i5.type = remove_header
a1.sources.s1.interceptors.i5.withName = from
a1.sources.s1.interceptors.i6.type = search_replace
a1.sources.s1.interceptors.i6.searchPattern = ^jiangsiyu
a1.sources.s1.interceptors.i6.replaceString = handsome and violent
# 配置Sink组件,将接收数据打印在⽇志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动flume
[root@Centos apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example12.properties -Dflume.root.logger=INFO,console
启动netcat 输入数据
[root@Centos ~]# telnet Centos 44444
Trying 192.168.17.150...
Connected to Centos.
Escape character is '^]'.
this is a demo
OK
my name is jiangsiyu
OK
jiangsiyu is here
OK
flume端结果
from消息头移除 如果jiangsiyu是数据消息的第一个 就会被替换为handsome and violent
注意:^jiangsiyu前面带 ^表示头部分 不带则全部 如下
a1.sources.s1.interceptors.i6.searchPattern = jiangsiyu
案例三:过滤抽取拦截器
创建文本文件example14.properties
[root@Centos conf]# vim example14.properties
# 声明基本组件 Source Channel Sink example14.properties
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
# 配置Source组件,从Socket中接收⽂文本数据
a1.sources.s1.type = netcat
a1.sources.s1.bind = Centos
a1.sources.s1.port = 44444
# 添加拦截器器
a1.sources.s1.interceptors = i1 i2
a1.sources.s1.interceptors.i1.type = regex_extractor
a1.sources.s1.interceptors.i1.regex = ^(INFO|ERROR)
a1.sources.s1.interceptors.i1.serializers = s1
a1.sources.s1.interceptors.i1.serializers.s1.name = loglevel
a1.sources.s1.interceptors.i2.type = regex_filter
a1.sources.s1.interceptors.i2.regex = .*jaingsiyu.*
a1.sources.s1.interceptors.i2.excludeEvents = false
# 配置Sink组件,将接收数据打印在⽇日志控制台
a1.sinks.sk1.type = logger
# 配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 进⾏行行组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动flume
[root@Centos apache-flume-1.9.0-bin]# ./bin/flume-ng agent --conf conf/ --name a1 --conf-file conf/example14.properties -Dflume.root.logger=INFO,console
输入数据Telnet
[root@Centos ~]# telnet Centos 44444
Trying 192.168.17.150...
Connected to Centos.
Escape character is '^]'.
INFO nihao money
OK
INFO nihao jiangsiyu
OK
hello jiangsiyu
OK
hello world
OK
ERROR hello jiangsiyu
OK
ERROR hello world
OK
hello ERROR jiangsiyu
OK
hello jiangsiyu INFO
OK
hello INFO
OK
结果如下
必须含有jiangsiyu 否则接收不到 INFO/ERROR必须是头 否则在headers中不能匹配