flume实现sink之间的负载均衡

一:为什么需要load-balancing sink

  试想一下,通常,咱们的服务会有成千上万的数据源通过flume写入诸如hdfs这样的存储系统,在我们将采集的数据写入存储系统之前,如果都是一次性通过 source直接将数据写入hdfs,那么势必会给namenode和hdfs集群造成压力,而flume的可扩展性告诉我们,我们可以通过分层的形式将数据写入相应的sink,如下图:
flume实现sink之间的负载均衡_第1张图片

  正如你看到的,有这样一个拓扑结构不仅能够充分利用网络资源,也不会浪费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的配置文件如下
flume实现sink之间的负载均衡_第2张图片
 

 

Sink 组g1里面有2个sink,分别是k1,k2,2个sink之间保证负载均衡,如果其中某一个sink挂了,将会被加入黑名单,sink下次轮询的时候就 不会再次尝试去请求挂了的sink,直到回退时间过期。轮询时才会再次请求,如果之前挂调的sink重新恢复了,那么就可以再次处理数据。

  监控的是flumeSpool目录下面的文件,当我们启动这个agent,flume监控到目录下面有数据就会立即通过复制的方式往2个Avro RPC端口放数据,先启动k1,k2
flume实现sink之间的负载均衡_第3张图片
flume实现sink之间的负载均衡_第4张图片

启动agent
flume实现sink之间的负载均衡_第5张图片

  在数据量比较大的情况下,往监控目录下面放数据,会发现,k1,k2基本会实现接收数据的平衡。效果:

端口4444的sink
flume实现sink之间的负载均衡_第6张图片

端口5555的sink
flume实现sink之间的负载均衡_第7张图片

发现2个sink接收的数据不会相同,但基本会保持平衡,不会给某一个sink造成太多的压力。

你可能感兴趣的:(负载均衡,Flume,sink)