Flink MapState使用小记
近日在使用Flink做多流关联时需要用到MapState缓存一下数据,踩了点坑,现在记录一下。
一个小伙伴跟我说,他在调试对流进行keyby后的处理方法,他将当前一条数据Put到MapState中,在下一数据到来后尝试去MapState中去取前一条记录,但始终无法得到值,取出来都是null,于是找到我,让我协助查看一下,发现他犯了一个简单的错误,没有搞清楚MapState的数据结构,把它当做了普通的Map在使用。而MapState是一种基于key分区的状态
先来看看MapState里都存储了什么
MapState 会存储 key、namespace、userKey、userValue,缩写为 <K, N, UK, UV>。
- key
MapState 是 KeyedState,也就是 keyBy 后才能使用。加入keyby会根据ID01,ID02这些值,那么key就是这些值 - namespace
Namespace 用于区分窗口。假如keyby id还加上了一个时间窗口,那么需要namespace来标识是哪个时间段的窗口,如5-6点 - userKey,userValue
这个就类似普通Map集合中的key和value了,存储的是键值对
小伙伴遇到的问题
前面说MapState是一种基于key分区的状态,
虽然并行度为1时,只初始化了一个MapState对象,但是这个MapState在不同的key时状态是有区别的,
小伙伴在key=ID01时,使用mapState.put("shenzhen", 100), 在key=ID02时,使用mapState.get("shenzhen")时却取出Null,
假如他在这里使用的是HashMap,那么他是能取出100的,用MapState却不行,因为keyby时让MapState内多了个维度,不同的key维度存储着不同的<userKey,userValue>的键值对。
问题解决
在了解了MapState的key和namespace之后,小伙伴立即修改了代码,1.使用HashMap存储一些可以多维度共享的数据,2.使用MapState时考虑数据是否有相同的key。
- 点赞
- 收藏
- 关注作者
评论(0)