`

大数据即时计算产品的一般原理----列式存储

阅读更多

一、什么是列式存储

讲列存储之前必须得先讲下行存储,因为行存储是大数据技术流行之前最为常见的一种数据存储方式,传统的关系数据库如Oracle、DB2、Mysql等都是将数据以行记录为单位进行组织,所以数据读写操作需要遍历行记录中所有的列,在存储机制上,行存储将行记录中各列的数据值串在一起进行存储,并且先存完第一行再存第二行,例如:1,Smith,Joe,40000;2,Jones,Mary,50000;3,Johnson,Cathy,44000;而列存储是一种区别于传统行存储的新型读写模式,列存储以列数据集合为单位进行存储,是把一列中的数据值串在一起进行存储,先存完第一列,再存第二列,例如:1,2,3;Smith,Jones,Johnson;Joe,Mary,Cathy;40000,50000,44000;下图便非常直观地展示行存储和列存储的区别。

 

 

 二、列式存储的优点

了解完行存储和列存储的定义和机制,我们再来剖析下行存储和列存储到底有哪些不同?列存储相比行存储的优势是什么?

我们分别从这两方面来讲下行存储和列存储的区别。首先从写方面来看,行存储的写入是一次完成,也就是说行存储各字段写入是在一次IO中完成,而列存储由于需要把一行记录拆分成单列保存,写入次数明显比行存储多,也就是说要多次IO才能完成,而字段越多,IO次数越多,所以在写入上行存储具有明显的优势。再从读方面来看,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的,而列存储读取则只需要读取关心的几个列数据,明显减少了读取的数据量,如果行记录字段越多性能优势就越明显。另外由于列存储的每一列数据类型是同质的,不存在二义性问题,比如说某列数据类型为整型(int),那么它的数据集合一定是整型数据。这种情况使数据解析变得十分容易,而且因为存储单元的数据结构一致,可以很容易利用差值编码等压缩方法来进行压缩存储而且压缩比可以非常高,另外针对列数据只有形如:【男和女】两种数据值类型的列更可以获得非常高的压缩比,进而可利用位图索引很快统计出男女的个数。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据存储不容易压缩,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间。另外列存储相对行存储更为灵活,逻辑上一行数据可以按列将数据存放到不同的地方,也可以是不同机器上,这样可以在执行查询分析任务时可以按机器节点并行进行查询计算,而行存储不容易进行并行查询,需要一定中间件的支持。

通过读写两方面比较,我们可以提炼列存储的优点:

  • 每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量。
  • 既然是一个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩/解压算法。
  • 易于并行查询,当表行数过多时,可将列数据分段存储,每列可以起不同的计算单元单独处理。

 

三、为什么列存储很适合大数据即时计算分析?

上段已经提炼了列存储的优点,那么结合行存储和列存储的优缺点分析,我们可以展开想想行存储和列存储适合的场景:

1、列存储,不适合数据频繁写入、更新的场景,主要适合频繁查询的场景,大数据环境下优势更明显,比如分布式实时查询。

2、行存储,适合数据存储写入、更新较多的场景,比如OLTP。当数据量很大时,查询性能远不及列存储。

由于大数据OLAP本身是聚焦于对于大数据进行多维分析,而数据写入的频次要求也不高,所以列存储非常适合来做大数据OLAP,尤其是列存储具有极高的压缩率,不但节省了存储空间也节省计算内存和CPU非常适合做聚合计算。之前我们使用HIGO来做大数据OLAP也是充分利用了lucene倒排索引文件(.fdt和.fdx文件)是天生按列存储的特性,如果重复值特别多,倒排索引可以减少很多IO,因为lucene本身在存储上可以做很多的压缩处理,另外lucene本身也对长文本做了转码处理,比如一段很长的文本可以将真实值转成一段很小的int型数字代号这就在做计算统计时(比如group by)节省了很多的IO,另外因为lucene倒排索引文件可以分布式地存放在不同机器上,所以可充分利用多台机器并行计算的特点最后归并获取数据结果,可以说HIGO也是充分利用了列存储的特性达到了秒级在亿级数据量获取统计分析数据的能力。而Garuda也是类似,Garuda利用列存储文件可以很方便压缩的特性,数据文件在内存和磁盘上压缩分别达到了38%和6%,同样在做统计时也是扫描了只需统计的列,在访问上数据文件上也是做到顺序访问,所以极大程度在统计计算时节省了很多的IO,同时也利用列式存储易于并行查询的特性,将统计计算放在了多个计算单元节点上同时进行,在即席分析上发挥了巨大的作用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics