假设您有一个拓扑结构,其中第一层从数千个应用服务器接收数据,第二层在将数据推入HDFS之前通过Avro RPC从第一层接收数据。为简单起见,我们假设第一层有100个代理,第二层有4个。在最简单的拓扑中,每个第一层代理将有四个Avro Sinks将数据推送到每个二层代理。这样工作正常,直到其中一个二级代理失败。此时,配置为发送数据的接收端将不会发送任何数据,直到失败的二级代理重新联机。
除了这个接收器在代理上使用了一些线程(一个用于接收器转发器,另一个用于Netty用于发送数据的线程池)之外,因此浪费CPU周期,直到二级代理程序启动并运行,通过创建删除事件的事务,然后将其回滚,该接收器还会对通道造成额外的压力。对于文件通道,即使事务没有提交,一些需要写入文件(即使交易没有提交,也将写入文件),它带有I / O成本和磁盘空间成本。如图所示。
被配置为随机或循环。如果顺序被设置为随机的,则接收器组中的接收器之一随机选择以从其自己的通道中移除事件并将其写出。循环选项导致以循环方式选择接收器:每个进程循环调用下一个接收器的进程方法
它们在接收器组定义中指定它们的顺序。如果该接收器正在写入失败的代理程序或代理程序太慢,导致超时,则宿处理器将选择另一个宿头来写入数据。
接收器处理器可以配置为将故障接收器列入黑名单,退避周期以指数形式增加,直到达到上限。这确保了相同的接收器不会在循环中重试,并且资源不会被浪费,直到退避时间段到期。
负载均衡接口处理器的配置参数如表所示。所有参数必须带有接收器组前缀,后跟处理器。以确保接收器处理器获得正确的参数。
负载均衡接口处理器的配置方式如下:
agent.sinks = s1 s2 s3 s4
agent.sinkgroups = sg1
agent.sinkgroups.sg1.sinks = s1 s2 s3 s4
agent.sinkgroups.sg1.processor.type = load_balance
agent.sinkgroups.sg1.processor.selector = random
agent.sinkgroups.sg1.processor.backoff = true
agent.sinkgroups.sg1.processor.selector.maxTimeOut = 10000
此配置将sink组设置为使用随机选择s1,s2,s3或s4之一的负载平衡宿处理器。 如果其中一个接收器(或更准确地说,接收器发送数据的代理)失败,则接收器将被列入黑名单,退出周期从250毫秒开始,然后成指数增加,直到达到10秒。 在这一点之后,每次写入失败时,接收器都会退出10秒,直到能够成功写入数据,此时退避重置为0.如果选择器参数的值设置为round_robin,则s1为 要求先处理数据,然后是s2,然后是s3,然后是s4和s1。
该配置意味着只有一个接收器在任何时间点从每个代理程序中写入数据。 这可以通过添加具有类似配置的负载平衡宿处理器的多个宿组来修复。 请注意,可能有几个代理尝试将数据写入每个二级代理。
Risks of Having Too Many Sinks Sending Data to the Same Agent Data to the Same Agent
由于每个Avro Sink都保持持续连接打开Avro Source,因为将多个sinks写入同一个代理程序,因此可以增加更多的套接字连接,并在二层代理上占用更多的资源。 在添加太多连接到同一代理程序的接收器之前,必须仔细考虑这一点。
Writing sink selectors*
负载均衡接收器处理器可以使用自定义逻辑来选择哪个接收器在每次接收器调用处理方法时激活。 自定义选择器必须实现LoadBalancingSinkProcessor $ SinkSelector接口,如下所示:
public interface SinkSelector extends Configurable, LifecycleAware {
void setSinks(List<Sink> sinks);
Iterator<Sink> createSinkIterator();
void informSinkFailed(Sink failedSink);
}
当接收器处理器启动时,汇编器选择器被实例化,并且调用setSinks方法,其中汇集列表被传入该列表中。该列表与配置文件指定的顺序相同。 每次宿处理事件时,都会调用createSinkIterator方法。 这个方法必须返回一个迭代器,它按照汇数来提取数据的顺序返回汇数。
一旦sink成功地能够处理事件并返回成功,则丢弃当前迭代器,并再次调用此方法以获取新的迭代器,这可能会以不同的顺序返回宿。 当sink无法发送事件(由抛出的异常指示)时,将调用informSinkFailed方法。 如果需要,这可以用来临时黑名单。
Load balancing
.................................................
负载平衡,使用轮询或随机方式寻找下一个sink进行处理,如果失败再
继续进行选择,可以实现容灾可负载平衡机制。
a1.sources = r1
a1.channels = c1
a1.sinkgroups = g1
a1.sinks = k1 k2
a1.sources.r1.type=netcat
a1.sources.r1.bind=localhost
a1.sources.r1.port=8888
a1.channels.c1.type = memory
a1.channels.c1.capacity = 100000
a1.channels.c1.transactionCapacity = 100
a1.sinks.k1.type=file_roll
a1.sinks.k1.sink.directory=/home/centos/flume/f1
a1.sinks.k2.type=file_roll
a1.sinks.k2.sink.directory=/home/centos/flume/f2
a1.sinkgroups.g1.sinks = k1 k2
a1.sinkgroups.g1.processor.type = load_balance
a1.sinkgroups.g1.processor.backoff = true
a1.sinkgroups.g1.processo r.selector = round_robin
a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
a1.sinks.k2.channel=c1