Apache Kylin : Analytical Data Warehouse for Big Data
Page History
...
- 根据字典数量确定桶是否需要扩容
- 已编码的字典值对扩容后的桶进行重新分配
- 读取之前最新版本的字典数据,并分配到各个桶中
- 将新的值分配到桶中
- 前一次构建的字典值不会改变
版本控制
全局字典会通过给单词构建分配基于时间戳的版本号来进行隔离。加入版本控制的原因是构建任务可能会并发执行,而当前构建全局字典过程中的编码是不支持并发,通过版本控制,每一次编码都能够完整的读取之前构建好的全局字典,因为一个Cube的全局字典只有一份。字典在HDFS上按版本存储如下图所示。全局字典会通过给单次构建分配基于时间戳的版本号来进行隔离。加入版本控制的原因是构建任务可能会并发执行,而当前构建全局字典过程中的编码是不支持并发。通过版本控制,每一次编码都能够完整的读取之前构建好的全局字典,这样就保证了最新版本的字典拥有最完整的全局字典编码,而且一个Cube的全局字典每次被读取的时候都会选取最新版本的字典。字典最终在文件存储系统(此处为HDFS)上按版本存储如下图所示。
常见疑问
- 为什么在一个BucketDIctionary需要使用两个Map?
- 构建过程开始需要对分配到各个桶内的字典从1开始做一个相对(Relative)编码,这一部分字典相对编码值会存储在一个HashMap中,在相对字典值编码完成后,会得到每个桶的offset值,也就是桶内字典的数量,然后根据这个字典值计算出每个桶(桶是有顺序的)内字典值相对于所有桶的offset值的绝对(Absolute)编码,字典的绝对编码也会用另一个HashMap进行存储。
- 会不会存在数据倾斜问题?
现在测试下来因为热点构建不出来的概率很小,一般倾斜十亿级别才会过不去,列很多的确可能会造成这个问题,不过编码的桶数是可以无限放大的除非单key热点,否则调整参数也是很轻松完成构建。
- 为什么全局字典的数量能够超过整型最大基数(21亿)的限制?
- 因为引入了全新的BitMap数据结构Roaring64BitMap,在全局字典编码完成之后,编码会被压缩成二进制存储在Roaring64BitMap对象中,BitMap实际上是通过Long而不再是Integer进行存储的。
...
Overview
Content Tools
ThemeBuilder
Apps