Sink Processor是将一个或者多个Sink绑定到一个组中,针对一个组中的Sink来进行整体的操作。
Sink Processor本质上就是Sink Group,是将一个或者多个Sink绑定到一个组中来使用,是Flume用于实现失败恢复和负载均衡的组件。
在企业级开发中,通常有多个客户端Agent来收集数据,发送给中心服务器Agent,中心服务器Agent要承载若干客户端Agent发送的数据,负载较高,且中心服务器Agent如果只有一个,会造成单节点故障风险。
所以在企业级开发中,中心服务器Agent往往不止一个,由若干个协同工作,此时客户端Agent如何分配数据给中心服务器Agent就成了问题。
需要为多个中心服务器配置Sink,将这些Sink组成SinkGroup组,再为这个组配置Processor,指定处理机制和其他参数。
之后将这些Sink连接到同一个Channel,Processor可以通过改变Channel的指向,将数据根据规则实现分发
目前官网支持三种模式:
default:默认模式
该模式下,一个Sink就是一个Sink组,有几个Sink就对应了几个Sink组。
failover:崩溃恢复模式(优先级)
该模式下,要求将多个Sink绑定到一个组中,给这个组中的每一个Sink指定优先级,数据优先发送给高优先级的Sink;如果高优先级的Sink宕机,那么才会发送给低优先级的Sink。
load_balancing:负载均衡模式
该模式同样要求将多个Sink绑定到一个组中,数据在组中进行均衡。Flume提供了两种均衡方式:round_robin和random。同样需要注意的是,Flume原生提供的load_balancing模式同样不好用!
失败恢复机制下,Processor将会维护一个sink的优先表。sink可以被配置一个优先级,数字越大优先级越高。
事件将永远将只会发往优先级最高的Sink。只要有一个Sink存活,整个过程仍然可以进行。
如果没有指定优先级,则优先级顺序取决于sink的配置顺序,先配置的默认优先级高于后配置的.
SinkProcessor共 有 三 种 类 型 , 分 别 是DefaultSinkProcessor 、LoadBalancingSinkProcessor 和 FailoverSinkProcessor。DefaultSinkProcessor 对 应 的 是 单 个 的 Sink , LoadBalancingSinkProcessor 和FailoverSinkProcessor 对应的是 Sink Group,LoadBalancingSinkProcessor 可以实现负载均衡的功能,FailoverSinkProcessor 可以实现故障转移的功能。
a要通过b节点往c节点发送数据,为了稳定性,再设置一个b1节点与b节点形成group组,b,和b1设置优先级,数据流向优先级高的节点,如果一个组里的节点挂掉,数据将流向另一个节点
举例收集指定端口的数据,实现两个sink通道的负载平衡,通过轮询发送数据,如下图
如下图
Sink Processor共有三种类型
FailoverSinkProcessor可以实现故障转移
将多个Sink绑定到一个组中,同组的Sink需要配置优先级,数据会优先发送给优先级较高的Sink,如果高优先级的Sink宕机,那么才会发送给低优先级的Sink。当优先级高的Sink恢复后,那么数据又会重新回来
需求:flume1采集端口数据,发送给flume2或flume3。当flume2或3挂掉后,发送给另一台flume。
flume1配置:NetCat Source -> Memory Channel -> Avro Sink
# 给三大组件取名
a1.sources = r1
a1.sinks = k1 k2
a1.channels = c1
#配置 NetCat Source
a1.sources.r1.type = netcat
a1.sources.r1.bind = m1
a1.sources.r1.port = 9999
# 配置 Memory Channel
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
# 配置 Avro Sink
a1.sinks.k1.type = avro
a1.sinks.k1.hostname = m2
a1.sinks.k1.port = 9999
a1.sinks.k2.type = avro
a1.sinks.k2.hostname = hadoop102
a1.sinks.k2.port = 9999
# 配置 sink groups
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
# 配置三大组件的绑定关系
a1.sources.r1.channels = c1
# c1的数据发给k1或k2
a1.sinks.k1.channel = c1
a1.sinks.k2.channel = c1
flume2配置:Avro Source -> Memory Channel -> Logger Sink
# 给三大组件取名
a2.sources = r1
a2.channels = c1
a2.sinks = k1
# 配置 Avro Source
a2.sources.r1.type = avro
a2.sources.r1.bind = m2
a2.sources.r1.port = 9999
# 配置 Memory Channel
a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000
a2.channels.c1.transactionCapacity = 100
# 配置 Logger Sink
a2.sinks.k1.type = logger
# 配置三大组件的绑定关系
a2.sources.r1.channels = c1
a2.sinks.k1.channel = c1
flume3配置:Avro Source -> Memory Channel -> Logger Sink
# 给三大组件取名
a3.sources = r1
a3.channels = c1
a3.sinks = k1
# 配置 Avro Source
a3.sources.r1.type = avro
a3.sources.r1.bind = hadoop102
a3.sources.r1.port = 4142
# 配置 Memory Channel
a3.channels.c1.type = memory
a3.channels.c1.capacity = 1000
a3.channels.c1.transactionCapacity = 100
# 配置 Logger Sink
a3.sinks.k1.type = logger
# 配置三大组件的绑定关系
a3.sources.r1.channels = c1
a3.sinks.k1.channel = c1
測試
依次启动m2,m3,m1
flume-ng agent -c $FLUME_HOME/conf -n a1 -f $FLUME_HOME/sinkprocessor.conf -Dflume.root.logger=INFO,console
发送数据
nc m1 9999 数据abc
因为在m1的配置中k2,即m3的优先级高,所以abc数据是发到m3上的
此时关掉m3,发送数据hello,数据将发送到m2上
再次启动m3,发送数据success,数据将重新发送到优先级高的m3上
LoadBalancingSinkProcessor 实现负载均衡
与FailoverSinkProcessor 的配置极为类似,只需在flume1中将sink组的配置改为
# sink group 负载均衡
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