介绍
Hive是基于Hadoop构建的数据仓库系统,能够处理Hadoop上的结构化,非结构化数据。在Hive之前,必须编写复杂的MapReduce程序,在Hive之后,Hive能够将SQL转换为MapReduce。Hive简化了Hadoop的复杂,对Hive来说不需要学习Java,Hive以表的方式来组织数据。
历史
Hive是由Facebook开发的,在Facebook中Hive处理2PB的数据量,每天加载15TB的数据量。现在由许多公司一起协同开发,例如Amazon,IBM,Yahoo,Netflix等等。
为什么使用Hive
对于只懂SQL的用户,编写复杂的MapReduce程序非常困难,Hive简化了MapReduce的复杂性,具有以下优点:
- schema的灵活与演进
- 表可以分区
- Hive表可以直接定义在HDFS数据上
- JDBC/ODBC驱动可用
- 简化MapReduce的复杂性
- 业务分析人员能够处理大数据
- 不需要学习Java
Hive架构
- Metastore
存储每张表的元数据信息,例如表的schema,表位置,表分区信息等等,以关系型数据库存储这些信息,存储这些信息是为了跟踪HDFS上的数据 - Driver
它像是接收HQL查询的控制器,监控执行的生命周期和进度。存储在HQL查询执行中生成的必要元数据信息,也会收集Reduce操作后的查询结果。 - Compiler
编译HQL查询,转换查询到执行计划,执行计划包含MapReduce操作的步骤。转换查询到Abstract Syntax Tree(AST),首先会检查兼容,编译错误问题,然后转化AST到Directed Acyclic Graph(DAG) - Optimizer
在执行计划上进行转换来优化DAG,例如转换一系列Joins操作到一个Join操作。为了更好性能,会切割执行执行计划中的任务。 - Executor
只要编译,优化完成之后,executor执行流水式任务 - CLI,UI,Thrift Server
CLI为用户提供界面与Hive交互,Hive中的Thrift server允许用户通过网络与Hive进行交互。
Hive Shell
Hive Shell是与Hive交互的基本方式,运行Hive Shell有两种方式:
- 交互式
进入Hive Shell,直接运行查询,得到查询结果 - 非交互式
使用-f选项可以运行包含HQL查询的文件,例如,hive -f my-script.sql
Hive特性
- 提供以简单的方式进行数据汇总,查询,分析
- 支持外部表
- Hive非常适应hadoop底层的界面需求
- 支持表分区
- Hive支持基于规则优化器来优化逻辑计划
- 伸缩性,熟悉行,扩展性
- 使用HQL并需要编程语言的技能
- Hive很容易处理Hadoop上的结构化数据
- 使用Hive进行即席查询
Hive限制
- 不支持实时查询,行级修改
- 不适合online transaction processing
- Hive查询的延迟比较高