文章目录
1.Flink VS Spark
Flink是基于流的有状态的计算。相对于Spark,Flink还是比较年轻,双方各有优势,取长补短。
1.1定位
- Spark:流是批的特例
- Flink:批是流的特例
1.2数据模型:
- Spark:Rdd集合,依靠lineage做恢复,存在宽窄依赖
- Flink:数据量和event的序列,依靠checkpoint做恢复,保证一致性,其次可以是来一条数据处理一条,传输到下一个节点,也可以优化成批次处理,其中ck(checkpoint)可以不用落盘,这样可以提高性能以及低延迟。
1.3处理模型:
- Spark:支持各种数据处理,对机器学习迭代训练支持比较好(基于RDD本身模型)
- Flink:有状态的计算,尤其API层级多样,支持丰富,主要是流计算的优势。
1.4抽象层次:
- Spark:批流本质底层走的是一套API
- Flink:DataStream和DataSet是两套完全不同的API
1.5内存管理:
- Spark: 由java管理到tungsten来管理内存
- Flink: 由Flink自身管理内存
1.6支持的语言:
- Spark:Java、Scala、Python
- Flink:Java、Scala
1.7SQL的支持
Spark的SQL支持比Flink更深
1.8外部数据源
- Spark:非常的丰富,且支持自定义外部数据源
- Flink:map/reduce 、InputFormat,也支持自定义Source
2.适用场景
2.1Event-driven Applications(事件驱动程序)
- 定义:事件驱动程序是statefull app,通过checkpoints保证容错,拉取远程数据到本地做持久化存储。
- 优势:读取本地数据而非远程数据库、分层体系中多个应用可以共享一个数据库
- 如何支持:有些高级源语;支持time、window、processfunction;savepoints:一个一致的映像文件
- 案列: 各种检测、web应用(社交应用)等
2.2Data Analytics Applications(数据分析程序)
- 定义:无界处理、依赖内部state做flink故障恢复机制
- 优势:降低数据处理延迟。
- 如何支持:提供了标准的ANSI的sql接口,对于批处理和流处理提供了统一的语义
- 案列:网络质量监控、大规模图分析等
2.3Data Pipeline Applications(数据管道程序)
- 定义:类似于数据etl,但并非周期性操作,而是连续性操作,降低目标间数据移动的延迟
- 优势:降低延迟,更加通用。
- 如何支持:基于多层API结构以及多种多样的Connectors
- 案列:电商的实时搜索的索引构建、电商的连续的ETL
3.基本概念
3.1层级API
最终的API是SQL,一切的计算如果不提供SQL框架,那么都不会受欢迎的。
- ProcessFunction-》DataStream PAI/DataSet API-》Table API-》SQL
3.2程序和数据流
env-》Source-》transformations-》sink-》execute
3.3并行数据流
- 本质即为并行和分布式的,一个流对应一个或者多个流的分区,每个操作符有一个或者多少个操作符的子任务
- 支持两种重分发模式:一对一流(如map)、重新分发流(keyby、window等)
3.4窗口
无法计算流中所有元素,故需通过window去限定范围。窗口主要分为两大类,时间驱动窗口和事件驱动窗口
3.5时间
- Event Time:数据产生的时间
- Ingestion time :数据摄入时间
- Processing Time :数据处理的时间
3.6Stateful Operations(有状态的操作)
通过window等操作使一次操作可以跨过多个时间去操作信息,这些操作被称为有状态的操作。
3.7检查点和容错
Flink是通过Stream replay 和 CheckPoint实现容错的。
3.8基于流的批处理
流中有界数据即为批数据量,flink可处理流数据和批数据
特例:
- 批处理不适用检查点保证容错,而是直接回放数据
- DataSet API 并非KV索引的结构
- DataSet API 引入的特殊的同步迭代只能在有界流上去实现