Hive简介
Hive是基于Hadoop的数据仓库软件,可以查询和管理PB级别的分布式数据。Hive 是一种数据仓库处理工具,使用类SQL的HiveQL语言实现数据查询功能,所有Hive的数据都存储在HDFS中。
Hive特性
- 灵活方便的ETL(extract/transform/load)。
- 支持MapReduce,Tez,Spark等多种计算引擎。
- 可直接访问HDFS文件以及HBase。
- 易用易编程。
Hive 的设计特点
- 支持索引,加快数据查询。
- 不同的存储类型,例如,纯文本文件、HBase 中的文件。
- 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
- 内置大量用户函数UDF 来操作时间、字符串和其它的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作。
- 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行。
- Hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。
- Hive 并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。
- Hive 查询操作过程严格遵守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。
- Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
Hive的优点
- HiveServer采用集群模式
- 双MetaStore
- 超时重试机制
- 类似SQL语法
- 内置大量函数
- 自定义存储格式
- 自定义函数
- 多接口
Beeline\JDBC\Thrift\Python\ODBC - HiveServer Hive对外提供SQL服务的主要进程。
- MetaStore Hive提供元数据信息的进程,可供HiveServer,SparkSQL,Oozie等组件调用。
Hive缺点
- 延迟较高
默认MR为执行引擎,MR延迟较高。 - 不支持物化视图
- Hive支持普通视图,不支持物化视图。
- Hive不能在视图上更新、插入、删除数据。
- 不适用OLTP
暂不支持列级别的数据添加、更新、删除操作。 - 暂不支持存储过程
当前版本不支持存储过程,只能通过UDF来实现一些逻辑处理。
Hive的架构

- MetaStore : 存储表、列和Partition等元数据。
- Driver : 管理HiveQL执行的生命周期,并贯穿Hive任务整个执行期间。
- Compiler : 编译HiveQL并将其转化为一系列相互依赖的Map/Reduce任务。
- Optimizer : 优化器,分为逻辑优化器和物理优化器,分别对HiveQL生成的执行计划和MapReduce任务进行优化。
- Executor : 按照任务的依赖关系分别执行Map/Reduce任务。
- ThriftServer : 提供thrift接口,作为JDBC和ODBC的服务端,并Hive和其他应用程序集成起来。
- Clients : 包含命令行接口(CLI/Beeline) 和JDBC/ODBC 接口,为用户访问提供接口。
Hive数据存储模型

- 数据库:创建表时如果不指定数据库,则默认为default数据库。
- 表:物理概念,实际对应HDFS上的一个目录。
- 分区:对应所在表所在目录下的一个子目录。
- 桶:对应表或分区所在路径的一个文件。
- 倾斜数据:数据集中于个别字段值的场景,比如按照城市分区时80%的数据都来自某个大城市。
- 正常数据:不存在倾斜的数据。
分区和桶
- 每个分区是一个目录。
- 分区数量不固定。
- 分区下可再有分区或者桶。
- 桶:数据可以根据桶的方式将不同数据放入不同的桶中。
- 每个桶是一个文件。
- 建表时指定桶个数,桶内可排序。
- 数据按照某个字段的值Hash后放入某个桶中。
- 一个桶对应一个文件,一个分区对应一个文件夹。表先确定桶数,确定需要分桶的列,将数据中对应的列值先hash取值,后与桶数取模,将数据存放到对应的桶中。
- 对于每一个表或者是分区,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。
- Hive是针对某一列进行分桶。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶中。分桶的好处是可以获得更高的查询处理效率。使取样更高效。
- 分桶的应用场景:
- 数据抽样
- 提升某些查询操作效率,如:mapside join 。
- 当表格数据量较大时,可对表格进行分区处理(Partition),便于局部数据的查询操作,如按时间分区、按地域分区等,将具有相同性质的数据存储到同一磁盘块上,从而加快查询效率。
托管表和外部表
- Hive可以创建托管表和外部表。
- 默认创建托管表,Hive会将数据移动到数据仓库目录。
- 创建外部表,这时Hive会到仓库目录以外的位置访问数据。
- 如果所有处理都由Hive完成,建议使用托管表。
- 如果要用Hive和其它工具来处理同一个数据集,建议使用外部表。
- Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。
- 在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
/ | 托管表 | 外部表 |
---|
CREATE/LOAD | 数据移到仓库目录 | 数据位置不移动 |
DROP | 元数据和数据会被一起删除 | 只删除元数据 |
Hive与传统数据仓库比较
/ | Hive | 传统数据仓库 |
---|
存储 | HDFS,理论上有无限拓展的可能。 | 集群存储,存在容量上限。只能适应于数据量比较小的商业应用,对于超大规模,半结构或非结构化数据无能为力。 |
执行引擎 | 有MR/Tez/Spark多种引擎可供选择。 | 可以选择更加高效的算法来执行查询,也可以进行更多的优化措施来提高速度。 |
使用方式 | HQL(类似SQL)。 | SQL。 |
灵活性 | 元数据存储独立于数据存储之外,从而解耦合元数据和数据。 | 低,数据用途单一。 |
分析速度 | 计算依赖于集群规模,易拓展,在大数据量情况下,远远快于普通数据仓库,但复杂的关联交叉运算其速度很慢,宽表用HIVE做比较低效。 | 复杂查询性能高于Hive,简单大规模(百TB级数据)查询性能较Hive弱。 |
索引 | 低效,目前还不完善。 | 高效。 |
易用性 | 需要自行开发应用模型,灵活度较高,但是易用性较低。 | 集成一整套成熟的的报表解决方案,可以较为方便的进行数据的分析。 |
可靠性 | 数据存储在HDFS,可靠性高,容错性高。 | 可靠性较低,一次查询失败需要重新开始。数据容错大部分依赖于硬件Raid,软件角度不同产品差异较大。 |
依赖环境 | 依赖硬件较低,可适应一般的普通机器。 | 依赖于高性能的商业服务器,对X86服务器的配置统一性要求较高。 |
价格 | 开源产品。 | 商用比较昂贵。 |