想了解SparkStreaming 和Kafka Stream的区别,首先我们需要先了解一下Spark Streaming和Kafka Stream.
什么是Spark Streaming?
Spark Streaming是核心Spark API的扩展,可让其用户执行实时数据流的流处理。它从Kafka,Flume,Kinesis或TCP套接字等来源获取数据。可以使用复杂的算法对这些数据进行进一步处理,这些复杂的算法可以使用诸如map,reduce,join和window之类的高级功能来表达。
可以将最终输出(即处理后的数据)推送到诸如HDFS文件系统,数据库和实时仪表板之类的目的地。
Spark Streaming的工作原理:
Spark Streaming从数据源以数据流的形式获取实时输入,并将其进一步分为几批,然后由Spark引擎处理以生成大量输出。
Spark Streaming允许您将机器学习和图形处理用于数据流以进行高级数据处理。它还提供了代表连续数据流的高级抽象。
数据流的这种抽象称为离散流或DStream。可以通过对Kafka,Flume和Kinesis等源的数据流或其他DStream进行高级操作来创建此DStream
Spark Streaming使用Spark Core 的快速数据调度功能来执行流分析。从诸如Kafka,Flume,Kinesis等之类的源中以迷你批的形式摄取的数据用于执行数据流处理所需的RDD转换。
Spark Streaming使您可以根据需要使用Scala,Java或Python编写程序来处理数据流(DStreams)。由于此处将用于批处理的代码用于流处理,因此使用Spark Streaming(批处理和流处理的混合)实现Lambda体系结构变得容易得多。但这是以等于最小批处理持续时间的延迟为代价的。
Spark Streaming中的输入源
Spark支持主要来源,例如文件系统和socket连接。另一方面,它也支持高级资源,例如Kafka,Flume,Kinesis
什么是Kafka stream?
Kafka Stream是一个客户端库,可让您处理和分析从Kafka接收的数据输入,并将输出发送到Kafka或其他指定的外部系统。Kafka依赖于流处理概念,例如:
• 准确区分事件时间和处理时间
• 窗口支持
• 高效直接的应用程序状态管理
通过利用Kafka中的生产者和消费者库来利用Kafka的本机功能,从而简化了应用程序开发,从而使其更加直接和快捷。正是由于这种固有的Kafka潜力,使得Kafka流式传输可以提供数据并行性,分布式协调,容错和操作简便性。
Kafka Streaming中的主要API是提供多个高级运算符的流处理DSL(特定于域的语言)。这些运算符包括:筛选器,映射,分组,窗口,聚合,联接和表的概念。
Kafka中的消息传递层对进一步存储和传输的数据进行分区。根据状态事件在Kafka流中对数据进行分区,以进行进一步处理。通过将拓扑划分为多个任务来缩放拓扑,其中为每个任务分配了输入流中的分区列表(Kafka主题),从而提供了并行性和容错能力。
Kafka可以进行状态转换,与Spark Streaming中的批处理不同。它在其主题内存储状态,流处理应用程序将其用于存储和查询数据。因此,其所有操作均受状态控制。这些状态还用于连接主题以形成事件任务
Spark Streaming与Kafka Stream:何时使用什么?
Spark Streaming使您可以灵活地选择任何类型的系统,包括具有lambda架构的系统。但Spark Streaming的延迟范围从毫秒到几秒。
如果延迟不是主要问题,并且您正在寻求源兼容性方面的灵活性,那么Spark Streaming是最佳选择。可以在EC2,Hadoop YARN,Mesos或Kubernetes上使用独立的集群模式运行Spark Streaming。
它可以访问HDFS,Alluxio,Apache Cassandra,Apache HBase,Apache Hive和许多其他数据源中的数据。它提供了容错能力,还提供了Hadoop分发。
此外,在Spark流式传输的情况下,您不必为批处理和流式传输应用程序分别编写多个代码,在这种情况下,单个系统可以同时满足这两种情况。
另一方面,如果延迟是一个重要的问题,并且必须坚持以短于毫秒的时间范围进行实时处理,则必须考虑使用Kafka Streaming。由于事件驱动处理,Kafka Streaming提供了高级的容错能力,但是与其他类型的系统的兼容性仍然是一个重大问题。此外,在对可伸缩性有较高要求的情况下,Kafka具有最佳的可伸缩性,因此非常适合。
如果您要处理从Kafka到Kafka的本机应用程序(输入和输出数据源都在Kafka中),则Kafka流式传输是您的理想选择。
虽然Kafka Streaming仅在Scala和Java中可用,但Spark Streaming代码可以用Scala,Python和Java编写。
参考:
https://www.cuelogic.com/blog/analyzing-data-streaming-using-spark-vs-kafka