Flink的定位:大数据处理引擎
ApacherFlink是一个框架和分布式处理处理引擎,用于对无界和有界数据流进行有状态计算。Flink被设计再所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
Flink的应用场景:
1、电商和市场营销:实时数据报表,广告投放,实时推荐
2、物联网:传感器实时数据采集和显示,实时报警,交通运输业
3、物流配送和服务业:订单状态实时更新,通知信息推送
4、银行和金融业:实时结算和通知推送,实时检测异常行为
Flink核心特性:
⚫ 高吞吐和低延迟,每秒处理百万个事件,毫秒级延迟。
⚫ 结果的准确性。Flink 提供了事件时间(event-time)和处理时间(processing-time) 语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
⚫ 精确一次(exactly-once)的状态一致性保证。
⚫ 可以连接到最常用的存储系统,如 Apache Kafka、Apache Cassandra、Elasticsearch、 JDBC、Kinesis 和(分布式)文件系统,如 HDFS 和 S3。
⚫ 高可用。本身高可用的设置,加上与 K8s,YARN 和 Mesos 的紧密集成,再加上从故 障中快速恢复和动态扩展任务的能力,Flink 能做到以极少的停机时间 7×24 全天候 运行。
⚫ 能够更新应用程序代码并将作业(jobs)迁移到不同的 Flink 集群,而不会丢失应用 程序的状态。
分层API
Flink 是一个非常易于开发的框架,因为它拥有易于使用的分层 API,整体API 分层如图
2020 年 12 月 8 日发布的新版本 1.12.0, 已经完全实现了真正的流批一体,DataSet API 已处于软性弃用(soft deprecated)的状态。用 Data Stream API 写好的一套代码, 即可以处理流数据, 也可以处理批数据,只需要设置不同的执行模式。
Flink和Spark的区别
1、数据处理架构
数据处理分批处理和流处理两种。批处理针对的是有界数据集,非常适合需要访问海量的全部数据才能完成的计算工作,一 般用于离线统计。 流处理主要针对的是数据流,特点是无界、实时, 对系统传输的每个数据依次执行操作, 一般用于实时统计。
Spark 以批处理为根本,并尝试在批处理之上支持流计算;在 Spark 的世界观中,万物皆批次,离线数据是一个大批次,而实时数据则是由一个一个无限的小批次组成的。所以对于流 处理框架 Spark Streaming 而言,其实并不是真正意义上的“流”处理,而是“微批次” (micro-batching)处理。
Flink 则认为,流处理才是最基本的操作,批处理也可以统一为流处理。在 Flink 的世界观中,万物皆流,实时数据是标准的、没有界限的流,而离线数据则是有界限的流。就是所谓的无界流和有界流。
正因为这种架构上的不同,Spark 和 Flink 在不同的应用领域上表现会有差别。一般来说, Spark 基于微批处理的方式做同步总有一个“攒批”的过程,所以会有额外开销,因此无法在流处理的低延迟上做到极致。在低延迟流处理场景,Flink 已经有明显的优势。而在海量数据的批处理领域,Spark 能够处理的吞吐量更大,加上其完善的生态和成熟易用的 API,目前同 样优势比较明显。
2、数据模型和运行架构
Spark 和 Flink 在底层实现最主要的差别就在于数据模型不同。
Spark 底层数据模型是弹性分布式数据集(RDD),Spark Streaming 进行微批处理的底层 接口 DStream,实际上处理的也是一组组小批数据 RDD 的集合。可以看出,Spark 在设计上本 身就是以批量的数据集作为基准的,更加适合批处理的场景。
Flink 的基本数据模型是数据流(DataFlow),以及事件(Event)序列。Flink 基本上是 完全按照 Google 的 DataFlow 模型实现的,所以从底层数据模型上看,Flink 是以处理流式数据作为设计目标的,更加适合流处理的场景。
数据模型不同,对应在运行处理的流程上,自然也会有不同的架构。Spark 做批计算,需 要将任务对应的 DAG 划分阶段(Stage),一个完成后经过 shuffle 再进行下一阶段的计算。而 Flink 是标准的流式执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处 理。
如果在工作中需要从 Spark 和 Flink 这两个主流框架中选择一个来进行实时流处理,我们 更加推荐使用 Flink,主要的原因有:
⚫ Flink 的延迟是毫秒级别,而 Spark Streaming 的延迟是秒级延迟。
⚫ Flink 提供了严格的精确一次性语义保证。
⚫ Flink 的窗口 API 更加灵活、语义更丰富。
⚫ Flink 提供事件时间语义,可以正确处理延迟数据。
⚫ Flink 提供了更加灵活的对状态编程的 API。
基于以上特点,使用 Flink 可以解放程序员, 加快编程效率, 把本来需要程序员花大力气 手动完成的工作交给框架完成。 当然,在海量数据的批处理方面,Spark 还是具有明显的优势。而且 Spark 的生态更加成熟,也会使其在应用中更为方便。
另外,Spark 2.0 之后新增的 Structured Streaming 流处理引擎借鉴 DataFlow 进行了大量优化,同样做到了低延迟、时间正确性以及精确一次性语义保证;Spark 2.3 以后引入的连续处 理(Continuous Processing)模式,更是可以在至少一次语义保证下做到 1 毫秒的延迟。而 Flink 自 1.9 版本合并 Blink 以来,在 SQL 的表达和批处理的能力上同样有了长足的进步。