16 | 从Dremel到Parquet(一):深入剖析列式存储
徐文浩
你好,我是徐文浩。
在解读 Hive 论文的过程中,我们看到 Hive 已经通过分区(Partition)和分桶(Bucket)的方式,减少了 MapReduce 程序需要扫描的数据,但是这还远远不够。
的确,MapReduce 有着非常强的伸缩性,架起一个 1000 个节点的服务器毫无压力。可 MapReduce 的缺陷也很明显,那就是它处理数据的方式太简单粗暴,直接就是把所有数据都扫描一遍。
要知道,通常来说,我们的 Hive 表也好,或者以 Thrift 序列化后存放到 HDFS 上的日志也好,采用的都是“宽表”,也就是我们会把上百个字段都直接存放在一张表里。但是实际我们在分析这些日志的时候,往往又只需要用到其中的几个字段。
比如,我们之前的日志,有超过 100 个字段,但是如果我们想要通过 IP 段和 IP 地址,查看是否有人刻意刷单刷流量的话,我们可能只需要 IP 地址等有限的 4~5 个字段。而如果这些字段在 Hive 里并不是一个分区或者分桶的话,MapReduce 程序就需要扫描所有的数据。这个比起我们实际需要访问的数据,多了数十倍。
但是,我们又不可能对太多字段进行分区和分桶,因为那样会导致文件数量呈几何级数地上升。就以上节课的例子来说,如果我们要在国家之后再加上“州”这个维度,并进行分区,那么目录的数量会增长 50 倍(以美国为例有 50 个州)。而如果我们再在时间维度上加上一个“小时”的数据维度,那么目录的数量还要再增长 24 倍。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了列式存储的技术特点和优势,重点介绍了Dremel论文中对于解决嵌套结构和可选字段问题的解决方案。传统数据处理方式的性能浪费问题得到指出,而列式存储通过按列存储数据,实现针对性读取所需字段,减少数据访问量,提高性能的优势得到详细解释。Dremel通过Repetition Level和Definition Level两个字段,巧妙地在拆分数据成列存储后,能够重新将其组装起来,100%还原原始数据。这种方式能够减少需要扫描的数据,提升数据分析效率。文章还提到Dremel在数据模型和工程上的亮点,以及对数据进行压缩的压缩率提升。整体而言,本文通过深入剖析列式存储的技术特点,为读者提供了对该领域的全面了解和学习指引。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《大数据经典论文解读》,新⼈⾸单¥59
《大数据经典论文解读》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- wd试着回答一下这个思考题:"为什么采用列存储之后,数据的压缩率也能提升呢?" 一些取值比较连续分布的数据,在使用列存储以后,可以利用 runlength encoding 类似的压缩方法大大提高压缩率。因为这些数据的值会在一个比较小的区间范围内变动,存储的时候只要存delta就行了;一个通常64-bit的数值的delta可能只需要4个bit来存。2021-10-2914
- 在路上徐老师好,在《数据密集型计算系统》第3章介绍了列式存储,当数据按列存储时,可以采用位图编码来对数据压缩。用一个数组 A 保存所有出现的值,列存储中的值用位图表示,比如某行某列的值为00001000,表示这个值对应数值 A 中下标为4的值(起始下标为0)。所有的列的值都是都是差不多的数字,放在一起可以进一步压缩。这样一来,数据的压缩率就提升了。2021-11-0215
- Steven列存储压缩率上升应该是相同数据类型的每一列都可以提高压缩率2021-10-292
- 阿橦木code: en-us country:us在数据结构中的位置都一样,为何d值一个是2一个是3呢?2021-10-2941
- Eternal一列的值相似度很高,比如姓名,长度,和名字重复率很高,二次编码可以降低很多空间2023-03-22归属地:重庆
- cpzhao我们用来分析的列存储数据,可以直接通过一个 MapReduce 程序,进行数据格式转换来生成。 这句有人能解释下吗,没明白写入的时候怎么弄,是存两份数据,用一个mapreduce异步转成列式存储?2022-12-09归属地:广东
收起评论