7

在 Spark Stream 中,我们为几乎实时的微批处理设置批处理间隔。在 Flink (DataStream) 或 Storm 中,stream 是实时的,所以我猜没有批处理间隔这个概念。

在kafka中,消费者在拉,我想象Spark使用batch interval参数从Kafka broker中拉出消息,那么Flink和Storm是怎么做的呢?我想象 Flink 和 Storm 在快速循环中拉取 Kafka 消息以形成实时流源,如果是这样,如果我将 Spark 批处理间隔设置为小,例如 100ms、50ms 甚至更小,我们和 Spark 之间是否存在显着差异流媒体和 Flink 还是 Storm?

同时,在 Spark 中,如果流数据很大,batch 间隔太小,我们可能会遇到有大量数据等待处理的情况,因此会发生变化,我们会看到 OutOfMemory 发生。它会发生在 Flink 或 Storm 中吗?

我已经实现了一个应用程序来进行主题到主题的转换,转换很容易,但是源数据可能很大(考虑它是一个物联网应用程序)。我的原始实现由reactive-kafka支持,它在我的独立 Scala/Akka 应用程序中运行良好。我没有实现要集群的应用程序,因为如果我需要它,Flink/Storm/Spark 已经在那里了。然后我找到了 Kafka Stream,对我来说,从客户端使用的角度来看,它类似于 reactive-akka。那么,如果我在独立应用程序或微服务中使用 Kafka Stream 或 reactive-kafka,我们是否需要关注客户端代码的可靠性/可用性?

4

1 回答 1

13

您对微批处理与流处理的理解是正确的。您也是对的,这三个系统都使用 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/ )

于 2016-10-24T06:51:51.880 回答