Flink Kafka Stream 相对于 Spark Kafka Stream 的优势? Flink 上的 Kafka Stream 呢? [关闭]
Posted
技术标签:
【中文标题】Flink Kafka Stream 相对于 Spark Kafka Stream 的优势? Flink 上的 Kafka Stream 呢? [关闭]【英文标题】:The benefits of Flink Kafka Stream over Spark Kafka Stream? And Kafka Stream over Flink? [closed] 【发布时间】:2017-03-05 17:58:59 【问题描述】:在 Spark Stream 中,我们为近乎实时的微批处理设置了批处理间隔。在 Flink (DataStream) 或 Storm 中,stream 是实时的,所以我猜没有批处理间隔这个概念。
在kafka中,消费者在拉,我想象Spark使用batch interval参数从Kafka broker中拉出消息,那么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】:您对微批处理与流处理的理解是正确的。您也对,这三个系统都使用 Kafka 提供的标准 Java 消费者来无限循环地提取数据进行处理。
主要区别在于,Spark 需要为其处理的每个微批处理安排一个新作业。而且这种调度开销非常高,以至于 Spark 无法有效地处理 100 毫秒或 50 毫秒等非常低的批处理间隔,因此这些小批处理的吞吐量会下降。
Flink 和 Storm 都是真正的流系统,因此它们都只在启动时部署一次作业(并且该作业会持续运行直到用户明确关闭),因此它们可以处理每个单独的输入记录而没有开销和非常低的延迟.
此外,对于 Flink,JVM 主内存不是一个限制,因为如果可用的主内存太小,Flink 可以使用非头内存以及写入磁盘。 (顺便说一句:自 Tungsten 项目以来的 Spark,也可以使用堆外内存,但它们可以在某种程度上溢出到磁盘 - 但与 Flink AFAIK 不同)。 Storm,AFAIK,两者都不做,并且仅限于 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 扩展了我的答案 为什么说“但与 Flink AFAIK 不同”?溢出有多种类型吗? 不记得我的意思...自从我给出这个答案以来已经一年了。以上是关于Flink Kafka Stream 相对于 Spark Kafka Stream 的优势? Flink 上的 Kafka Stream 呢? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Flink实战系列Lorg/apache/flink/kafka/shaded/org/apache/kafka/clients/consumer/ConsumerRecord;)Ljava/