Hive是基于Hadoop的数仓建设工具,严格意义上不算数据库,只是将HDFS中的数据映射成为一张表,本身并不存储数据,适合对历史数据做离线批处理分析。
本文主要梳理归纳了关于Hive优化方面的知识点
1. 存储与压缩优化
一般在map输出阶段,最终输出阶段对结果进行压缩,一般采用 ORC/Parquet + snappy方式
顺便小结 ORC与Parquet的区别:
ORC为列式存储结构
- 由stripe组成,stripe相当于RowGroup(行组)的概念,每个Stripe包含 Index Data, Row Data, Stripe Footer.
- ORC是自描述的,其元数据使用了Protocol Buffer进行了序列化.
- 数据以二进制形式存储,不可直接读取
- ORC中使用了更加精确的索引信息,使得在读取数据时可以指定从任意一行开始读取
- ORC默认会对任何一块数据和索引信息使用ZLIB压缩,因此ORC文件占用的存储空间也更小
Parquet为列式存储结构
- Parquet文件是以二进制方式存储的,是不可以直接读取和修改的,Parquet文件是自解析的,文件中包括该文件的数据和元数据
- Parquet中没有Map、Array这样的复杂数据结构,但是可以通过repeated和group组合来实现的
- Parquet支持嵌套的数据模型,类似于Protocol Buffers,每一个数据模型的schema包含多个字段,每一个字段有三个属性:重复次数、数据类型和字段名
2. 使用分区表,分桶表
- 分桶表可以有效应对 大表join大表 的场景,将<k2, v2>中的key与桶数量取模,余数就是该kv所处的桶编号
- 分区表的每一个分区都对应表下的一个目录,所有的分区的数据都存储在对应的目录中
3. 参数优化
- JVM重用
- 并行执行
- Fetch模式