1 Flink 理论基础
1.1 实时计算对比
- Storm 延迟低但吞吐量小
- Spark Streaming 吞吐量大但是延迟高
- Flink 是一种兼具低延迟和高吞吐量特点的流式计算技术,还是一套框架中同时支持批处理和流处理的一个计算平台
1.2 Flink 特性
- 高吞吐、低延迟、高性能
- 支持带事件时间的窗口(window)操作:time、count、session, data-driven
- 支持有状态计算的exactly once语义
- 支持具有反压功能的持续流模型
反压功能:在Streaming中也有,就是参数的控制功能,比如双11时,当数据源,kafka中数据太多,实时计算处理不过来的时候,通过offset来压制数据读取的速度(要求:其中必须有消息队列,Streaming中的反压机制需要手动去调节)。 - 支持基于轻量级分布式快照(snapshot)实现的容错
- 同时支持batch on streaming处理和Streaming处理
- Flink在JVM内部实现了自己的内存管理
Spark在1.5版本之后实现了JVM内存管理。 - 支持迭代计算
- 支持程序自动优化:避免特定情况下shuffle、排序等昂贵操作,中间结果有必要时缓存
避免特定情况下shuffle是区别于Spark很关键的一点,它是在代码提交的时候就会进行代码优化,剔除调冗余的没有意义的依赖关系,在提交代码的时候就已经处理好了,也就是还没有提交到AM的时候就已经处理好。Spark Streaming是在AM中处理的。
1.3 Flink 技术栈
Manager进程
Flink 由两类运行时JVM进程管理分布式集群的计算资源。
(1)JobManager进行负责分布式任务管理,如任务调度、检查点、故障恢复等。在高可用HA 分布式部署时,系统中可以有多个JobManager,即一个leader加多个standby。 JobManager是Flink主从架构中的master。
(2)TashManager进程负责执行任务线程,以及缓存和传输stream。TaskManager是Flink主从架构中的worker。
此外,作为作业的发起者,客户端(client)向JobManager提交作业,但客户端不是Flink运行时的一部分。
1.3.1 Flink运行的三种模式
- Local
Cluster
Standalone
YARN
Cloud
1.3.2 Flink Core
Runtime:分布式Streaming Dataflow
Flink 和 Spark Streaming 不同之处:
Spark Core 和 Spark Streaming 最后都是运行在 RDD 上,是基于RDD的操作。
Flink Stream 处理:
DataStream API
Flink Batch 处理:
DataSet API
同spark—样,Flink也有Flink Core (runtime层)来统一支持流处理和批处理
Flink Core (runtime层):是一个分布式的流处理引擎,提供了支持Fl ink计算的全部核心实
现。
- 支持分布式流处理
- JobGraph到ExecutionGraph的映射、调度,为上层API层提供基础服务
Flink API层:实现面向Stream的流处理和面向batch的批处理API。
特定应用领域库:
- Flink ML:提供机器学习Pipelines API并实现多种机器学习算法python scikit-learn
- 图计算库Geliy:提供了图计算相关API和多种图计算算法实现
1.4 Flink API
1.4.1 API类型
- DataSet:对静态数据讲行批处理操作、将静态数据抽象分布式数据集,使用
Flink各种操作符处理数据集,支持Java、Scala、Python - Datastream:对数据进行流处理操作,将流式的数据抽象成分布式数据流,用Flink各种操作符处理数据流,支持Java、Scala
- Table API:对结构化数据进行查询操作,将结构化数据抽象成关系表。并通过类SQL的DSL对关系表进行各种查询操作,支持Java、Scala
1.4.2 数据集
数据集:
- 无界数据持续—圻,不停流入数据(交易日志、 诂点击日志)
- 有界数据集:批次的,类似MapReduce处理的数据集
数据处理模型:
- 流处理:实时任务,任务一直运行,处理无界数据
- 批处理:批处理有界数据,有界数据代表数据是有限集合
Flink:将有界数据集当做无界数据集的一种特例
Spark Streaming:把无界数据集分割成有界,通过微批的方式对待流计算
1.5 Flink 架构
1.5.1 Flink数据处理组件
简单实现 Word Count 的流处理程序,其 StreamGraph 的形象表示:
Flink API 图解:
任务执行:
- runtime层以JobGraph形式接收程序。JobGraph即为一个一般化的并行数据流图(data
flow),它拥有任意数量的Task来接收和产生data stream、 - DataStream API和DataSet API都会使用单独编译的处理方式生成JobGraph。 DataSet
API使用optimizer来决定针对程序的优化方法,而DataStream API则使用stream builder
来完成该任务 - 在执行JobGraph时,Flink提供了多种候选部署方案(如local, remote, YARN等)。
- Flink附随了 一些产生DataSet或DataStream API程序的的类库和API:处理逻辑表查询
的Table,机器学习的FlinkML,图像处理的Geliy,复杂事件处理的CEP。
1.5.2 Streaming Dataflow
- Flink程序实际执行,映射到流式数据流(Streaming Dataflow),有流和转化符构成。
- Stream类型RDD是一种数据集。可以从Source中来,也可以从别的Transformation转化而来。
- Flink Transformation和Spark算子基本一致。