Flink MapState使用小记

举报
Lettle whale 发表于 2022/01/27 16:37:54 2022/01/27
【摘要】 MapState 会存储 key、namespace、userKey、userValue,缩写为 <K, N, UK, UV>

  近日在使用Flink做多流关联时需要用到MapState缓存一下数据,踩了点坑,现在记录一下。

  一个小伙伴跟我说,他在调试对流进行keyby后的处理方法,他将当前一条数据Put到MapState中,在下一数据到来后尝试去MapState中去取前一条记录,但始终无法得到值,取出来都是null,于是找到我,让我协助查看一下,发现他犯了一个简单的错误,没有搞清楚MapState的数据结构,把它当做了普通的Map在使用。而MapState是一种基于key分区的状态

  先来看看MapState里都存储了什么

MapState 会存储 key、namespace、userKey、userValue,缩写为 <K, N, UK, UV>。

  1. key
    MapState 是 KeyedState,也就是 keyBy 后才能使用。加入keyby会根据ID01,ID02这些值,那么key就是这些值
  2. namespace
    Namespace 用于区分窗口。假如keyby id还加上了一个时间窗口,那么需要namespace来标识是哪个时间段的窗口,如5-6点
  3. 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。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。