在何时使用spark,何时使用flink和何时使用Kafka之间有很多嗡嗡声。
Spark流和flink都提供了一次保证 ,即每条记录将被处理一次,从而消除了任何可能的重复项。 与任何其他处理系统(如Storm)相比,两者都提供了非常高的吞吐量,并且两个处理引擎中的容错开销都很低,而Kafka客户端最多可以创建一次,至少可以一次创建, 一旦消息处理需要。 Kafka被用于两大类应用程序:
- 无线流媒体俱乐部
- Azure功能和事件中心:优化吞吐量
- Netflix Deseja Exibir电影ao mesmo tempo que no Cinema
- HANDBALL→贵族阿拉伯人Saoudite Tunisie直播Le Mardi 15 Janvier 2019
- 斯卡拉自学卡夫卡流—排名第一
- 建立实时流数据管道,以可靠地在系统或应用程序之间获取数据
- 构建实时流应用程序,以转换或响应数据流。
需要实时流处理 ,因为数据是作为连续的事件流到达的 ,例如运动中的汽车发出GPS信号,金融交易,手机信号塔之间的信号交换,网络流量(包括会话跟踪,了解用户)网站上的行为,工业传感器的测量结果。 因此,对于所有这些类型的数据,流处理是处理此类数据的更好方法。 流处理对于保持一致性和容错性具有挑战性,因为与此数据生成和处理相关联的动态性,您需要一个可以跟上并处理连接中断的系统,还需要能够从中使用数据的能力。流处理器,因此您需要能够以窗口的形式回答复杂的查询,因此您需要丰富的窗口定义,不同的方式来提取信息并汇总信息,并且您也不想让系统陷入困境需要流处理器中的低延迟和高吞吐量。
Spark Streaming和Flink的不同之处在于它们的计算模型,而Spark采用了微型批次Flink采用了基于连续流操作的流模型。 就窗口标准而言,spark具有基于时间的窗口标准,而flink具有基于记录的或任何自定义使用的已定义窗口标准。
Flink和Spark都是通用数据处理平台,也是Apache Software Foundation (ASF)的顶级项目 。 它们具有广泛的应用领域,可用于数十种大数据场景。 两者都能够以独立模式运行,但是许多人都在Hadoop(YARN,HDFS)之上使用它们。 由于它们具有记忆性,因此它们共享强大的性能。
让我们来看看Spark,Flink和Kafka及其优势。
Apache Spark:
Spark是一个开放源代码的集群计算框架 ,具有庞大的全球用户群。 它用Scala,Java,R和Python编写,为程序员提供了基于容错,只读多组分布式数据项构建的应用程序编程接口(API)。 自其首次发布(2014年5月)以来的短短两年时间里,由于它的速度,易用性和处理复杂分析要求的能力,它已被实时,内存中的高级分析广泛接受。
火花的优点:
- 与基于大数据和基于MapReduce的传统技术相比,Apache Spark具有多个优势。
- 速度-Spark可以执行批处理作业,比MapReduce快10到100倍。
- 易于使用-Apache Spark具有易于使用的API,为在大型数据集上运行而构建。
- 统一引擎— Spark可以利用其群集管理器(YARN)和基础存储(HDFS,HBase等)在Hadoop之上运行。 但是,它也可以独立于Hadoop运行,与其他集群管理器和存储平台(如Cassandra和Amazon S3)联手。 它还带有更高级别的库,这些库支持SQL查询数据流,机器学习和图形处理。
- 从Java,Scala或Python中进行选择-Spark不会使您局限于特定语言,而是让您从Java,Scala,Python,R甚至Clojure等流行语言中进行选择。
- 内存中数据共享-不同的作业可以共享内存中的数据,这使其成为迭代,交互和事件流处理任务的理想选择。
Apache Flink:
Apache Flink是一个用于分布式流和批处理数据处理的 开源平台 。 Flink的核心是流数据流引擎,可为数据流上的分布式计算提供数据分发,通信和容错能力。 Flink还在流引擎之上构建批处理,覆盖了本机迭代支持,托管内存和程序优化。
Flink的优点:
- Flink流处理将数据流视为真实流,即,数据元素一到达,就立即通过流式处理程序“流水线化”。 这允许对流执行灵活的窗口操作。
- 更好的内存管理-显式内存管理摆脱了Spark框架中偶尔出现的峰值问题。
- 速度—通过允许在同一节点上进行迭代处理,而不是让群集独立运行它们,来管理更快的速度。 通过对其进行调整以仅重新处理已更改的那部分数据而不是整个数据集,可以进一步调整其性能。 与标准处理算法相比,它的速度提高了五倍。
Apache Spark被认为是面向批处理的Hadoop系统的替代品。 但它也包含一个称为Apache Spark Streaming的组件。 与此形成对比的是Apache Flink,后者是一个大数据处理工具,众所周知,它可以在分布式系统上大规模地以低数据延迟和高容错能力快速处理大数据。 它的定义功能是实时处理流数据的能力。
Apache Kafka:
Apache Kafka是一个 分布式流平台 。 对于更复杂的转换,Kafka提供了完全集成的Streams API 。 Streams API允许应用程序充当流处理器 , 使用一个或多个主题的输入流 ,并生成一个或多个输出主题的输出流 ,从而有效地将输入流转换为输出流。
Kafka帮助为许多流处理问题提供支持:
- 处理乱序数据,
- 处理代码更改时的输入,
- 执行状态计算等
- 生产者和消费者API用于输入,
- 流处理器实例之间的容错分组机制
这些功能有助于解决应用程序面临的难题:处理乱序数据,在代码更改时重新处理输入,执行有状态计算等。
流API建立在Kafka提供的核心原语之上:它使用生产者和使用者API作为输入,使用Kafka进行状态存储,并使用相同的组机制来实现流处理器实例之间的容错。
Spark和Flink之间的比较:
Flink和Spark是内存数据库,它们不会将其数据持久存储到存储中。 他们可以将数据写入永久存储,但是流式传输的全部目的是将其保存在内存中,以分析当前数据。 所有这些使程序员可以使用流数据编写大数据程序。 他们可以采用任何格式的数据,将不同的数据集连接起来,将其简化为键值对(映射),然后对相邻的数据对进行计算以产生一些最终的计算值。 他们还可以将这些数据项插入机器学习算法中,以进行一些预测(预测模型)或发现模式(分类模型)。
下面给出的是spark和flink之间的比较:
- 数据处理
Spark以批处理模式处理数据,而Flink实时处理流数据。 Spark处理数据块,称为RDD,而Flink可以实时处理数据行。 因此,尽管Spark始终具有最小数据延迟,但Flink却并非如此。
- 内存管理
Flink可以自动适应各种数据集,但是Spark需要手动优化和调整其工作以适应各个数据集。 另外,Spark还可以进行手动分区和缓存。 因此,预计处理会有所延迟。 Flink具有不同的内存管理方法。 当内存已满时,将页面链接到磁盘,这在Windows和Linux中也是如此。 当该节点内存不足时,Spark会使该节点崩溃。 但是它不会丢失数据,因为它具有容错能力。
- 数据流
Flink能够在需要时提供其数据处理的中间结果。 尽管Spark遵循程序编程系统,但Flink遵循分布式数据流方法。 因此,只要需要中间结果,就可以使用广播变量将预先计算的结果分发到所有工作节点。
- 命令行界面(CLI)
Spark在Scala,Python和R中具有CLI。Flink确实没有CLI,但是区别很小。
拥有Spark CLI意味着用户可以启动Spark,获取SparkContext并一次编写一行程序。 这使得遍历数据和调试更加容易。 数据科学家的工作方式是逐步浏览数据并运行地图并简化流程,然后逐步进行。
Flink也有一个Scala CLI,但是并不完全相同。 使用Flink,您可以编写代码,然后运行print()以批处理方式提交它并等待输出。
- 支持其他流媒体产品
Flink和Spark均可与LinkedIn编写的流产品Kafka一起使用。 Flink还可以与Storm拓扑一起使用。
kafka和flink之间的比较:
- Flink和Streams API程序之间的根本区别在于它们的部署和管理方式以及如何协调包括容错能力的并行处理。
- Flink是一个集群框架,这意味着该框架负责在独立的Flink集群中或使用YARN,Mesos或容器(Docker,Kubernetes)部署应用程序。
- Streams API是任何标准Java应用程序都可以嵌入的库,因此不会尝试规定部署方法。 因此,您基本上可以使用任何部署技术来部署应用程序。
- 这两个系统在分布式协调方面的最大区别是:
- Flink具有专用的主节点进行协调,而Streams API则依赖Kafka代理进行分布式协调和容错。
- 在Apache Flink中,专用主节点可全局协调容错,扩展和状态均匀分配。
结论:
除了Apache Flink的API比Apache Spark的API更易于使用之外,它还具有比Apache Spark更灵活的窗口系统。 在计算集群中使用网络附加存储(NAS)时,它也比Apache Spark快得多。 在批处理方面,Apache Flink也更快,大约是具有NAS的Apache Spark的两倍。 与Apache Spark相比,Apache Flink 在处理流中的元素方面几乎没有延迟 。
综上所述,虽然Kafka和Flink中的Streams API之间肯定存在重叠,这主要是由于它们的体系结构差异,因此我们将它们视为互补系统 。 Streams API使流处理可以作为应用程序编程模型进行访问,另一方面, 作为微服务构建的应用程序可以从中使用 , Flink非常适合于部署在现有集群中并受益于吞吐量,延迟,批处理的应用程序 。
参考文献:
- https://kafka.apache.org
- https://flink.apache.org/
- https://spark.apache.org/docs/latest/