一:为什么需要load-balancing?sink
??试想一下,通常,咱们的服务会有成千上万的数据源通过flume写入诸如hdfs这样的存储系统,在我们将采集的数据写入存储系统之前,如果都是一次性通过 source直接将数据写入hdfs,那么势必会给namenode和hdfs集群造成压力,而flume的可扩展性告诉我们,我们可以通过分层的形式将数据写入相应的sink,如下图:
? 正如你看到的,有这样一个拓扑结构不仅能够充分利用网络资源,也不会浪费CPU周期和较高的I/O开销。
sink有一个组的概念,一个sink组里面可以包含多个sink,我们可以使用load-balancing?sink处理器来实现多个sink之间的负载均衡
我们先来看一下load-balancing的配置
type:必须写成load_balancing
selector:可以设置成round_robin或random,或者自己实现
backoff:默认是false,如果设置为true,那么失败的sink将会被加入黑名单,加入的时间以指数形式增长.
selector.maxTimeOut:毫秒级时间,超过这个时间后,黑名单的时间周期不在增长。
二:示例
agent的配置文件如下
?
?
Sink 组g1里面有2个sink,分别是k1,k2,2个sink之间保证负载均衡,如果其中某一个sink挂了,将会被加入黑名单,sink下次轮询的时候就 不会再次尝试去请求挂了的sink,直到回退时间过期。轮询时才会再次请求,如果之前挂调的sink重新恢复了,那么就可以再次处理数据。
? 监控的是flumeSpool目录下面的文件,当我们启动这个agent,flume监控到目录下面有数据就会立即通过复制的方式往2个Avro?RPC端口放数据,先启动k1,k2
启动agent
? 在数据量比较大的情况下,往监控目录下面放数据,会发现,k1,k2基本会实现接收数据的平衡。效果:
端口4444的sink
端口5555的sink
发现2个sink接收的数据不会相同,但基本会保持平衡,不会给某一个sink造成太多的压力。
原文:http://090508tanjie.iteye.com/blog/2289426