<meta name="source" content="lake">
-
Google File System
-
Big Table
-
Map Reduce
-
HDFS
-
HBase
-
Hadoop
Hadoop 基于硬盘,可以处理海量数据;
Spark 基于内存,性能提高百倍,微批(500ms);
Flink 基于 Google Dataflow Model(2015),真正的实时框架;
Beam 写一套代码,可以运行在 Spark 和 Flink 引擎上。
Flink 用于对无界和有界数据流进行状态计算
- 低延迟(Spark Streaming的延迟是秒级,Flink延迟是毫秒级)
- 高吞吐(阿里双十一使用Flink处理4.6PB,双十一大屏)
- 结果的准确性和良好的容错性(exactly-once)
Lambda 架构
批处理 + 流处理

流处理系统为了更快看到结果,批处理保证精准性,
在Flink之前都不能做这样一点,Flink是批流统一的。

Flink 主要特点
事件驱动

来一条数据,出发一次算子的计算,事件驱动
后端事件驱动的代表:netty
大数据最难学习的框架:Flink
后端最难学习的是:netty
前端最难学习的是:Rxjs
编程里最难学习的是:函数式编程
基于流的世界观(流批统一)
在 Flink 中,一切都是由流组成的,离线数据是无界的流,用流来模拟批。
Flink 分层API
- 越顶层越抽象,表达含义越简明,使用越方便
- 越底层越具体,表达能力越丰富,使用越灵活

Flink 其它特点
- 支持事件时间和处理时间语义
- 精确一次的状态一致性保证
- 低延迟(毫秒级)
- 和很多大数据中间接连接
事件时间:事件真实发生的时间,要求数据中有时间戳
处理时间:事件到达节点
Flink vs Spark Streaming
Spark 采用 RDD 模型,RDD的集合
Flink 基本数据模型是数据流,以及事件序列
选型
运行时架构
Flink wordcount
创建 IDEA -> Maven 项目 -> Add Archetype
- org.apache.flink
- flink-quickstart-scala
- 1.10.0
选择某项目原型,点击 Next
设置项目名以及我们组织的一些信息(可选)
任务提交流程(独立集群)
image.png
程序的并行度设置为10,那么并行任务的数量就是10,任务管理器会向资源管理器请求10个任务槽。
Yarn
可以读成雅安,
任务调度原理

Flink 程序 编译之后,可能有一定的优化,然后成为一个 Dataflow Graph,通过Actor System (异步I/O)提交,发送心跳信息确认是否还活着。
Flink 中每个 TaskManager 都是一个 JVM 进程,每一个 task slot 都会启动一个线程,它可能会在独立的线程上执行一个或多个 subtask,每一个 task 占用一个 task slot
为了控制一个 TaskManager 能接受多少个 task,TaskManager 通过 task slot 来进行控制(一个 TaskManager 至少有一个 slot)

每一个算子后面都可以设置一个并行度,比如上图 sink 并行度是1,其他算子是 2

可以在 flink-conf.yaml 配置文件中设置每个 TaskManager 默认插槽(slot)数量。
假设目前3个 TaskManager,则有9个slot,若设置并行度为1,那么空闲8个slot。
任务槽是个静态的概念,可以写死,但是并行度是一个动态的概念,在我们的编程中可以动态修改。
程序与数据流
- 所有的 Flink 程序都是由三部分组成的:Source、Transformation 和 Sink。
- Source 负责读取数据源,Transformation 利用各种算子进行处理加工,Sink 负责输出/持久化。
所以在运行的时候,Flink 程序会被映射成 dataflow,包含以上三部分,dataflow 类似于有向无环图(DAG),在大部分情况下,transformation 跟 dataflow 中的算子是一一对应的关系。

执行图
StreamGraph
写的代码通过 Stream API 编写的代码生成的最初的图,用来表示程序的拓扑结构。
JobGraph
经过优化后生成了 JobGraph,提交给 JobManager的数据结构就是这种,主要优化为将多个符合条件的算子 chain 在一起作为一个节点。
ExecutionGraph
JobGraph 的并行化版本,是调度层的最核心的数据结构。

Flink 运行时组件

分发器
CheckPoint机制
容错
Flink 会在指定的时间段上保存状态信息,如果 Flink 挂了就可以把上一次状态信息再捞出来。
Flink 本身就是有状态的,Flink 可以让你选择执行过程中的数据保存在哪里,在 Flink 中称作 State Backends ,CheckPoint 也是保存在这之上
- MemoryStateBackend
- FsStateBackend
- RocksDBStateBackend
即
- 内存
- 文件系统 HDFS
- 本地数据库
精确一次 exactly-once
DataStream API
checkpoint 的存储
可以是内存、文件系统 HDFS 或 RocksDB
开发角度的大致流程
Flink 程序 -> StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图


面试题
Flink vs Spark Streaming
Flink 是真正的流处理,延迟在毫秒级
Flink 可以处理事件时间,多种时间语义
Flink CheckPoint 机制比 Spark 更灵活,性能更高
Flink 易于实现端到端一致性
CheckPoint 存在哪里
内存、文件系统、RocksDB
三 Flink 部署
四 Flink 运行时架构
主要包括四个不同的组件
- 作业管理器 JobManager
- 资源管理器 ResourceManager
- 任务管理器 TaskManager
- 分发器 Dispatcher
Flink 是用 Java 和 Scala 实现的,所有组件都会运行在 JVM 上

Flink 时间概念和应用场景?
- 事件时间,一般数据中要带当时的时间戳,例如轨迹点数据有被采集时的时间戳
- 处理时间,执行操作算子的本地系统时间,与机器相关
- 摄取时间,数据进入 Flink 的时间。多个数据源算子的情况下,每个数据源算子会使用本地系统时钟指派摄取时间,后续基于时间的相关操作中,都会使用数据记录中的摄取时间。
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
可以设置时间类型
设置水位线 Watermark ,即遇到了一个时间戳达到了窗口关闭时间,不应该立刻触发窗口于计算,而是等待一段时间,等迟到的数据来了再关闭窗口
Watermark 可以正确的处理乱序时间,通常用 Watermark 机制结合 window 来实现,window 的执行也是由 Watermark 触发的。

滑动窗口

这个元素属于 n 个窗口,需要复制多份。比如 (Value, 6s) 代表在 6s 到达的数据,它属于 [0s, 10s] 和 [5s, 15s] 。
网友评论