flink MemoryStateBackend 和 RocksDBStateBackend 切换导致任务出现bug

发布于:2023-09-16 ⋅ 阅读:(96) ⋅ 点赞:(0)

这两个stateBackend有什么区别

速度和大小的区别

RocksDBStateBackend 会多出序列化,反序列化  所以性能更差,但是他可以支撑很大的状态.

和任务代码相关,可能导致bug

  测试不同状态后端(注意开启checkpoint),使用 map_dp.get(key).append(value) 的效果是否相同
  其中 value是listbuffer类型
  内存/文件 状态后端: 符合预期
  rocksDB 状态后端: 数组元素无法添加进去
  解决方案:
    修改为 map_dp.put("k",map_dp.get("k") :+ in._2) 即可

测试代码:

package com.yy.checkpointTest.state

import org.apache.flink.api.common.functions.RichMapFunction
import org.apache.flink.api.common.state.{MapState, MapStateDescriptor}
import org.apache.flink.api.common.typeinfo.{TypeHint, TypeInformation}
import org.apache.flink.configuration.{Configuration, RestOptions}
import org.apache.flink.contrib.streaming.state.RocksDBStateBackend
import org.apache.flink.runtime.state.filesystem.FsStateBackend
import org.apache.flink.streaming.api.CheckpointingMode
import org.apache.flink.streaming.api.environment.CheckpointC