【Flume-1.8.0】Flume的序列化器、通道选择器、sink处理器以及拦截器

5 eventSerializer

file_roll sinkHDFS sink都支持EventSerializer接口。下面提供了Flume附带的EventSerializer的详细信息。

1Body文本序列化器

该序列化器的别名为text。该拦截器(interceptor)将事件的主体(Body)写入输出流,而不进行任何转换或修改。事件header被忽略。配置选项如下:

属性名称

默认值

描述

appendNewline

true

写入时是否在每个事件中追加换行符。出于传统原因,默认值为假定事件不包含换行符。

如下就是一个名称为a1agent的配置。

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容器文件。所使用的schemaAvro RPC机制中用于Flume事件的schema相同。

该序列化程序继承自AbstractAvroEventSerializer类。配置选项如下:

属性名称

默认值

描述

syncIntervalBytes

2048000

Avro同步间隔,近似字节。

compressionCodec

null

Avro压缩编解码器。有关支持的编解码器,请参阅AvroCodecFactory文档。

如下就是一个名称为a1agent的配置。

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

3Avro Event Serializer

该序列化程序没有别名,必须使用完全限定的类名称进行指定。

这将Flume事件序列化为Avro容器文件,如“Flume Event”Avro Event Serializer,但记录的schema是可配置的。记录schema可以在Flume配置属性中指定,也可以在事件header中传递过来。

要将记录schema作为Flume配置的一部分传递,请使用下面列出的属性schemaURL。

要通过在事件header来传递记录的schema,要么在事件header flume.avro.schema.literal中包含一个代表schemaJSON格式字符串,要么使用flume.avro.schema.url 来指定一个URL,通过这个URL可以找到schema

该序列化程序继承自AbstractAvroEventSerializer类。

配置选项如下:

属性名称

默认值

描述

syncIntervalBytes

2048000

Avro同步间隔,近似字节。

compressionCodec

null

Avro压缩编解码器。有关支持的编解码器,请参阅AvroCodecFactory文档。

schemaURL

null

Avro schema URLheader中指定的schema 会覆盖此选项的配置。

如下就是一个名称为a1agent的配置。

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中包含一个代表schemaJSON格式字符串。一种是使用flume.avro.schema.url 来指定一个URL

 

