Flink Kafka Stream 相对于 Spark Kafka Stream 的优势? Flink 上的 Kafka Stream 呢?
The benefits of Flink Kafka Stream over Spark Kafka Stream? And Kafka Stream over Flink?
在 spark stream 中,我们为几乎实时的微批处理设置批间隔。在Flink(DataStream)或者Storm中,stream是realtime的,估计没有batch interval这个概念。
kafka中是consumer拉取的,我想象spark是通过batch interval参数从kafka broker中拉取消息的,那么flink和storm是怎么做到的呢?我想象 Flink 和 Storm 在快速循环中拉取 Kafka 消息以形成实时流源,如果是这样,如果我将 Spark 批处理间隔设置得很小,例如 100ms、50ms 甚至更小,我们之间是否有显着差异 Spark Streaming 和 Flink 还是 Storm?
同时,在Spark中,如果streaming数据很大,batch间隔太小,我们可能会遇到有大量数据等待处理的情况,因此发生变化,我们会看到OutOfMemmory .它会发生在 Flink 还是 Storm 中?
我已经实现了一个应用程序来进行主题到主题的转换,转换很容易,但源数据可能会很大(将其视为 IoT 应用程序)。我的原始实现由 reactive-kafka 支持,它在我的独立 Scala/Akka 应用程序中运行良好。我没有实现要集群的应用程序,因为如果我需要它,Flink/Storm/Spark 已经在那里了。然后我找到了 Kafka Stream,对我来说,从客户端使用的角度来看,它类似于 reactive-akka。那么,如果我在独立应用程序或微服务中使用 Kafka Stream 或 reactive-kafka,我们是否需要关注客户端代码的 reliability/availability?
您对微批处理与流处理的理解是正确的。你也是对的,所有三个系统都使用 Kafka 提供的标准 Java 消费者来拉取数据以在无限循环中处理。
主要区别在于,Spark 需要为其处理的每个微批次安排一个新作业。而且这种调度开销非常高,以至于 Spark 无法有效地处理非常低的批处理间隔,例如 100 毫秒或 50 毫秒,因此这些小批处理的吞吐量会下降。
Flink 和 Storm 都是真正的流式系统,因此它们都只在启动时部署一次作业(并且作业会持续运行直到用户明确关闭),因此它们可以处理每个单独的输入记录而不会产生开销并且非常低延迟。
此外,对于 Flink,JVM 主内存不是限制,因为 Flink 可以使用 off-head 内存,如果可用主内存太小,也可以写入磁盘。 (顺便说一句:自项目 Tungsten 以来,Spark 也可以使用堆外内存,但它们可以在某种程度上溢出到磁盘——但与 Flink AFAIK 不同)。据我所知,Storm 两者都不做,并且仅限于 JVM 内存。
我对反应式 Kafka 不熟悉。
对于Kafka Streams,它是一个完全容错的、有状态的流处理库。它专为微服务开发而设计(您不需要像 Flink/Storm/Spark 那样的专用处理集群),但可以将您的应用程序实例以任何方式部署到任何地方。您只需启动更多实例即可扩展您的应用程序。查看文档了解更多详情:http://docs.confluent.io/current/streams/index.html (there are also interesting posts about Kafka Streams in Confluent blog: http://www.confluent.io/blog/)
在 spark stream 中,我们为几乎实时的微批处理设置批间隔。在Flink(DataStream)或者Storm中,stream是realtime的,估计没有batch interval这个概念。
kafka中是consumer拉取的,我想象spark是通过batch interval参数从kafka broker中拉取消息的,那么flink和storm是怎么做到的呢?我想象 Flink 和 Storm 在快速循环中拉取 Kafka 消息以形成实时流源,如果是这样,如果我将 Spark 批处理间隔设置得很小,例如 100ms、50ms 甚至更小,我们之间是否有显着差异 Spark Streaming 和 Flink 还是 Storm?
同时,在Spark中,如果streaming数据很大,batch间隔太小,我们可能会遇到有大量数据等待处理的情况,因此发生变化,我们会看到OutOfMemmory .它会发生在 Flink 还是 Storm 中?
我已经实现了一个应用程序来进行主题到主题的转换,转换很容易,但源数据可能会很大(将其视为 IoT 应用程序)。我的原始实现由 reactive-kafka 支持,它在我的独立 Scala/Akka 应用程序中运行良好。我没有实现要集群的应用程序,因为如果我需要它,Flink/Storm/Spark 已经在那里了。然后我找到了 Kafka Stream,对我来说,从客户端使用的角度来看,它类似于 reactive-akka。那么,如果我在独立应用程序或微服务中使用 Kafka Stream 或 reactive-kafka,我们是否需要关注客户端代码的 reliability/availability?
您对微批处理与流处理的理解是正确的。你也是对的,所有三个系统都使用 Kafka 提供的标准 Java 消费者来拉取数据以在无限循环中处理。
主要区别在于,Spark 需要为其处理的每个微批次安排一个新作业。而且这种调度开销非常高,以至于 Spark 无法有效地处理非常低的批处理间隔,例如 100 毫秒或 50 毫秒,因此这些小批处理的吞吐量会下降。
Flink 和 Storm 都是真正的流式系统,因此它们都只在启动时部署一次作业(并且作业会持续运行直到用户明确关闭),因此它们可以处理每个单独的输入记录而不会产生开销并且非常低延迟。
此外,对于 Flink,JVM 主内存不是限制,因为 Flink 可以使用 off-head 内存,如果可用主内存太小,也可以写入磁盘。 (顺便说一句:自项目 Tungsten 以来,Spark 也可以使用堆外内存,但它们可以在某种程度上溢出到磁盘——但与 Flink AFAIK 不同)。据我所知,Storm 两者都不做,并且仅限于 JVM 内存。
我对反应式 Kafka 不熟悉。
对于Kafka Streams,它是一个完全容错的、有状态的流处理库。它专为微服务开发而设计(您不需要像 Flink/Storm/Spark 那样的专用处理集群),但可以将您的应用程序实例以任何方式部署到任何地方。您只需启动更多实例即可扩展您的应用程序。查看文档了解更多详情:http://docs.confluent.io/current/streams/index.html (there are also interesting posts about Kafka Streams in Confluent blog: http://www.confluent.io/blog/)