Flink Kafka Stream相对于Spark Kafka Stream的优势?以及Kafka Stream相对于Flink的优势?

6
在Spark流处理中,我们设置批处理间隔以进行准实时的微批处理。在Flink(DataStream)或Storm中,流是实时的,所以我猜没有批处理间隔的概念。
在Kafka中,消费者是拉取数据的,我想Spark使用批处理间隔参数从Kafka代理服务器中拉出消息,那么Flink和Storm是如何做到的呢?我想Flink和Storm通过快速循环来拉取Kafka消息以形成实时流源,如果这样的话,并且我将Spark批处理间隔设置得很小,比如100ms、50ms甚至更小,那么Spark Streaming和Flink或Storm之间是否有显著差异?
同时,在Spark中,如果流式数据很大,而批处理间隔太小,我们可能会遇到等待处理的数据量很大的情况,因此有可能会发生OutOfMemory错误。在Flink或Storm中会发生吗?
我已经实现了一个应用程序来进行主题到主题的转换,转换很容易,但源数据可能非常庞大(考虑到这是一个物联网应用)。我的原始实现是由reactive-kafka支持的,在我的独立Scala / Akka应用程序中运行良好。我没有将应用程序实现为集群,因为如果需要,Flink / Storm / Spark已经存在。然后我发现了Kafka Stream,对我来说它与客户端使用视图中的reactive-akka类似。因此,如果我在独立应用程序或微服务中使用Kafka Stream或reactive-kafka,我们是否需要关注客户端代码的可靠性/可用性?
1个回答

13

你对微批处理和流处理的理解是正确的。你也说得对,这三个系统都使用 Kafka 提供的标准 Java 消费者来拉取数据以进行处理。

主要区别在于,Spark 需要为每个微批处理调度一个新作业。这种调度开销相当大,因此 Spark 无法高效地处理非常低的批次间隔(如100毫秒或50毫秒),因此吞吐量会降低。

Flink 和 Storm 都是真正的流式系统,因此它们在启动时只部署作业一次(该作业持续运行,直到用户显式关闭),因此它们可以处理每个单独的输入记录而没有额外的开销,并具有非常低的延迟。

此外,对于 Flink,JVM 主内存不是限制,因为 Flink 可以使用堆外内存以及如果可用的主内存太小,则可以写入磁盘。 (顺便说一句:自从 Tungsten 项目以来,Spark 也可以使用堆外内存,但他们可以在某种程度上溢出到磁盘——但与 Flink 不同,据我所知)。 Storm,据我所知,两者都不支持,仅限于 JVM 内存。

我不熟悉反应式 Kafka。

对于 Kafka Streams,它是一个完全容错的、有状态的流处理库。它专为微服务开发设计(您不需要专用的处理集群,如 Flink/Storm/Spark),但可以在任何地方和任何方式部署您的应用程序实例。通过启动更多的实例来扩展应用程序。查看文档以获取更多详情:http://docs.confluent.io/current/streams/index.html (Confluent 博客中还有有关 Kafka Streams 的有趣文章:http://www.confluent.io/blog/


@ Matthias,很高兴能从Confluent的专业人士那里得到答案。我本来想问另一个问题,但是太长了,所以我修改了原始帖子。您能分享一下您的经验吗? - Stephen Kuo
@Stephen,我已经扩展了我的答案。 - Matthias J. Sax
你为什么说“但与Flink AFAIK不同”?有许多种类型的spilling吗? - tribbloid
我记不得我当时的意思了... 这个答案是一年前给出的。 - Matthias J. Sax

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