状态
-
flink用于保存之前计算结果的机制
-
flink会为每一个key保存一个状态
-
常用的sum(需要保存之前的计算结果) window(需要保存一段时间内的数据)内部都是有状态的
-
flink也提供了几种查用的状态类
- valueState: 单值状态,为每一个key保存一个值,可以是任何类型,必须可以序列化
- mapState: kv格式的状态,为每一个key保存一个kv格式的状态
- listState: 集合状态,为每一个key保存一个集合状态,集合中可以保存多个元素
- reducingState/AggregatingState:聚合状态,为每一个key保存一个值,再定义状态时需要一个聚合函数
-
flink的状态和普通变量的区别
- 普通变量是保存再flink的内存中的,如果flink任务执行失败,变量的数据会丢失
- flink的状态是一个特殊的变量,状态中的数据会被checkpoint持久化到hdfs中, 如果任务执行失败,重启任务,可以恢复状态
-
状态后端,用于保存状态的位置
-
HashMapStateBackend:
-
将flink的状态先保存TaskManager的内存中,在触发checkpoint的时候将taskmanager中的状态再持久化到hdfs中
-
可以直接使用
env.setStateBackend(new HashMapStateBackend()):
-
RocksDS是一个本地的轻量级的数据库,数据在磁盘上
-
在启动lfink任务的时候会在每一个taskManager所在的节点启动一个rocksDB进程
-
flink的状态会先保存在rocksDb数据库中,当触发checkpoint的时候将数据库中的状态持久化到hdfs中
-
可以支持增量快照
-
使用rocksDb状态后端需要带入依赖
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-statebackend-rocksdb</artifactId> <version>1.15.0</version> </dependency>
8、使用方式
env.setStateBackend(new EmbeddedRocksDBStateBackend(true))
-
-
checkpoint
-
checkpoint是flink用于持久化flink状态的机制
-
flink会定时将flink计算的状态持久化到hdfs中
-
开启checkpint的方法
-
在代码中开启- 每一个代码单独开启,优先级最高
// 每 1000ms 开始一次 checkpoint env.enableCheckpointing(1000) // 高级选项: // 设置模式为精确一次 (这是默认值) env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE) // 确认 checkpoints 之间的时间会进行 500 ms env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500) // Checkpoint 必须在一分钟内完成,否则就会被抛弃 env.getCheckpointConfig.setCheckpointTimeout(60000) // 允许两个连续的 checkpoint 错误 env.getCheckpointConfig.setTolerableCheckpointFailureNumber(2) // 同一时间只允许一个 checkpoint 进行 env.getCheckpointConfig.setMaxConcurrentCheckpoints(1) // 使用 externalized checkpoints,这样 checkpoint 在作业取消后仍就会被保留 //RETAIN_ON_CANCELLATION: 当任务取消时保留checkpoint env.getCheckpointConfig.setExternalizedCheckpointCleanup( ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION) //指定状态后端 //EmbeddedRocksDBStateBackend eocksDb状态后端 env.setStateBackend(new EmbeddedRocksDBStateBackend(true)) //将状态保存到hdfs中,在触发checkpoint的时候将状态持久化到hdfs中 env.getCheckpointConfig.setCheckpointStorage("hdfs://master:9000/flink/checkpoint")
-
在flink的集群的配置文件中同意开启-- flink新版才有
vim flink-conf.yaml
execution.checkpointing.interval: 3min execution.checkpointing.externalized-checkpoint-retention: RETAIN_ON_CANCELLATION execution.checkpointing.max-concurrent-checkpoints: 1 execution.checkpointing.min-pause: 0 execution.checkpointing.mode: EXACTLY_ONCE execution.checkpointing.timeout: 10min execution.checkpointing.tolerable-failed-checkpoints: 0 state.backend: rocksdb state.checkpoints.dir: hdfs://master:9000/flink/checkpoint
-
-
从checkpoint恢复任务
-
可以在网页中指定checkpint的路径恢复,路径需要带上前缀hdfs://master:9000
hdfs://master:9000/flink/checkpoint/11edbec21742ceddebbb90f3e49f24b4/chk-35
-
也可以在命令行中重新提交任务,指定恢复任务的位置, 需要先上传jarr包
# -s 恢复任务的位置 flink run -t yarn-session -Dyarn.application.id=application_1658546198162_0005 -c com.shujia.flink.core.Demo15RocksDB -s hdfs://master:9000/flink/checkpoint/11edbec21742ceddebbb90f3e49f24b4/chk-35 flink-1.0.jar
-
###以下是一些官网地址:
1,了解有状态的API:
https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/dev/datastream/fault-tolerance/state/
2,状态后端
https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/ops/state/state_backends/
3,有状态流处理
https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/concepts/stateful-stream-processing/
4,及时流处理
https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/concepts/time/