大数据列式存储
背景
随着大数据 Hadoop/Spark 生态的不断发展和成熟,TextFile、CSV这些文本格式存储效率低,查询速度慢,往往不能很好地满足大数据系统中存储和查询的需求,列式存储也在大数据社区逐渐兴起到成熟。目前,使用比较广泛的列式存储主要是 Apache Parquet 和 Apache ORC,Parquet 由谷歌的 Dremel 发展而来,由Twitter 贡献给社区,ORC 则是由 Hive 的 RC File 发展而来,从Hive项目中独立出来,二者目前都是比较活跃的列式存储项目。
什么是列式存储
传统的数据编码方式是以行为单位进行,列式存储则是将数据划分成数据块,每个数据块内部按列的方式进行编码存储,通过使用列式存储会有以下好处:
- 存储效率更高,因为同一列的数据类型一致,编码效率也会更高
- 查询效率更高,利用列式存储的统计信息,可以跳过大量的数据,减少IO压力
Parquet 和 ORC的基本对比
Parquet 和 ORC的编码效率对比
什么是编码
列式存储在存储数据时,为了提高压缩效率,会进行一些编码操作,如图所示。
常见的编码方式
- Run-length encoding(RLE)
- Dictionary
- Bitpacking
- Zigzag for signed
Parquet 和 ORC编码对比
使用TPC数据集的测试结果
分别使用相同的 TPC 数据集进行测试,从压缩效率上讲,数据库大小越小,压缩效率越好。这里 ORC 使用 Zlib 压缩, Parquet 使用 Gzip 压缩。
- TPC-BB and TPC-DS Decimal 版本下,ORC 比 Parquet 占用空间节省大约 10%;
- TPC-DS Double版本下,Parquet 的使用的空间节省 2% 左右。
TPC-DS(Decimal Version): https://github.com/cloudera/impala-tpcds-kit
TPC-DS(Double Version): https://github.com/hortonworks/hive-testbench
TPCx-BB: http://www.tpc.org/tpcx-bb/