如何避免Kafka的限制?

8
我们正在尝试构建一个BI系统,该系统将收集应由其他组件处理的大量数据。
我们决定有一个中间层来收集、存储和分发数据是个好主意。
数据由一组日志消息表示。每个日志消息具有以下内容:
- 产品 - 操作类型 - 日期 - 消息负载
系统规格:
- 平均值:1.5百万条消息/分钟 - 峰值:15百万条消息/分钟 - 平均消息大小为:700字节(约1.3TB/天) - 我们有200种产品 - 我们有1100种操作类型 - 数据应每5分钟摄取一次 - 消费者应用程序通常需要1-2-3种产品与1-2-3种操作类型(我们需要快速访问1种产品/1种操作类型)
我们认为使用 Kafka 可以完成这项工作,但我们遇到了几个问题。我们尝试为每个操作类型创建一个主题,并为每个产品创建一个分区。通过这样做,我们可以提取要消费的1种产品/1种操作类型。
最初,我们遇到了“打开太多文件”的问题,但在将服务器配置更改为支持更多文件后,我们出现了内存不足的错误(每个节点分配了12GB)。此外,在大量主题时,kafka 的稳定性也存在问题。
我们的问题是:
- Kafka 是否适用于我们的用例场景?它能够支持如此多的主题/分区吗? - 我们是否可以以另一种方式在 Kafka 中组织数据以避免这些问题,但仍然能够快速访问1种产品/1种操作类型? - 您是否推荐其他更适合此类问题的 Kafka 替代方案?

2
你是否尝试过其他解决方案的 POC,例如使用 HBase 的 Flume 或者作为 MQ 的 AMQ/NSQ?如果不起作用,你是否有能力轻松地在 Netty/Mina 上编写自己的实现,或者你认为这需要太多时间了?我知道重复利用已有的东西是更好的选择。 - ali haider
如果您需要更接近实时的性能(我猜想您严格来说是在谈论性能而不是实时性),为什么不考虑像Hazelcast/Infinispan这样的内存数据网格(它们在内存中分发/复制数据),并且您可以从客户端对它们进行查询(数据可以根据需要从数据库加载/卸载)? - ali haider
1
@alihaider jgroups 的速度至少比 kafka 慢一个数量级,hbase 也是如此,不确定 infinispan/hazelcast 的情况。 - om-nom-nom
1
@Stephan 从评论中看来,你已经得出了结论。鉴于此问题的赞数和浏览量,总结一下是否值得在答案中提出呢?其他人似乎渴望解决方案,而且听起来你现在可能可以回答原始问题中的要点了。 - Jo Douglass
@JoDouglass 很有道理,我回答了一个问题 - Stephan
显示剩余17条评论
1个回答

3
我发布这个答案是为了让其他用户看到我们采用的解决方案。
由于Kafka的限制(大量分区导致操作系统接近最大打开文件数),以及性能相对较弱,我们决定使用诸如apache commons,guava,trove等库构建一个完全符合我们需求的自定义框架,以实现所需的性能。
整个系统(分布式和可扩展)有三个主要部分:
1. ETL(读取数据,处理数据并将其写入二进制文件) 2. 框架核心(用于从二进制文件中读取并计算统计信息) 3. API(由许多系统用于获取显示数据)
顺便说一下:我们尝试了其他解决方案,如HBase、Storm等,但没有一个能满足我们的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接