从上图中可以看到hive的架构组成,一般的DBMS主要分为存储和查询,而hive是做了查询,存储依赖于hdfs,hive的存储可以细分为meta data和real data,meta data存储表结构信息,存放在mysql中,real data表示真实的数据,存放在hdfs中,可以在hive的warehouse目录看到具体的数据库和表名。hive有自己查询语言hive QL,它是一种sql-like语言,hive自己会将hive查询解析成任务给执行引擎去做计算,具体支持的执行引擎包含mapReduce、tez、spark。对于这三种引擎来说,mapreduce是hadoop的核心组件,它是默认的执行引擎,虽然没有后面两种内存计算引擎快,主要在于稳定,它会将任务分为多个map reduce任务,每组map reduce任务的中间存储都会写入hdfs,所以会有频繁的IO读写,tez和spark都会生成一个DAG,在内存执行任务,会有因为内存不够导致任务失败的风险。
对比mapreduce和tez的任务,首先是一句hive QL语句fig.9,然后是一个对查询进行任务解析成计算引擎mapreduce执行任务的图fig.10,和解析成计算引擎tez执行任务的图fig.11:
可以看到两个引擎主要的区别,在于中间结果是否写入hdfs。
对于hive的性能调优还存在于hive存储格式的选择,有四种格式TEXTFILE, SEQUENCEFILE, ORC and RCFILE,ORC格式性能最好,还有调优在于数据是否在建表的时候选择了分区字段,因为分区字段的选择决定了存储,假如我们按照某个字段propertytype分区,存储将变为如下格式
这样在查询时就不用对全量的数据进行查询,只用取需要的文件。
题外话
对于spark 和 tez的对比,暂时没有调研。
spark on hive 和 hive on spark是两个概念,前者是以hive作为存储,spark sql自己解析QL,然后使用自己的执行引擎,而后者是使用hive自己QL解析引擎,执行引擎切换为spark,对比开发而言前者需要自己写spark sql应用,后者则需要自己编译跟安装的hive匹配的spark源码,生成jar包给hive使用,再将hive.execution.engine修改就可以直接写hive QL就可以。
参考文献
Large-scale data modeling in Hive and distributed query processing using Mapreduce and Tez.pdf