file_roll sink和HDFS sink都支持EventSerializer接口。下面提供了Flume附带的EventSerializer的详细信息。
1、Body文本序列化器
该序列化器的别名为text。该拦截器(interceptor)将事件的主体(Body)写入输出流,而不进行任何转换或修改。事件header被忽略。配置选项如下:
属性名称 |
默认值 |
描述 |
appendNewline |
true |
写入时是否在每个事件中追加换行符。出于传统原因,默认值为假定事件不包含换行符。 |
如下就是一个名称为a1的agent的配置。
a1.sinks = k1 a1.sinks.k1.type = file_roll a1.sinks.k1.channel = c1 a1.sinks.k1.sink.directory = /var/log/flume a1.sinks.k1.sink.serializer = text a1.sinks.k1.sink.serializer.appendNewline = false |
2、“Flume Event” Avro Event Serializer
别名为avro_event, 该拦截器将Flume事件序列化为Avro容器文件。所使用的schema与Avro RPC机制中用于Flume事件的schema相同。
该序列化程序继承自AbstractAvroEventSerializer类。配置选项如下:
属性名称 |
默认值 |
描述 |
syncIntervalBytes |
2048000 |
Avro同步间隔,近似字节。 |
compressionCodec |
null |
Avro压缩编解码器。有关支持的编解码器,请参阅Avro的CodecFactory文档。 |
如下就是一个名称为a1的agent的配置。
a1.sinks.k1.type = hdfs a1.sinks.k1.channel = c1 a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S a1.sinks.k1.serializer = avro_event a1.sinks.k1.serializer.compressionCodec = snappy |
3、Avro Event Serializer
该序列化程序没有别名,必须使用完全限定的类名称进行指定。
这将Flume事件序列化为Avro容器文件,如“Flume Event”Avro Event Serializer,但记录的schema是可配置的。记录schema可以在Flume配置属性中指定,也可以在事件header中传递过来。
要将记录schema作为Flume配置的一部分传递,请使用下面列出的属性schemaURL。
要通过在事件header来传递记录的schema,要么在事件header flume.avro.schema.literal中包含一个代表schema的JSON格式字符串,要么使用flume.avro.schema.url 来指定一个URL,通过这个URL可以找到schema。
该序列化程序继承自AbstractAvroEventSerializer类。
配置选项如下:
属性名称 |
默认值 |
描述 |
syncIntervalBytes |
2048000 |
Avro同步间隔,近似字节。 |
compressionCodec |
null |
Avro压缩编解码器。有关支持的编解码器,请参阅Avro的CodecFactory文档。 |
schemaURL |
null |
Avro schema URL。header中指定的schema 会覆盖此选项的配置。 |
如下就是一个名称为a1的agent的配置。
a1.sinks.k1.type = hdfs a1.sinks.k1.channel = c1 a1.sinks.k1.hdfs.path = /flume/events/%y-%m-%d/%H%M/%S a1.sinks.k1.serializer = org.apache.flume.sink.hdfs.AvroEventSerializer$Builder a1.sinks.k1.serializer.compressionCodec = snappy a1.sinks.k1.serializer.schemaURL = hdfs://namenode/path/to/schema.avsc |
1、序列化的配置一定出现在sink中。 2、序列化器一共有两种,一种是文本序列化器,可以使用别名text。一种是avro序列化器,avro序列化器又分为两种,一个是不需要设置schema的,该序列化器别名为avro_event;另一个是需要设置schema的,没有别名,使用类的完全限定名。这两个avro序列化器都继承自AbstractAvroEventSerializer。 3、配置avro序列化器的schema通过设置schemaURL来实现。有三种方式:一种是在事件的header中传递,一种是在事件header flume.avro.schema.literal中包含一个代表schema的JSON格式字符串。一种是使用flume.avro.schema.url 来指定一个URL。 |
如果没有指定通道选择器的类型,则默认为“复制”(replicating)。
1、Replicating Channel Selector(默认的通道选择器)
属性名称 |
默认 |
描述 |
selector.type |
replicating |
组件类型名称需要为replicating |
selector.optional |
- |
一组被标记为可选(optional)通道 |
agent 名称为a1,source为r1的示例:
a1.sources = r1 a1.channels = c1 c2 c3 a1.sources.r1.selector.type = replicating a1.sources.r1.channels = c1 c2 c3 a1.sources.r1.selector.optional = c3 |
在上面的配置中,c3是一个可选通道。未能写入c3会被忽略。由于c1和c2未标记为可选项,因此如果写入这些通道失败将导致事务失败。
2、Multiplexing Channel Selector(多路复用通道选择器)
属性名称 |
默认 |
描述 |
selector.type |
replicating |
组件类型名称需要为multiplexing |
selector.header |
flume.selector.header |
|
selector.default |
- |
|
selector.mapping.* |
- |
|
代理名称为a1,source为r1的示例:
a1.sources = r1 a1.channels = c1 c2 c3 c4 a1.sources.r1.selector.type = multiplexing a1.sources.r1.selector.header = state a1.sources.r1.selector.mapping.CZ = c1 a1.sources.r1.selector.mapping.US = c2 c3 a1.sources.r1.selector.default = c4 |
3、Custom Channel Selector(用户通道选择器)
自定义通道选择器是你自己去实现ChannelSelector接口。在启动Flume agent时,自定义通道选择器的类及其依赖关系必须包含在agent的CLASSPATH中。
属性名称 |
默认值 |
描述 |
selector.type |
- |
组件类型名称需要为类的完全限定名。 |
代理名称为a1,source为r1的示例:
a1.sources = r1 a1.channels = c1 a1.sources.r1.selector.type = org.example.MyChannelSelector |
1、通道选择器有两种,一种是通过复制(replicating)的方式实现,一种是通过复用(multiplexing)的方式实现。默认是使用复制的方式实现。 2、用户通过实现ChannelSelector接口,可以实现自定义通道选择器。 |
Sink groups允许用户将多个sinks汇集到一个实体中。sink处理器可用于在组内所有的sinks上提供负载平衡功能,或在暂时失败的情况下实现从一个sink到另一个sink的故障转移。
属性名称 |
默认 |
描述 |
sinks |
- |
参与该组的以空格分隔的接收器列表 |
processor.type |
default |
组件类型名称需要为default, failover 或者 load_balance |
代理名称为a1的配置示例:
a1.sinkgroups = g1 a1.sinkgroups.g1.sinks = k1 k2 a1.sinkgroups.g1.processor.type = load_balance |
1、Default Sink Processor
默认sink处理器只接受一个sink。用户不会被迫为单个sink创建处理器(sink group)。Flume暂时不支持用户自定义的Sink Processor。
2、Failover Sink Processor(故障转移Sink Processor)
故障转移接收器处理器维护一个优先级排列的接收器列表,保证至少有一个可用的事件被处理。
故障转移机制的工作原理是将故障接收器分配给一个池,在这个池中分配一个冷却时间段,并在重新尝试之前对故障进行排序。一旦接收器成功发送一个事件,它就会恢复到活动池。sinks有一个与它们相关的优先级,数量越大,优先级越高。如果在发送事件时接收器发生故障,则接下来尝试发送具有最高优先级的下一个sink以发送事件。例如,具有优先级100的接收器在具有优先级80的接收器之前被激活。如果没有指定优先级,则根据配置中指定接收器的顺序确定优先级。
要进行配置,请将接收器组处理器设置为failover,并为所有单个sink设置优先级。所有指定的优先级必须唯一。此外,使用maxpenalty属性可以设置故障切换时间的上限(以毫秒为单位)。
属性名称 |
默认 |
描述 |
sinks |
- |
参与该组的以空格分隔的接收器列表 |
processor.type |
default |
组件类型名称需要为failover |
processor.priority. |
- |
优先值。 |
processor.maxpenalty |
30000 |
发生故障的接收器的最大回退周期(以毫秒为单位) |
代理名称为a1的示例:
a1.sinkgroups = g1 a1.sinkgroups.g1.sinks = k1 k2 a1.sinkgroups.g1.processor.type = failover a1.sinkgroups.g1.processor.priority.k1 = 5 a1.sinkgroups.g1.processor.priority.k2 = 10 a1.sinkgroups.g1.processor.maxpenalty = 10000 |
3、Load balancing Sink Processor
负载平衡接收器处理器提供了对多个接收器进行负载平衡流的能力。它维护一个活动的sinks的索引列表。实现支持使用round_robin或random选择机制来分发负载。选择机制的选择默认为round_robin类型,但可以通过配置覆盖。自定义选择机制通过从AbstractSinkSelector继承的自定义类来实现。
当被调用时,该选择器使用其配置的选择机制选择下一个sink并调用它。对于round_robin和random如果所选接收器未能传递事件,则处理器将通过其配置的选择机制选择下一个可用sink。它不会将失败的sink列入黑名单,而是继续乐观地尝试每个可用的sink。如果所有接收器调用都失败,则选择器将失败传播给sink runner。
如果启用了backoff功能,则接收处理器会将发生故障的接收器列入黑名单,进入黑名单以后就会开始计时,一直会等到超时时间。当超时结束时,如果接收器仍然无响应,则超时会以指数方式增加,以避免可能陷入无响应接收器的长时间等待中。在禁用此功能的情况下,在round-robin中,所有失败的sink的负载将传递到下一个sink,因此就不再有均衡一说。
属性名称 |
默认 |
描述 |
processor.sinks |
- |
参与该组的以空格分隔的接收器列表 |
processor.type |
default |
组件类型名称需要为load_balance |
processor.backoff |
false |
失败的水槽应该以指数形式回退。 |
processor.selector |
round_robin |
选择机制。必须是round_robin,random或者从AbstractSinkSelector继承的自定义类 |
processor.selector.maxTimeOut |
30000 |
退避选择器所使用的限制指数退避时间(以毫秒为单位) |
代理名称为a1的示例:
a1.sinkgroups = g1 a1.sinkgroups.g1.sinks = k1 k2 a1.sinkgroups.g1.processor.type = load_balance a1.sinkgroups.g1.processor.backoff = true a1.sinkgroups.g1.processor.selector = random |
1、当sink的数量大于1时,才会有sink processor的概念。Flume不支持自定义的sink processor。 2、Sink processor的类型有两种。一种是failover,一种是load_balance。 Failover sink processor会维护一个sink列表。Flume会选择一个高优先级的sink来发送时间。如果出现故障,就会选择另外一个优先级高的sink来发送时间。 3、load_balance sink processor会尝试公平地使用每一个sink。选择的机制有round_robin和random。也可以通过实现AbstractSinkSelector来自定义选择机制。 |
Flume有能力修改或者删除agent中流动的事件(events)。这是在拦截器的帮助下完成的。拦截器是实现了org.apache.flume.interceptor.Interceptor接口的类。拦截器可以根据拦截器开发人员选择的任何标准来修改或甚至删除事件。Flume支持拦截器链。这可以通过在配置中指定拦截器构建器类名称的列表来实现。拦截器在source配置中指定为空白符号分隔的列表。拦截器的指定顺序是它们被调用的顺序。由一个拦截器返回的事件列表被传递给链中的下一个拦截器。拦截器可以修改或删除事件。如果拦截器需要删除事件,它只是不会在它返回的列表中返回该事件。如果是删除所有事件,那么它只是返回一个空列表。拦截器是命名的组件,下面是通过配置创建它们的示例:
a1.sources = r1 a1.sinks = k1 a1.channels = c1 a1.sources.r1.interceptors = i1 i2 a1.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.HostInterceptor$Builder a1.sources.r1.interceptors.i1.preserveExisting = false a1.sources.r1.interceptors.i1.hostHeader = hostname a1.sources.r1.interceptors.i2.type = org.apache.flume.interceptor.TimestampInterceptor$Builder a1.sinks.k1.filePrefix = FlumeData.%{CollectorHost}.%Y-%m-%d a1.sinks.k1.channel = c1 |
请注意拦截器构建器被传递给类型config参数。拦截器本身是可配置的,并且可以像传递给任何其他可配置组件一样传递配置值。在上面的例子中,首先将事件传递给HostInterceptor,然后将HostInterceptor返回的事件传递给TimestampInterceptor。您可以指定完全限定的类名称(FQCN,即fully qualified class name)或别名时间戳。如果您有多个收集器写入相同的HDFS路径,那么您也可以使用HostInterceptor。
1、Timestamp Interceptor
这个拦截器插入到事件header中,这是值就是处理事件时的毫秒时间。这个拦截器会插入一个名称为timestamp的key到header中。Key的名称可以使用header这个属性来指定。其值是相关的时间戳。如果拦截器已经存在于配置中,该拦截器可以保留现有的时间戳。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为timestamp或者FQCN |
header |
timestamp |
存放生成的时间戳的header的名称 |
preserveExisting |
false |
如果时间戳存在,是否保留,true或者false |
下面是一个示例:
a1.sources = r1 a1.channels = c1 a1.sources.r1.channels = c1 a1.sources.r1.type = seq a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = timestamp |
2、Host Interceptor
此拦截器插入运行该agent的主机的hostname或IP地址。它根据配置插入带有host的key或其值为主机的主机名或IP地址的已配置key的header。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为host |
useIP |
true |
存放生成的时间戳的header的名称 |
preserveExisting |
false |
如果host header存在,是否保留,true或者false |
hostHeader |
host |
使用的header的key |
a1.sources = r1 a1.channels = c1 a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = host |
3、Static Interceptor
静态拦截器允许用户将具有静态值的静态标题附加到所有事件。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为static |
key |
key |
创建的header的名称 |
preserveExisting |
false |
如果配置的header存在,是否保留,true或者false |
value |
value |
创建的静态的值 |
a1.sources = r1 a1.channels = c1 a1.sources.r1.channels = c1 a1.sources.r1.type = seq a1.sources.r1.interceptors = i1 a1.sources.r1.interceptors.i1.type = static a1.sources.r1.interceptors.i1.key = datacenter a1.sources.r1.interceptors.i1.value = NEW_YORK |
当前的实现不允许一次指定多个头文件。相反,用户可以链接多个静态拦截器,每个拦截器定义一个静态头。
4、Remove Header Interceptor
此拦截器通过删除一个或多个标题来操作Flume事件标题。它可以删除静态定义的标题,基于正则表达式的标题或列表中的标题。如果这些都没有定义,或者如果没有标题符合标准,Flume事件不会被修改。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为remove_header |
withName |
- |
想要remove的header的名称 |
fromList |
- |
想要移除的headers的列表。该列表由fromListSeparator分割器指定的分隔符分隔。 |
fromListSeparator |
\s*,\s* |
从指定的fromList列表,使用正则表达式来分隔的多个header名称。默认是被逗号包围的任意数量的空白字符。 |
matching |
- |
使用正则表达式匹配到的所有的header的名称都被移除 |
请注意,如果只需要删除一个标题,按名称指定它可以提供比其他两种方法更好的性能优势。
5、UUID Interceptor
这个拦截器为所有被拦截的事件设置一个通用的唯一标识符。一个示例UUID是b5755073-77a9-43c1-8fad-b7a586fc1b97,它表示一个128位值。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder |
headerName |
id |
想要修改的Flume的header的名称 |
preserveExisting |
true |
如果UUID header已经存储,是否保留。true或者false |
prefix |
“” |
用于预先添加到每个生成的UUID的前缀字符串常量 |
如果没有适用于该事件的应用程序级别唯一密钥,请考虑使用UUIDInterceptor为事件自动分配UUID。一旦进入Flume网络,将UUID分配给事件可能很重要; 也就是流量的第一个流量源。这样可以在面向复制和重新传输Flume网络时进行事件重复数据消除,这种网络旨在实现高可用性和高性能。如果应用程序级别密钥可用,则优先于自动生成的UUID,因为它使用所述众所周知的应用程序级别密钥启用后续更新和删除数据存储中的事件。
6、Morphline Interceptor
该拦截器通过morphline配置文件过滤事件,该配置文件定义了将记录从一个命令传递到另一个命令的转换命令链。例如,morphline可以通过基于正则表达式的模式匹配来忽略某些事件或更改或插入某些事件头,或者它可以通过Apache Tika自动检测和设置MIME类型,以侦听被拦截的事件。例如,这种数据包嗅探可用于Flume拓扑中基于内容的动态路由。MorphlineInterceptor还可以帮助实现到多个Apache Solr集合的动态路由(例如,用于多租户)。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为org.apache.flume.sink.solr.morphline.MorphlineInterceptor$Builder |
morphlineFile |
- |
Morphline配置文件的相对或绝对路径。比如:/etc/flume-ng/conf/morphline.conf |
morphlineId |
null |
如果在一个morphline配置文件中有多个morphline,使用这个参数来识别需要使用的morphline |
目前,拦截器的morphline不得为每个输入事件生成多于一个的输出记录。该拦截器不适用于重型ETL处理 - 如果您需要考虑将ETL处理从Flume Source移动到Flume Sink,例如移动到MorphlineSolrSink。
a1.sources.avroSrc.interceptors = morphlineinterceptor a1.sources.avroSrc.interceptors.morphlineinterceptor.type = org.apache.flume.sink.solr.morphline.MorphlineInterceptor$Builder a1.sources.avroSrc.interceptors.morphlineinterceptor.morphlineFile = /etc/flume-ng/conf/morphline.conf a1.sources.avroSrc.interceptors.morphlineinterceptor.morphlineId = morphline1 |
7、Search and Replace Interceptor
这个拦截器提供了基于Java正则表达式的简单的基于字符串的搜索和替换功能。回溯/组捕获也可用。该拦截器使用与Java Matcher.replaceAll()方法中相同的规则。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为search_replace |
searchPattern |
- |
搜索和替换的格式 |
replaceString |
- |
替换的字符串 |
charset |
UTF-8 |
Event body的字符编码。默认为UTF-8 |
a1.sources.avroSrc.interceptors = search-replace a1.sources.avroSrc.interceptors.search-replace.type = search_replace
# Remove leading alphanumeric characters in an event body. a1.sources.avroSrc.interceptors.search-replace.searchPattern = ^[A-Za-z0-9_]+ a1.sources.avroSrc.interceptors.search-replace.replaceString = |
a1.sources.avroSrc.interceptors = search-replace a1.sources.avroSrc.interceptors.search-replace.type = search_replace
# Use grouping operators to reorder and munge words on a line. a1.sources.avroSrc.interceptors.search-replace.searchPattern = The quick brown ([a-z]+) jumped over the lazy ([a-z]+) a1.sources.avroSrc.interceptors.search-replace.replaceString = The hungry $2 ate the careless $1 |
8、Regex Filtering Interceptor
该拦截器通过将事件主体解释为文本并将文本与配置的正则表达式匹配来选择性地过滤事件。提供的正则表达式可用于包含事件或排除事件。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为regex_filter |
regex |
“ .*” |
用于匹配事件的正则表达式 |
excludeEvents |
false |
如果为true,则regex确定要排除的事件,否则regex确定要包含的事件。 |
9、Regex Extractor Interceptor
此拦截器使用指定的正则表达式提取正则表达式匹配组,并将匹配组作为标头追加到事件上。它还支持可插入序列化程序,用于格式化匹配组,然后将它们添加为事件标头。
属性名称 |
默认 |
描述 |
type |
- |
组件类型名称需要为regex_extractor |
regex |
- |
用于匹配事件的正则表达式 |
serializers |
- |
空格分隔的序列化器列表,用于将匹配映射到标题名称并序列化它们的值。Flume提供了以下内置的序列化器: org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer |
Serializers. |
default |
必须是org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer(默认的),org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer或者是实现了org.apache.flume.interceptor.RegexExtractorInterceptorSerializer的自定义类。 |
Serializers. |
- |
|
Serializers.* |
- |
指定的序列化器属性 |
序列化器用于将匹配映射到标题名称和格式化的标题值; 默认情况下,您只需指定标头名称,将使用默认的org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer。这个序列化器只是简单地将匹配映射到指定的头部名称,并将其传递给正则表达式。您可以使用完全限定的类名称(FQCN)将自定义序列化器实现插入提取器,以便按照您喜欢的方式格式化匹配。
示例1:
如果Flume事件主体包含1:2:3.4foobar5并且使用了以下配置
a1.sources.r1.interceptors.i1.regex = (\\d):(\\d):(\\d) a1.sources.r1.interceptors.i1.serializers = s1 s2 s3 a1.sources.r1.interceptors.i1.serializers.s1.name = one a1.sources.r1.interceptors.i1.serializers.s2.name = two a1.sources.r1.interceptors.i1.serializers.s3.name = three |
提取的事件将包含相同的主体,但以下标题将被添加1 => 1,2 => 2,3 => 3
示例2:
如果水槽事件体包含2012-10-18 18:47:57,614 some log line ,使用了下面的配置
a1.sources.r1.interceptors.i1.regex = ^(?:\\n)?(\\d\\d\\d\\d-\\d\\d-\\d\\d\\s\\d\\d:\\d\\d) a1.sources.r1.interceptors.i1.serializers = s1 a1.sources.r1.interceptors.i1.serializers.s1.type = org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer a1.sources.r1.interceptors.i1.serializers.s1.name = timestamp a1.sources.r1.interceptors.i1.serializers.s1.pattern = yyyy-MM-dd HH:mm |
提取的事件将包含相同的主体,但以下标题将添加timestamp => 1350611220000
为了修改和删除event,Flume提供了一系列的拦截器。 |