Hive分桶表
将一个大文件分成n多小文件。本质和MapReduce的分区类似,都是在分文件。
Hive表的数据压缩
优点
- 提高计算效率
- 提高磁盘利用率
压缩算法的选择
- 压缩比:压缩比越高,压缩后文件越小,所以压缩比越高越好
- 压缩时间:越快越好
- 已压缩的格式文件是否可以再分割:可以分割的格式允许单一文件由多个Mapper程序处理,可以更好的并行化
常见压缩方式
压缩方式 | 压缩比 | 压缩速度 | 解压缩速度 | 是否可分割 | Hadoop对应的编码/解码器 |
---|---|---|---|---|---|
gzip | 13.4% | 21 MB/s | 118 MB/s | 否 | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | 13.2% | 2.4MB/s | 9.5MB/s | 是 | org.apache.hadoop.io.compress.BZip2Codec |
lzo | 20.5% | 135 MB/s | 410 MB/s | 否 | com.hadoop.compress.lzo.LzopCodec |
snappy | 22.2% | 172 MB/s | 409 MB/s | 否 | org.apache.hadoop.io.compress.SnappyCodec |
以上表中数据为参考 |
- lzo需要创建索引,才可以支持分割。
- 常用压缩方式为lzo和snappy。因为尽管gzip和bzip2拥有极高的压缩比,但是其压缩与解压缩的速度并不理想,从而影响计算效率。
Hive表的文件存储
行式存储 VS 列式存储
行式存储
- 顾名思义,根据表中数据,一行一行的进行存储。如果有空的field,需要占位
- 格式:TEXTFILE、SEQUENCEFILE
- 特点:适用于查找一整行数据
列式存储
- 顾名思义,根据表中数据,一列一列的进行存储。如果有空的field,不需要占位
- 格式:ORC、PARQUET
- 特点:适用于查找单个field值。由于每个field数据类型相同,便于设计压缩算法
- 更适合大数据中的存储
TEXTFILE格式
- 默认数据格式
- 由于数据不做压缩,磁盘开销大,数据解析开销大
- 可使用gzip、bzip2进行压缩
ORC格式
- Optimized Row Columnar
- Stripe
- Index Data:列的索引信息
- Row Data:列索引对应的数据信息(真正的数据存储)
- Stripe Footer:描述stripe的元数据信息
- File Footer:每个文件有一个File Footer,用来记录每个Stripe的行数,每个Column的数据类型等。
- PostScript:位于每个文件的最后,File Footer的后面。里面记录了File Footer的长度信息,整个文件的压缩类型等。
- 读取ORC格式文件的时候,首先找到尾部的PostScript,解析File Footer的信息。再从File Footer中解析各个Stripe的信息。最后读各个Stripe的信息。
PARQUET格式
- Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,在Impala中经常会用到的存储格式。
- 以二进制方式存储,所以不可以直接读取。文件中包括其数据和元数据,所以可以自解析。
- 通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。Parquet文件的格式如下图所示。