专栏首页码字搬砖Flink key state 为何仅与 key 有关的

Flink key state 为何仅与 key 有关的

1. 依赖

前面两篇我已经讲过 Flink getRuntimeContext().getMapState的时候发生了什么?以及 Flink StateDescriptor Name的作用。 今天我们在这个的基础上一起来看一下,为什么 key state 仅仅与 key 有关,无论我取数据还是修改数据,仅仅只能取到(修改)这个key 对应的那一部分。

2. 以 RocksDBListState 为例

2.1 add、get 方法讲解

我们以 RocksDBListState 为例。分别查看 get 方法 和 add 方法 get 方法 通过源码我们可以追踪到

	byte[] key = serializeCurrentKeyWithGroupAndNamespace();
			byte[] valueBytes = backend.db.get(columnFamily, key);
			return deserializeList(valueBytes);

同理 add 方法

backend.db.merge(
				columnFamily,
				writeOptions,
				serializeCurrentKeyWithGroupAndNamespace(),
				serializeValue(value, elementSerializer)
			);

columnFamily 就不用说了,具体可以参考 Flink StateDescriptor Name的作用,主要就是 ColumnFamily Handle writeOptions rockdb 的写控制,比如说是 sync 还是 async等 serializeValue 就是把 value 序列化成 byte 数组。

2.2 关键性方法讲解

关键性的方法来了 serializeCurrentKeyWithGroupAndNamespace, 就是序列化 key key-group namespace( 当时window 的时候 就是window( 如:TimeWindow{start=1590502000000, end=1590503000000} ) 否则就是 VoidNamespace), **它的作用就是 ColumnFamily 下的 key**

跟随 serializeCurrentKeyWithGroupAndNamespace 方法

// the bytes for the serialized composite key of key-group, key, namespace
	// key-group key namespace 序列化为 rockdb 在指定 column family 下的 key,value 就是 value
	byte[] serializeCurrentKeyWithGroupAndNamespace() {
		return sharedKeyNamespaceSerializer.buildCompositeKeyNamespace(currentNamespace, namespaceSerializer);
	}

3. 结论

像 add clear update 等方法都会用到 serializeCurrentKeyWithGroupAndNamespace 这也就是为什么,key state 只会有 key 有关,因为去取值或者修改的时候需要依赖于 key。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一文搞懂 flink state key 的设置方式

    前一篇文章 一文搞懂 Flink window 元素的顺序问题 我们已经知道了,state 的获取、更新、清除等都与 key 相关。那么 key 是如何设置的呢...

    shengjk1
  • 一文搞懂 Flink Timer

    顾名思义就是 Flink 内部的定时器,与 key 和 timestamp 相关,相同的 key 和 timestamp 只有一个与之对应的 timer。tim...

    shengjk1
  • java如何指定外部的配置文件

    工作当中很多时候都希望可以把配置文件外放,这样的话就可以做到配置与业务分离,其实有很多种放式,比如xml,properties,这里就说一下如何用propert...

    shengjk1
  • 使用PHP生成以太坊钱包和密钥对

    该代码需要PHP 7.0++,OpenSSL扩展和PHP Composer。需要使用PHP Composer来安装第三方软件包。

    猿哥
  • 网银安全控件问题

    网银的密码输入控件是通过直接读键盘设备IO获取的输入。需要使用驱动级的键盘模拟输入技术才能输进去。

    周小董
  • Redis 初步接触

    Redis是一个开源的,使用ANSI C 编写,高性能的Key-Value的NoSQL数据库。

    Carlos Ouyang
  • 认识redis数据类型

    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    老雷PHP全栈开发
  • redis学习(二十一)

    这里列出了一些String常用命令,我们看一下这些String类型的这些命令可以应用到哪些场景。

    崔笑颜
  • 深入浅出 Vue 中的 key 值

    前几天我写了一篇文章,sortable.js——Vue 数据更新问题 ,当时自己只是从数据的强制刷新角度去分析,而且并没找到真正的“元凶”。

    GopalFeng
  • vue和react中循环key的作用

    没用过react开发项目,但想来跟vue在循环渲染中key的作用应该原理是一样的。循环在没有使用key的时候,vue会警告。但是这个key的作用是什么。

    wade

扫码关注云+社区

领取腾讯云代金券