扩展 Flume-agent 以处理120K事件/秒

Posted BugsKiller

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展 Flume-agent 以处理120K事件/秒相关的知识,希望对你有一定的参考价值。

Apache Flume是一种用于收集大量数据(如日志)的分布式服务。Flume剂有三个组成部分:源,通道和接收器。简单来说,数据通过通道从源流到接收器。Source生成数据,通道缓冲它,sink将数据写入存储。我们可以通过以下方法增加水槽剂的产量。

配置

我们可以调整源和接收器的batchSizebatchDurationMillis 以增加吞吐量。这些属性的值取决于源/接收器的类型以及我们可以承受的接收延迟。通过调整批量大小和交易容量,我们能够获得15K事件/秒。要获得这些属性的更多细节遵循这个博客

<agent_name>.sinks.<sink_name>.batchSize = 10000
<agent_name>.sinks.<sink_name>.batchDurationMillis = 10000

Sink并行化

在我们的例子中,由于处理速度较慢,sink成为管道的瓶颈。我们试图通过以下方法增加整个水槽。

sink

Sink组允许我们将多个接收器组合为一个。我们使用负载平衡接收器处理器配置接收器组以将事件写入多个接收器,但整个过程保持不变。检查论坛后,我们发现在接收器组中,一次只有一个接收器处于活动状态,因此性能与单个接收器相同。

多个接收器

我们没有将接收器组连接到通道,而是将接收器直接连接到通道。吞吐量应该增加,因为每个接收器都在自己的线程中运行,但我们没有看到任何显着的改进。经过各种测试后,我们发现通道成为了瓶颈,因为多个接收器正在竞争单个通道。

多个接收器 - 多个通道

我们配置了多个通道并为每个通道连接了一个接收器。复制通道选择器用于将事件复制到所有通道。吞吐量随每个通道 - 接收器对线性增加。我们必须找到一种方法将事件分发到多个渠道。

多路复用通道选择器

Flume本身支持两个通道选择器:复制和多路复用。在这种情况下,不能使用复制通道选择器,因为它会将同一事件复制到所有通道。使用多路复用通道选择器,我们可以根据特定标头的值将事件映射到特定通道。这种方法需要均匀分布的密钥,并且信道的数量限于密钥的基数。很难为每个事件流找到这种类型的密钥。

循环通道选择器

为了克服多路复用信道选择器的问题,我们开发了Round-Robin信道选择器,它以循环方式将事件分配给所有信道。

构建循环通道选择器

  git clone https://github.com/saravsars/flume-round-robin-channel-selector.git
cd flume-round-robin-channel-selector
mvn clean package
cd target
cp flume-round-robin-channel-selector-1.0 .jar FLUME_CLASSPATH /

配置循环通道选择器

  agent.sources = source1 
agent.sinks = sink1 sink2
agent.channels = channel1 channel2

agent.sources.source1.channels = channel1 channel2
agent.sinks.sink1.channel = channel1
agent.sinks.sink2.channel = channel2


agent.sources.source1 .selector.type = com.sars.flume.RoundRobinChannelSelector

启用批处理和循环通道选择器后,我们能够在八核机器中实现120K事件/秒


谢谢你的阅读!


以上是关于扩展 Flume-agent 以处理120K事件/秒的主要内容,如果未能解决你的问题,请参考以下文章

120K 条记录的 SQL 查询耗时 9 小时

不愧是 GitHub 上标星 120K 的手册,内容不多,只讲重点

短小精悍5.7w字!GitHub标星120K的Java面试知识点总结

021事件详解

事件处理函数以及实例扩展

spring中策略模式使用