Hive基本概念
1.什么是Hive
Hive由Facebook开源,用于解决海量结构化日志的数据统计问题。Hive是Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。其本至就是将HQL转化成MapReduce程序。
- Hive处理的数据存储在HDFS中
- Hive分析数据底层的默认实现是MapReduce
- 执行程序在Yarn上
2.Hive的优缺点
-
优点
- 操作接口采用类SQL语法,简单易上手,提供快速开发的能力。
- 避免了写MapReduce,减少开发成本
- Hive执行延迟较高,使用于大数据的数据分析场景
-
缺点
- Hive的HQL表达能力有限,迭代式算法无法表达,数据挖掘不擅长。
- Hive自动生成的MapReduce作业通常不够智能,调优比较困难,因此Hive效率会比较低
3.Hive的架构
-
用户接口:Client
CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive) -
元数据:MetaStoreS
元数据包括:表名、表所属数据库、表得拥有者、列/分区字段、表的类型、表得数据所在目录等; -
Hadoop
使用HDFS进行存储,使用MapReduce进行计算。 -
驱动器:Driver
- 解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,一般由第三方工具库完成,如antlr;对AST进行语法分析,如表是否存在、SQL语义是否有误等。
- 编译器(Physical Plan):将AST编译生成逻辑执行计划。
- 优化器(Query Optimizer):对逻辑执行计划进行优化。
- 执行器(Execution):把逻辑执行计划转化成可运行的物理计划,对于Hive来说,就是MR/Spark。
-
运行机制
Hive通过用户提供的一系列交互接口,接收用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,再返回结果。
4.Hive与数据库的对比
-
设计理念
由于Hive采用了类似SQL的查询语言HQL(Hive Query Language),很容易将Hive理解成数据库。但实际从结构上来说,两者除了类似的查询语言,就再无类似之处了。数据库可以用在在线的应用中,而Hive是为数据仓库而设计的。 -
数据更新
Hive主要是针对数据仓库应用设计的,数据仓库的内容通常是读多写少的,因此,Hive不建议对数据进行改写。而数据库中通常需要对数据进行修改。 -
索引
Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此没有对数据中的某些key建立索引。Hive需要访问数据中满足条件的特定值时,需要暴力扫描所有的数据,故其访问延迟较高。由于MapReduce的引入,Hive可以并行访问数据,因此即时没有索引,对于大数据量的访问,Hive仍然可以体现出优势。而在数据库中,通常会对一些列建立索引,因此对少量特定条件数据的访问,数据库具有很高的效率与较低的延迟。 -
执行
Hive中,大多数的查询都是通过Hadoop中的MapReduce来实现的。而数据库通常有自己的引擎。