第一章 Flink简介
1.1 什么是Flink
Flink是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态计算,可部署再各种集群环境,对各种大小的数据规模进行快速计算
Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算
为什么要选择Flink?
- 流数据更真是的反映了我们的生活方式
- 传统的数据架构是基于有限数据集的
- 我们的目标是 低延迟 高吞吐 结果的准确性和良好的容错性
1.2 Flink的特点
- 批流统一
- 支持高吞吐,低延迟,高性能的流处理
- 支持带有事件时间的窗口(Window)操作
- 支持有状态计算的Exactly-once语义 ----- 精确一次性语义
- 支持高度灵活的窗口操作,支持基于time,count,session窗口操作
- 只是具有Backpressure(倍压)功能的持续流模型
- 支持基于轻量级分布式快照(snapshot)实现的容错
- 支持迭代计算
- 支持在JVM内部实现自己的内存管理上
- 支持程序自动优化:避免特定情况下Shuffle、排序等昂贵操作,中间结果有必要进行缓存
主要特点:
- 事件驱动
- 基于流的世界观
- 分层API
- 支持多种时间语义
- Exactly Once的状态一次性保证(出现故障也能保证数据正确)
- 低延迟大吞吐量
- 高可用 动态扩展
1.3 Flink解析
Core(核心):
Filnk的核心core是Runtime(最重要的)
Deploy(Flink的部署模式)
Local模式 : 适用于本地开发和测试环境,占用资源较少
原理:主节点JobManager(Master)和从节点TaskManager(Slave)在一台机器上模拟
1、Flink程序由JobClient进行提交
2、JobClient将任务提交给JobManager
3、JobManager只负责协调分配资源和分发任务,资源分配完成后将任务提交给相应的TaskManager
4、TaskManager启动一个线程开始执行任务,TaskManager会向JobManager报告状态的变更,
例如:开始执行、正在执行、执行完成
5、作业执行完成后,结果将发送回客户端(JobClient)
Standalone Cluster模式 : 需要在集群中完成 至少需要3台主机 一个master和两个worker节点
原理:node1作为主节点JobManager(master),node1、node2、node3作为从节点TaskManager(Slave)
1、client客户端提交任务给JobManager
2、JobManager负责申请分配任务所需资源并管理任务任务和资源
3、JobManager分发任务给TaskManager执行
4、TaskManager定期向JobManager汇报状态
Standalone-HA高可用集群模式
原理:
Standalone只有一个主节点,由于主节点负责调度和分配资源,如果主节点出现意外情况(例如宕机),集群就死掉了
但是Standalone-HA高可用集群会有多个主节点,他们都会想zookeeper注册并创建一个临时节点
(一个处于active活跃(工作状态)状态,其他处于standby状态,也就是应急状态),
如果活跃状态的主机出现意外和zookeeper心跳检测超时,临时节点就会被删除,
zookeeper就会从处于standby状态的节点选一个新的主节点,删除standby的临时节点添加active的临时节点
YARN模式 : 使用YARN进行调度
原理:
1、Client上传Flink的jar包和配置文件到HDFS集群上
2、Client向Yarn的ResourceManager提交任务和申请资源
3、ResourceManager分配Container资源并启动ApplicationMaster
4、ApplicationMaster加载Flink的jar包和配置文件构建环境启动Flink-JobManager
5、ApplicationMaster向ResourceManager申请任务资源,
6、NodeManager加载Flink的jar包和配置文件构建环境并启动TaskManager
7、TaskManager启动后会向JobManager发送心跳,并等待JobManager向其分配任务
Flink On Yarn模式也存在两种模式
Session模式(适合小任务使用) 和 Per-Job模式(适合使用大任务,且资源充足)
Session模式 :(小规模,执行时间短)
- 需要先申请资源,启动JobManager和TaskManager
- 不需要每次提交任务再去申请资源,而是使用已经申请好的资源,从而提高执行效率
- 任务提交完资源不会被释放,因此一直会占用资源
- 共享Dispatcher和Resource Manager
Per-Job模式 :(执行时间较长的大作业)
- 每次提交任务都需申请资源,申请资源需要时间,所有影响执行效率(但是在大数据面前都是小事)
- 每次执行完任务资源就会立刻被释放,不会占用资源
- 独享Dispatcher和Resource Manager
API&Libraries
- DataStream API 流计算
- DataSet API 批处理
- Table 前提是
- Gelly 图计算
1.4 Filnk编程模型
编程模型:
Flink提供了不同级别的编程抽象,通过调用抽象的数据集调用算子构建DataFlow就可以实现对分布式的数据进行流式计算和离线计算,DataSet是批处理的抽象数据集,DataStream是流式计算的抽象数据集,他们的方法都分别为Source、Transformation、Sink
Source :主要负责数据的读取 添加数据源 可以是文件,网络数据流,MySQL
Transformation: 主要负责对数据的转换操作(数据转换,数据处理),比如WordCount里的处理逻辑
Sink : 负责最终计算好的结果数据输出 将处理好的结果,输出(或下沉)到目标系统,
Java在堆内存中实际上new ArrayList 实际上存储的是真正的集合
Scala或Flink在堆内存中new DataStream<Integer> 装的实际上是描述信息,是一个抽象数据集
main{
//可以对抽象数据集进行编程
//Source
val lines:DataStream = env.socketTextStream("localhost",8888)
//调用Transformation(s)
val words:DataStream = lines.flatMap(_.split(","))
//调用Sink
words.print()
}
Source 实际上并不存数据,装的是描述信息
Transformation 也不存数据, 实际上装的是计算逻辑 调用了什么方法,写了什么函数
开发者感觉像是写了一个单机程序,但是实际上生成了DataFlowGraph 会提交到集群中执行 集群中的JobManager会将DataFlowGraph进行解析,然后根据提交并行度,生成subTask(类的实例,flink最小的任务执行单元),JobManager将多个subTask 通过网络流发送给TaskManager,subTask在TaskManager中的槽中工作,进入槽中,就不出去了
1.5 Flink运行时的组件
JobManager: 作业管理器(一个)
控制一个应用程序的主进程,也就是说,每个应用程序都会被一个不同的JobManager所控制执行
JobManager会向资源管理器ResourceManager请求执行任务必要的资源,也就是任务管理器TaskManager上的插槽slot,一旦获取到足够的资源,就会将执行图分发到真正运行它们的TaskManager上.运行过程中,JobManager会负责所有需要中央协调的操作,比如检查点checkpoints的协调
TaskManager: 任务管理器(多个)
在Flink的工作进程中,通常会由多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots),插槽的数量限制了TaskManager能够执行的任务数量
启动后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager会将一个或多个插槽提供给JobManager调用,JobManager就可以向插槽分配任务tasks来执行
执行过程中,一个TaskManager可以跟其他运行同一应用程序的TaskManager交互数据(轮询)
ResourceManager: 资源管理器
主要负责管理TaskManager的插槽slot,插槽是Flink中国定义的处理资源单元
Dispacher: 分发器
当一个应用被提交执行时,分发器就会启动并将应用交给一个JobManager
可能不是必须的,取决于应用提交运行的方式