存储优化
数据存储方式
行式存储:
hdfs上一个block存储一或多行数据。
按行压缩,压缩性能受字段类型影响。
字段查询:select id,name from table_emp;
#####全表扫描,字段拼接,效率低。
全表查询:select * from table_emp;
#####直接展现数据,效率高。
列式存储:
hdfs上一个block一列或多列数据。
按列压缩,每一列相同数据类型,压缩性能好。
字段查询:select id,name from table_emp;
#####扫描部分字段,直接展现,效率高。
全表查询:select * from table_emp;
#####将分散的行重组, 效率低。
而大数据领域的全表查询情况较少,所以列式存储更加适合。
存储格式详解
- textfile
行式存储,默认的存储格式
不便于数据的解析,也不具备随机读写的能力,但它却比较通用
- sequencefile
行式存储。
每条record包含record legth、key length、key、value等四部分。
多了冗余信息,所以存储相同的数据,sequencefile比textfile略大。
但正是因为这些冗余信息,使其具备随机读写的能力。
该存储格式压缩时压缩只有value。
- rcfile
facebook开源,比标准行式存储节约10%的空间。
先水平划分按行存储的row group,row group中再按列存储数据
- ORC
优化过后的RCFile。可作用于表或者表的分区。
先在水平上划分为多个按行存储的Stripe(250MB)(每个stripes由多组行数据组成的)。Row Data中再按列存储数据。
Index Data记录的是整型数据最大值最小值、字符串数据前后缀信息,每个列的位置等等。
这就使得查询十分得高效,默认每一万行数据建立一个Index Data。
ORC存储大小为TEXTFILE的40%左右,使用压缩则可以进一步将这个数字降到10%~20%。
orc默认使用zlip的压缩格式,可以支持zlip和snappy压缩格式。
- parquet
存储大小为TEXTFILE的60%~70%,压缩后在20%到30%之间
总结:目前在开源实现中,最有名的列式存储引擎莫过于Parquet和ORC,并且他们都是Apache的顶级项目。当使用的时候,最好使用ORC和parquet存储方式,ORC优于parquet
Parquet http://parquet.apache.org | Orc http://orc.apache.org | |
---|---|---|
发展状态 | 目前都是Apache开源的顶级项目,列式存储引擎 | 同parquet |
开发语言 | java | java |
列编码 | 支持多种编码,字典,RLE,Delta等 | 支持主流编码,与Parquet类似 |
修改操作 | 不支持 | 支持 |
支持索引 | 粗粒度索引 block/group/chunk级别统计信息 | 粗粒度索引 file/stripe/row级别统计信息,不能精确到列建立索引 |
压缩比 | ORC更高 | |
ACID | 不支持 | 支持 |
后记
敬请期待后面系列文章