看看flume的高级功能:





1    flume channel selectors





      如果没有特殊说明,则默认是replicating模式。 还有Multiplexing、Custom模式可以选择。





        1    Replicating Channel Selector





              需要设置以下的属性:



               



              selector.type    默认值是replicating,用来设置该组件的名称



            selector.optional    设置selector的channel

a1.sources = r1
a1.channels = c1 c2 c3
a1.source.r1.selector.type = replicating
a1.source.r1.channels = c1 c2 c3
a1.source.r1.selector.optional = c3



在上面的配置中,c3是optional的channel,如果向c3写入失败,则会被忽略,c1和c2没有被标记为optional,如果向c2和c1写入失败则会导致事件失败。







        2    Multiplexing Channel Selector





                需要设置以下属性:





                selector.type    默认值是replicating,可以设置为multiplexing



                selector.header    默认值是flume.selector.header



                selector.default



             selector.mapping.*

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





2    flume sink processors





        sink groups允许给一个实体设置多个sinks,sink processors可以使在sink group中所有sink具有负载均衡的能力,或者在一个sink失效后切换到另一个sink的fail over模式。





        需要设置以下属性:





        sinks    空格分隔的一系列sinks列表



       processor.type    该组件的名称,可以使default、failover、load_balance

a1.sinkgroups = g1
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance



        默认的sink processor只接受一个sink,用户不一定非得创建sink group。





        1    failover sink processor





                failover机制维护一个sink优先级列表,保证有效事件可以被处理掉。





                需要设置以下属性:



                sinks    在同一组sinks中的以空格分隔的sink列表



                processor.type    默认值是default,在此可以设置为failover



                processor.priority.<sinkName>    sink在该sink group中的优先级



             processor.maxpenalty    默认值3000毫秒,故障转移的默认时间

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



        2    load balancing sink processor





                load balancing sink processor给多个sinks之间提供负载均衡,它维护一个可用sink索引,它支持通过round_robin和random两种方法进行负载分配,默认的选择方式是round_type类型的,也可以通过配置文件进行更改。当被选择器被调用的时候,它不会屏蔽故障的sink,继续尝试访问每一个可用的sink,如果所有的sink都故障了,选择器则无法给sink传播数据。如果backoff被开启,则sink processor会屏蔽故障的sink,选择器会在一个给定的超时时间内移除它们,当超时时间完毕后,sink还是无法访问,则超时时间以指数方式增长。





                需要设置以下属性:



                processor.sinks    在同一组sinks中的以空格分隔的sink列表



                processor.type    默认是default,在此可以设置成load_balance



                processor.backoff    默认是false



                processor.selector    默认是round_robin,还可以选择random



             processor.selector.maxTimeOut    默认是30000毫秒,屏蔽故障sink的时间

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



3    Event Serializers



    



        file_roll sink和hdfs sink都支持EventSerializer接口,    





4    Body Text Serializer





        别名是text,该拦截器会把事件的body输出,不做任何改变,而事件的头部会被忽略。





        可以配置以下参数:



       appendNewline    默认值是true,在每个事件的后面追加一个新行。

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





5    Avro Event Serializer





        别名是avro_event,该拦截器会把flume的事件插入一个avro容器文件中,





        可设置的参数如下:



        syncIntervalBytes    默认值是2048000,avro的同步间隔,单位是bytes



       compressionCodec    默认值是null,avro的压缩codec。

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





6    monitor flume



    



        1    ganglia report





                flume可以报告他的metrics到ganglia3,只要你在启动flume agent的时候设置一些参数即可,也可以把这些参数设置在flume-env.sh配置文件中。需要设置的参数如下,这些参数的前缀如下flume.monitoring.:



                type    该组件的名称,这里设置为ganglia



                hosts    逗号分隔的ganglia服务器列表,hostname:port



                pollFrequency    默认值是60秒,flume向ganglia报告metrics的时间间隔



                isGanglia3    默认是false,ganglia server的版本在3以上,flume 发送的是ganglia3.1的数据格式





                启动flume agent



                flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=ganglia -Dflume.monitoring.hosts=com.example:1234,com.example2:5455





        2    JSON report





                flume也可以报告JSON格式的report,为了开启JSON report,在flume机器上启动了一个web server。需要在客户端启动时设置以下参数:



                type    该组件的名称,这里设置为http



                port    该服务监听的端口,默认是41414





                启动flume agent



                flume-ng agent --conf-file example.conf --name a1 -Dflume.monitoring.type=http -Dflume.monitoring.port=34545



                然后通过http://<hostname>:<port>/metrics来查看值





7    Flume Interceptors





        flume拦截器可以修改或者删除事件,flume还支持连接器链,事件可以经过一系列拦截器。多个拦截器在配置文件中以空格分隔,拦截器的顺序就是事件处理的顺序,只有一个拦截器通过之后才会进行到下一个拦截器。





        1    Timestamp Interceptor





                该拦截器会插入到事件头中,会在事件头中插入一个key是timestamp的KV对,value的值是相关的timestamp。该拦截器可以保护相关的已经存在的timestamp。可以设置以下参数:



                type    该组件的名称,此处是timestamp



             preserveExisting    默认值是false,如果timestamp已经存在,应该被保护

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,插入KV对,key名称是host,可以设置以下值:



                type    该组件的名称,此处是host



                preserveExisting    默认值是false,如果在头部已经存在host,则应该被保护



                useIP    默认值是true,使用ip,而非hostname



             hostHeader        默认值是host,头部的key名称

a1.sources = r1
a1.channels = c1
a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = host
a1.sources.r1.interceptors.i1.hostHeader = hostname





        3    Static Interceptor





                该拦截器允许用户追加静态头部在所有事件中,可以设置以下参数:



                type    该组件的名称,此处是static



                preserveExisting    默认值是true,如果头部已经存在,则应该被保护



                key    默认值是key,头部创建的key名称



             value    默认值是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