繁体   English   中英

卡夫卡流与弗林克

[英]Kafka Streams vs Flink

我编写了一个应用程序,每秒从 Kafka 主题读取 100.000 条 Avro 记录,按键聚合,使用 5 种不同大小的翻滚 windows,进行一些计算以了解最高值、最低值、初始值和最终值,然后写回另一个 Kafka 主题。

这个应用程序已经存在于 Flink 中,但是源是 CSV 格式的 RSocket,接收器是 Cassandra。问题是新应用程序使用了更多的 CPU 和 memory。我检查了这篇文章,发现没有提到性能。

我是否正确地假设差异主要是因为 Avro 序列化/反序列化,或者 Flink 对于这个用例应该更快? 如果差异很小,我更喜欢 Kafka Streams 以避免需要管理集群。

如果没有对您自己的硬件进行基准测试,或者 JVM 分析您的代码,很难说哪个会更快。

据我所见,Flink 确实调用了比 Kafka Streams 更多的 JVM function 调用。

Kafka Streams 不能很好地(或根本不能)与 RSocket 或 Cassandra 等外部系统一起工作。因此,您仍然需要 Flink 或其他一些 ETL 工具,如 Kafka Connect(即管理集群)将数据导入 Kafka 主题以然后处理,无论框架如何。

序列化格式无关紧要。 Flink 或 Kafka Streams 将使用与 Avro(或任何其他格式)SDK 完全相同的 JVM 方法。

我认为这个问题不能笼统地回答。 Flink 和 Kafka Streaming 都可以根据工作负载进行调整,参数的微小变化可以在性能上产生很大的差异。 一般来说,对于这样的用例,Flink 应该比 Kafka Streams 快很多没有根本原因。 一个例外可能是重新分区,对于 Kafka 流,它始终需要通过 Kafka 集群 go 并且可以留在 Flink 的集群内,但据我了解,您没有在您的用例中重新分区。

然而,序列化格式可能会发挥很大的作用。 我记得 protobuf 的一些基准测试(对于 avro 是类似的)表明(Java)memory 中的大小比线上的序列化数据大 100 倍。 同样,这取决于很多因素,特别是您的模式的嵌套/复杂程度。 如果 avro 被反序列化为复杂的 object model,与传递字符串相比,这将导致显着的 CPU / memory 开销。

然而,唯一确定是什么导致您的用例变慢的方法是分析它并查看额外资源用在了哪里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM