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 )

具有原子性:一个事务中的一系列操作要么全部成功,要不一个都不做

author@nohert
原文地址:https://www.cnblogs.com/gzgBlog/p/14928141.html