6 通道选择器(Channel Selectors

如果没有指定通道选择器的类型,则默认为“复制”(replicating)。

1Replicating Channel Selector(默认的通道选择器)

属性名称

默认

描述

selector.type

replicating

组件类型名称需要为replicating

selector.optional

-

一组被标记为可选(optional)通道

agent 名称为a1sourcer1的示例:

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未标记为可选项,因此如果写入这些通道失败将导致事务失败。

2Multiplexing Channel Selector(多路复用通道选择器)

属性名称

默认

描述

selector.type

replicating

组件类型名称需要为multiplexing

selector.header

flume.selector.header

 

selector.default

-

 

selector.mapping.*

-

 

代理名称为a1sourcer1的示例:

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

3Custom Channel Selector(用户通道选择器)

自定义通道选择器是你自己去实现ChannelSelector接口。在启动Flume agent时,自定义通道选择器的类及其依赖关系必须包含在agentCLASSPATH中。

属性名称

默认值

描述

selector.type

-

组件类型名称需要为类的完全限定名。

代理名称为a1sourcer1的示例:

a1.sources = r1

a1.channels = c1

a1.sources.r1.selector.type = org.example.MyChannelSelector

 

1、通道选择器有两种,一种是通过复制(replicating)的方式实现,一种是通过复用(multiplexing)的方式实现。默认是使用复制的方式实现。

2、用户通过实现ChannelSelector接口,可以实现自定义通道选择器。

 

7 Flume Sink Processors(Sink处理器)

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

 

1Default Sink Processor

默认sink处理器只接受一个sink。用户不会被迫为单个sink创建处理器(sink group)。Flume暂时不支持用户自定义的Sink Processor

2Failover 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

 

3Load balancing Sink Processor

负载平衡接收器处理器提供了对多个接收器进行负载平衡流的能力。它维护一个活动的sinks的索引列表。实现支持使用round_robinrandom选择机制来分发负载。选择机制的选择默认为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_robinrandom或者从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

2Sink processor的类型有两种。一种是failover,一种是load_balance

Failover sink processor会维护一个sink列表。Flume会选择一个高优先级的sink来发送时间。如果出现故障,就会选择另外一个优先级高的sink来发送时间。

3load_balance sink processor会尝试公平地使用每一个sink。选择的机制有round_robinrandom。也可以通过实现AbstractSinkSelector来自定义选择机制。

 

8 Flume Interceptors

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。

1Timestamp Interceptor

这个拦截器插入到事件header中,这是值就是处理事件时的毫秒时间。这个拦截器会插入一个名称为timestampkeyheader中。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

 

2Host Interceptor

此拦截器插入运行该agent的主机的hostnameIP地址。它根据配置插入带有hostkey或其值为主机的主机名或IP地址的已配置keyheader

属性名称

默认

描述

type

-

组件类型名称需要为host

useIP

true

存放生成的时间戳的header的名称

preserveExisting

false

如果host header存在,是否保留,true或者false

hostHeader

host

使用的headerkey

 

 

a1.sources = r1

a1.channels = c1

a1.sources.r1.interceptors = i1

a1.sources.r1.interceptors.i1.type = host

 

3Static 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

 

当前的实现不允许一次指定多个头文件。相反,用户可以链接多个静态拦截器,每个拦截器定义一个静态头。

4Remove Header Interceptor

此拦截器通过删除一个或多个标题来操作Flume事件标题。它可以删除静态定义的标题,基于正则表达式的标题或列表中的标题。如果这些都没有定义,或者如果没有标题符合标准,Flume事件不会被修改。

属性名称

默认

描述

type

-

组件类型名称需要为remove_header

withName

-

想要removeheader的名称

fromList

-

想要移除的headers的列表。该列表由fromListSeparator分割器指定的分隔符分隔。

fromListSeparator

\s*,\s*

从指定的fromList列表,使用正则表达式来分隔的多个header名称。默认是被逗号包围的任意数量的空白字符。

matching

-

使用正则表达式匹配到的所有的header的名称都被移除

 

请注意,如果只需要删除一个标题,按名称指定它可以提供比其他两种方法更好的性能优势。

5UUID Interceptor

这个拦截器为所有被拦截的事件设置一个通用的唯一标识符。一个示例UUID是b5755073-77a9-43c1-8fad-b7a586fc1b97,它表示一个128位值。

属性名称

默认

描述

type

-

组件类型名称需要为org.apache.flume.sink.solr.morphline.UUIDInterceptor$Builder

headerName

id

想要修改的Flumeheader的名称

preserveExisting

true

如果UUID header已经存储,是否保留。true或者false

prefix

“”

用于预先添加到每个生成的UUID的前缀字符串常量

 

如果没有适用于该事件的应用程序级别唯一密钥,请考虑使用UUIDInterceptor为事件自动分配UUID。一旦进入Flume网络,将UUID分配给事件可能很重要; 也就是流量的第一个流量源。这样可以在面向复制和重新传输Flume网络时进行事件重复数据消除,这种网络旨在实现高可用性和高性能。如果应用程序级别密钥可用,则优先于自动生成的UUID,因为它使用所述众所周知的应用程序级别密钥启用后续更新和删除数据存储中的事件。

6Morphline 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

 

 

7Search 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

 

8Regex Filtering Interceptor

该拦截器通过将事件主体解释为文本并将文本与配置的正则表达式匹配来选择性地过滤事件。提供的正则表达式可用于包含事件或排除事件。

属性名称

默认

描述

type

-

组件类型名称需要为regex_filter

regex

“ .*”

用于匹配事件的正则表达式

excludeEvents

false

如果为true,则regex确定要排除的事件,否则regex确定要包含的事件。

 

9Regex Extractor Interceptor

此拦截器使用指定的正则表达式提取正则表达式匹配组,并将匹配组作为标头追加到事件上。它还支持可插入序列化程序,用于格式化匹配组,然后将它们添加为事件标头。

属性名称

默认

描述

type

-

组件类型名称需要为regex_extractor

regex

-

用于匹配事件的正则表达式

serializers

-

空格分隔的序列化器列表,用于将匹配映射到标题名称并序列化它们的值。Flume提供了以下内置的序列化器:

org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer

org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer

Serializers..type

default

必须是org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer(默认的)org.apache.flume.interceptor.RegexExtractorInterceptorMillisSerializer或者是实现了org.apache.flume.interceptor.RegexExtractorInterceptorSerializer的自定义类。

Serializers..name

-

 

Serializers.*

-

指定的序列化器属性

 

序列化器用于将匹配映射到标题名称和格式化的标题值; 默认情况下,您只需指定标头名称,将使用默认的org.apache.flume.interceptor.RegexExtractorInterceptorPassThroughSerializer。这个序列化器只是简单地将匹配映射到指定的头部名称,并将其传递给正则表达式。您可以使用完全限定的类名称(FQCN)将自定义序列化器实现插入提取器,以便按照您喜欢的方式格式化匹配。

示例1

如果Flume事件主体包含123.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 => 12 => 23 => 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

 

为了修改和删除eventFlume提供了一系列的拦截器。

 

你可能感兴趣的:(日志采集)