Hive 技术框架剖析
1.1 数据存储
① 行存储
基于 Hadoop 系统行存储结构的优点在于快速数据加载和动态负载的高适应能力,但是行存储不支持快速查询,当查询仅仅针对多列表中的少数几列时,它不能跳过不必要的列读取。同时,由于行存储混合着不同数据值的列,行存储不容易获得一个极高的压缩比,即空间利用率不易大幅提高,尽管通过熵编码和利用列相关性能够获得一个较好的压缩比,但是复杂数据存储实现会导致解压开销增大。
② 列存储
列存储在查询时列存储能够避免读不必要的列,并且压缩一个列中的相似数据能够达到较高的压缩比。
③ 存储方式的选择
在数据仓库的搭建中,我们选择列存储方式。
对于列式存储范式,有三种存储格式可以选择:rcfile,Orc,Parquet。
若论对 Hive(以 MapReduce 为执行引擎)的支持 Orc 是最好的,但是若论对 Spark 等 Hadoop 生态圈中更多的技术框架,Parquet 的支持是最好的,而 Spark 作为 Hive 的执行引擎时性能非常好,因以我们这里毫无疑问地选择了 Parquet。
1.2 数据压缩
Hive 中可用的压缩格式如下表所示:
压缩格式 | 工具 | 算法 | 文件拓展名 | 是否可切分 |
DEFAULT | 无 | DEFAULT | .delate | 否 |
gzip | gzip | DEFAULT | .gz | 否 |
bzip2 | bzip2 | bzip2 | .bz2 | 是 |
LZO | lzop | LZO | .lzo | 是 |
Snappy | 无 | Snappy | .nappy | 否 |
由于我们的存储格选用了 Parquet,在压缩格式方面 Parquet 支持 Snappy 和 Gzip,Gzip
的压缩比更高但解压缩的速度较慢,我们选择 Snappy。
1.3 执行引擎
- Hive 的执行引擎包括 MapReduce、Spark 和 Tez。
- 就性能而言,MapReduce 性能最差, Tez 与 spark 接近,但论社区的活跃程度和技术的成熟度来说 Tez 是不如 Spark的,因此我们选择 spark。
- Spark 目前也有两大分支,即 SparkCore(RDD)和 SparkSQL(DataFrame/DataSet),
对于这两个分支性能上也有很大差异的。 - 经过测试,SparkCore 的性能是 MapReduce 的两倍左右,而 SparkSQL 的性能是 SparkCore
的两倍左右,数据量越大,上述的性能差异会越明显,因此 Hive 数据仓库的执行引擎确定为 SparkSQL。