Spark Streaming与Kafka Streaming对比

叙述

对流处理的需求每天都在增加。原因是,处理大量数据通常是不够的。

必须快速处理数据,以便公司能够对不断变化的业务条件作出实时反应。

流处理是对数据进行连续、并行的实时处理。

流式处理是处理数据流或传感器数据的理想平台(通常事件吞吐量与查询数量之比很高),而“复杂事件处理”(CEP)则利用事件逐个处理和聚合(例如,对于来自各种来源的可能出现顺序错误的事件,通常具有大量的事件)规则或业务逻辑)。

我们有许多选项可以对数据进行实时处理,例如spark、kafka stream、flink、storm等。

在本博客中,我将讨论Apache Spark和Kafka Stream之间的差异。

Apache Spark


ApacheSark是大规模数据处理的通用框架,支持许多不同的编程语言和概念,如MapReduce、内存处理、流处理、图形处理和机器学习。这也可以用于Hadoop的顶部。数据可以从Kafka、Flume、Kinesis或TCP套接字等许多源中摄取,并且可以使用复杂的算法进行处理,这些算法使用诸如map、reduce、join和window等高级函数表示。


640?wx_fmt=png

在内部,它的工作原理如下。Spark Streaming接收实时输入数据流,并将数据分为批,然后由Spark engine进行处理,以批量生成最终结果流。


640?wx_fmt=png

Spark Streaming提供了一种高级抽象,称为离散流或数据流,它表示连续的数据流。数据流可以从输入数据流(如Kafka、Flume和Kinesis)中创建,也可以通过对其他数据流应用高级操作来创建。在内部,数据流表示为RDD序列。

Kafka Stream


Kafka Streams是一个客户端库,用于处理和分析存储在Kafka中的数据,并将结果数据写回Kafka或将最终输出发送到外部系统。它建立在重要的流处理概念之上,例如正确区分事件时间和处理时间、窗口支持和简单(但有效)的应用程序状态管理。它基于Kafka中已经包含的许多概念,例如通过划分主题来扩展。此外,由于这个原因,它作为一个轻量级的库,可以集成到一个应用程序中。然后,应用程序可以按需要操作——独立运行,在应用服务器中,作为Docker容器,或者通过诸如Meos之类的资源管理器。

Kafka Streams直接解决了流处理中的许多难题:

  • 事件一次处理(不是微批次)的毫秒延迟。

  • 状态处理,包括分布式连接和聚合。

  • 方便的DSL。

  • 使用类似数据流模型的无序数据窗口化。

  • 分布式处理和容错,故障切换速度快。

  • 无停机滚动部署。

Apache Spark可以与Kafka一起用于流式传输数据,但是如果您只是为了这个新应用程序部署一个Spark集群,这无疑是一个巨大的复杂性冲击。

为了克服这一复杂性,kafkawe可以使用成熟的流处理框架,Kafka流以如下目标出现在图中。

640?wx_fmt=png

其目标是简化流处理,使其成为异步服务的主流应用程序编程模型。它充分利用Kafka不仅仅是一个消息代理。

Streams基于KTables和KStreams的概念,可以帮助他们提供事件时间处理。

提供与Kafka提供的核心抽象完全集成的处理模型,以减少流体系结构中移动件的总数。

将状态表的概念与事件流完全集成,并在单个概念框架中提供这两个事件。使Kafka Streams成为一个没有流处理集群的完全嵌入式库 - 只需Kafka和您的应用程序。它还会在添加应用程序的新实例或现有应用程序崩溃时平衡处理负载。并维护表的本地状态,并帮助从故障中恢复。

那么,你应该用什么?

低延迟和易于使用的事件时间支持也适用于Kafka Streams。它是一个相当集中的库,它非常适合某些类型的任务。这也是为什么它的一些设计可以如此优化Kafka的工作原因。您不需要设置任何类型的特殊Kafka Streams集群,也没有集群管理器。如果您需要进行简单的Kafka主题到主题转换,按键计算元素,使用来自其他主题的数据丰富流,或运行聚合或仅实时处理 - Kafka Streams适合您。

如果事件时间不相关且秒范围内的延迟可以接受,则Spark是首选。它很稳定,几乎任何类型的系统都可以轻松集成。此外,它还附带了每个Hadoop发行版。此外,用于批处理应用程序的代码也可以用于流应用程序,因为API是相同的。

希望这篇对比对你有帮助。

640?wx_fmt=jpeg

长按二维码 ▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