flink个人基础笔记
flink代码开发基础随记
1.常用设置
设置共享组:slotsharingGroup(“a”)
关闭合并任务链操作,每个任务独享solt:env.disableOperatorChaining()
设置并行度: env.setParallelism(1)
Flatmap用法:
FlatMap(List(1,2,3))(i=List(i,i)) = List(1,1,2,2,3,3)
List(“a”,”b”,”c d”).flatMap(line=>line.split(“ “))=List(a,b,c,d)
2.Flink算子:
简单流算子;map() ,flatmap(),Filter()
键控流算子:keyBy(),reduce()
滚动流算子:sum(),min(),max(),minBy(),maxBy()
多流转换算子:split(),select(),connect(),coMap(),union()
3.flink支持数据类型:java和scala中所有的数据类型都支持
4.Flink窗口(window):
滚动窗口(tumbling window)
滚动时间窗口:.timeWindow(time.Seconds(15))
滑动窗口(sliding window)
滑动时间窗口: .timeWindow(Time.Seconds(15),Time.Second(3))
会话窗口(session window)
会话窗口:.window(EventTimeSessionWindows.withGap(Time.minutes(10))
全局窗口(global window)
滚动计数窗口:(tmbling count window) .countWindow(5)
滑动计数窗口:(sliding count window) .countWindow(10,2)
增量聚合函数:ReduceFunction,AggregateFunctions
全窗口函数:ProcessWindowFunction
其他api
.trigger() 触发器 //定义window什么时候关闭,触发计算并输出结构
.evictor() 移除器 //定义移除某些数据的逻辑
.allowedLateness() 允许迟到的数据
.sideOutputLateData() 将迟到的数据放入侧输出流
.getSideOutput 获取侧输出流
5.时间(Time)语义
Event Time:事件创建的时间
Ingestion Time :数据进入Flink的时间
Processing Time :执行操作算子的本地系统时间,与机器相关
代码:
Env.setStreamTimeCharacteristic(TimeCharacteristic.EvenTime)
6.Flink中的状态:
6.1算子状态:(Operatiior)
列表状态(List state):将状态表示为一组数据的列表
联合列表状态(Union list state):将状态表示为数据的列表,它与常规列表状态的去表在于,再发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复
广播状态(Broadcast state):如果一个算子有多项任务,而他的每项任务状态又都相同,那么这种特殊情况最适合广播状态
6.2键控状态:(Keyed State)
值状态(Value state):将状态表示为单个的值
列表状态(List state):将状态表示为一组数据的列表
映射状态(Map state):将状态表示一组key-Value对
聚合状态(Reducing state & Aggregating State):将状态表示为一个用于聚合操作的列表
6.2.1键控状态的使用
声明一个键控状态
Lazy val lastTemp:ValueState[Double] = getRuntimeContext.getState[Double](
New ValueStateDescriptor[Double](“lastTemp”,classof[Double])
)
读取状态: val preTemp = lastTemp.v
alue()
对状态赋值:lastTemp.update(value.temperature)
6.3状态后端 :(State Backends)
7.Process Function
简单转换算子无法完成的功能,processfunction都可以完成,Flink SQL就是使用 ProcessFunction实现 的
ProcessFunction
KeyedProcessFunction
CoProcessFunction
ProcessJoinFunction
BroadcastProcessFunction
KeyedBroadcaseProcessFunction
ProcessWindowFunciton
8.状态后端:
8.1MemoryStateBackend
内存级的状态后端,会将键控状态作为内存中的对象进行管理,将Checkpoint存储在TaskManager的JVM堆上,而将JobManager的内存中
特点:快速、低延迟、但不稳定
8.2FsStateBackend
将checkpoint存到远程的持久化文件系统(FileSystem)上,而对于本地状态,跟MemoryStateBackend一样,也会存在Task Manager的JVM堆上
特点:同时拥有内存级的本地访问速度,和更好的容错保证
8.3RocksDBStateBackend
将所有状态序列化后,存入本地的RocksDB中存储。
Flink不直接提供,需要引入包flink-statebackend-rocksdb_2.12
9.容错机制:
9.1 一致性检查点(checkpoint)
Flink故障恢复机制的核心,就是应用状态的一致性检查点
有状态流应用的一致检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照)‘这个时间点,应该是所有任务都恰到好处理完一个相同的出入数据的时候
9.2 从检查点恢复状态
9.3 flink检查点算法
一种简单的想法——暂停应用,保存状态到检查点,再重新恢复应用
Flink的改进实现——基于Chandy-Lamport算法的分布式快照,将检查点的保存和数据处理分离开,不暂停整个应用
9.4 保存点
env.enableCheckpointing(1000L) //开启检查点,默认是关闭的,各个checkpoint是并行的
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.AT_LEAST_ONCE)
env.getCheckpointConfig.setCheckpointTimeout(60000L) //设置超时时间
env.getCheckpointConfig.setMaxConcurrentCheckpoints(2) //最多允许几个checkpoint
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500) //两个checkpoint之间最小间隔时间
9.5重启策略
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,10000L)) //设置重启3次,每次时间间隔为10秒
env.setRestartStrategy(RestartStrategies.failureRateRestart(3,Time.of(5,TimeUnit.MINUTES),Time.of(10,TimeUnit.SECONDS))) //最多重启3次,每次故障重启时间间隔为5分钟,尝试重启之间延迟为10秒
10.保存点
使用算法与检查点完全相同,但是flink不会自动创建保存点,因此用户(或者外部调度程序)必须明确地触发创建操作。
保存点是一个强大的功能。除了故障恢复外,保存点可以用于:有计划的手动备份,更新应用程序,版本迁移,暂停和重启应用,等等。
使用时,最好添加对应的uid
11.状态一致性
AT-MOST-ONCE (最多一次)
当任务故障时,最简单的做法是什么都不干,即不恢复丢失状态,也不重播丢失的数据,At-most-once语义的含义是最多处理一次事件
AT-LAST-ONCE(至少一次)
在大多数的真是应用场景,我们希望不丢失事件。这种类型的保障称为at-least-once,意思是所有的事件都得到了处理,而一些事情还可能被处理多次。
EXACTLY-ONCE(精确一次)
恰好处理一次最严格的保证,也是最难实现的。恰好处理一次语义不仅仅意味着没有事件丢失,还意味针对每一个数据,内部状态仅仅更新一次
一致性检查点(Checkpoints)
Flink使用了一种轻量级快照机制-检查点(checkpoint)来保证exactly=once语义
有状态流应用的一致检查点,其实就是:所有任务的状态,在某个时间点的一份拷贝(一份快照)。而这个时间点,应该是所有任务都恰号处理完一个相同的输入数据时候
端到端exactly-once
内部保证——checkpoint
source端——可重设数据的读取位置
Sink端——从故障恢复时,数据不会重复写入外部系统
幂等写入(idempotent Writes)
一个操作可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用(ex)(n)=ex
事务写入(预写日志GenericWriteAheadSink,两阶段提交TwoPhaseCommitSinkFunction )
具有原子性:一个事务中的一系列操作要么全部成功,要不一个都不做