Flink
Apache Flink是一个计算框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务
DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。
DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。
Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。
Table API和SQL通过join API集成在一起,这个join API的核心概念是Table,Table可以作为查询的输入和输出。
JobManager
Master进程,负责Job的管理和资源的协调。包括任务调度,检查点管理,失败恢复等。
对于集群HA模式,可以同时多个master进程,其中一个作为leader,其他作为standby。当leader失败时,会选出一个standby的master作为新的leader(通过zookeeper实现leader选举)。
Flink内部使用Akka模型作为JobManager和TaskManager之间的通信机制。
Flink On Yarn
图示:
- 在yarn启动ApplicationMaster的时启动ResourceManager分配节点给Flink的JobMaster
- JobMaster将Jobmanger和TaskManager的信息提交到ResourceManager,申请容器资源,通过ResourceManager返回的容器资源对Flink集群进行初始化
- 集群初始化后,有JobMaster统一调度Jobmanger
Flink Client的相关操作
一、创建任务
核心方法
/**
*Pipeline:YarnClient的通道,用来对Hadoop集群进行操作
*Configuration:Flink的相关配置,初始化Flink的
*
*/
AbstractJobClusterExecutor.execute(@Nonnull Pipeline pipeline, @Nonnull Configuration configuration)
二、暂停任务
暂停任务两个方法
- RestClusterClient.stopWithSavepoint
这个方法是有问题的,经过测试发现,Flink的任务只存在运行和结束状态,并不会存在停止,所以,在反复调用这个方法的时候,只会生成快照,但不会返回路径,因为要等待Flink任务执行完成之后请求才会返回路径,否则请求一直等待
/**
*这个方法是用来暂停Flink任务并生成快照的
*jobId:Flink的Job唯一标识
*advanceToEndOfTime:是否提前结束任务
*savepointDirectory:快照保存点路径
*/
public CompletableFuture<String> stopWithSavepoint(JobID jobId, boolean advanceToEndOfTime, @Nullable String savepointDirectory)
- RestClusterClient.cancelWithSavepoint
如果根据需求和Flink的状态,系统的暂停任务应当是调用此方法,结束Flink任务,生成快照,并返回快照的绝对路径
/**
*这个方法是用来取消Flink任务并生成快照的
*jobId:Flink的Job唯一标识
*savepointDirectory:快照保存点路径
*/
public CompletableFuture<String> cancelWithSavepoint(JobID jobId, @Nullable String savepointDirectory)
三、取消任务
由于Flink集群是Flink-ON-Yarn的模式,所以取消任务也可以有两种用法
1.通过JobManger进行任务取消
RestClusterClient.cancel
/**
*jobId:Flink的Job唯一标识
*
*/
public CompletableFuture<Acknowledge> cancel(JobID jobID)
2.通过ResourceManager直接杀掉集群
YarnClient.killApplication
/**
*var1:表示ApplicationMater的唯一标识
*
*/
public abstract void killApplication(ApplicationId var1)
Flink任务提交方式
一、yarn seesion
需要先启动集群,然后在提交作业,接着会向yarn申请一块空间后,资源永远保持不变。如果资源满了,下一个作业就无法提交,只能等到yarn中的其中一个作业执行完成后,释放了资源,那下一个作业才会正常提交.
如图:
二、Flink run
一个任务会对应一个job,即没提交一个作业会根据自身的情况,向yarn申请资源,直到作业执行完成,并不会影响下一个作业的正常运行,除非是yarn上面没有任何资源的情况下。
如图:
Flink source和sink
flink中的source作为整个stream中的入口,而sink作为整个stream的终点
SourceFunction为所有flink中source的根接口,其定义了run()方法和cancel()方法。
在SourceFunction中的run()方法用以作为source向整个stream发出数据,并用以控制数据的进入。
Flink的两层API
DataStream API
DataStream是Flink的第二层Api,Table API转换成DataStream
DataStream支持两种Sink输出方式
- AppendStream
- RetractStream
Table API
Table是Flink的最顶层API,Table对象由TableEnvironment生成,TableEnvironment包括:
- BatchTableEnvironment 批处理Table
- StreamTableEnvironment 流处理Table
等等
Table支持
- AppendStream
- RetractStream
- UpsertStream(需要通过group by实现)
三种Stream对应的Sink
- AppendStreamTableSink
- 可将动态表转换为Append流。适用于动态表只有Insert的场景
- RetractStreamTableSink
- 可将动态表转换为Retract流。适用于动态表有Insert、Delete、Update的场景
- UpsertStreamTableSink
- 可将动态表转换为Append流可将动态表转换为Upsert流。适用于动态表有Insert、Delete、Update的场景
RetractStreamTableSink中: Insert被编码成一条Add消息; Delete被编码成一条Retract消息;Update被编码成两条消息(先是一条Retract消息,再是一条Add消息),即先删除再增加。
UpsertStreamTableSink: Insert和Update均被编码成一条消息(Upsert消息); Delete被编码成一条Delete消息。
UpsertStreamTableSink和RetractStreamTableSink最大的不同在于Update编码成一条消息,效率上比RetractStreamTableSink高。
TableEnvironment创建Table的基本操作
TableEnvironment.fromCollection通过集合创建表,作为Flink入口
/**
*data:数据内容
*typeInfo:数据列项
*/
public <OUT> DataStreamSource<OUT> fromCollection(Collection<OUT> data, TypeInformation<OUT> typeInfo)
Table的基本操作
TableEnvironment.createTemporaryView将数据创建成视图
/**
*var1:视图名称
*var2:table数据内容
*/
void createTemporaryView(String var1, Table var2);
TableEnvironment.registerFunction 注册Flink函数
/**
*var1:函数名称
*var2:函数定义
*/
<T> void registerFunction(String var1, TableFunction<T> var2)