hive
1.1 hive简介
1.1.1 什么是hive?
hive是一个构建在Hadoop上的数据仓库工具(框架),可以将结构化的数据文件映射成一张数据表,并可以使用类似sql的方式来对这样的数据文件进行读、写以及管理(包括元数据)。Hive SQL 简称HQL。hive的执行引擎可以是MR、Spark、tez。
如果执行引擎是MapReduce的话,hive会将Hql翻译成MR进行数据的计算。 用户可以使用命令行工具或JDBC驱动程序来连接到hive。
1.1.2 为什么使用hive
因为直接使用Map Reduce,需要面临一下问题:
- 人员学习成本高
- 项目周期要求太短
- Map Reduce实现复杂查询逻辑开发难度大
1.1.3 hive的优缺点
1.1.3.1 hive的优点
- 学习成本低
- 可扩展性好
- 适合做离线分析处理(OLAP)
- 延展性好
- 良好的容错性
- 统计管理
1.1.3.2 hive的缺点
- hive的HQL表达能力有限
- hive的效率比价低
1.2 hive架构和原理
1.2.1 hive的架构
- 用户连接接口
CLI:是指Shell命令行
JDBC/ODBC:是指hive的Java实现,与传统数据库JDBC类似。
WebUI:是指可通过浏览器访问hive。 - thriftserver:
hive的可选组件,此组件是一个软件框架服务,允许客户端使用包括Java、c++、Ruby和其他多种语言,通过编程的方式远程访问hive。
- 元数据
hive将元数据存储在数据库中,如MySQL、derby。hive中的元数据包括(表名、表所属的数据库名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等)
- 驱动器(Driver)
- 解析器(SQLParser):
将HQL字符串转换成抽象的语法树AST,这一步一般都用第三方工具库完成,比如antlr:对AST进行语法分析,比如表是否存在、SQL语义是否有误。
- 编译器(Compiler):
对HQL语句进行词法、语法、语义的编译(需要跟元数据关联),编译完成后会生成一个执行计划。hive上就是编译成mapreduce的job。
- 优化器(Optimizer):
将执行计划进行优化,减少不必要的列、使用分区、使用索引等。优化job。
- 执行器(Executer):
将优化后的执行计划提交给Hadoop的yarn上执行。提交job。
- hadoop
Jobtracker是hadoop1.x中的组件,它的功能相当于:Resourcemanager+AppMaster
TaskTracker相当于Nodemanager + yarnchild
Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成
注意:
- 包含*的全表查询,比如select * from table 不会生成MapRedcue任务
- 包含*的limit查询,比如select * from table limit 3 不会生成MapRedcue任务
1.2.2 hive的工作原理
- 用户提交查询等任务给Driver。
- 驱动程序将Hql发送编译器,检查语法和生成查询计划。
- 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
- 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。
- 将最终的计划提交给Driver。到此为止,查询解析和编译完成。
- Driver将计划Plan转交给ExecutionEngine去执行。
- 在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。
7.1 与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。 - 执行引擎接收来自数据节点的结果。
- 执行引擎发送这些结果值给驱动程序。
- 驱动程序将结果发送给Hive接口。
1.2.3 hive和Hadoop的关系
- hive本身其实没有多少功能,hive就相当于在Hadoop上面包了一个壳子,就是对Hadoop进行了一次封装。
- hive的存储是基于hdfs/hbase的,hive的计算是基于mapreduce。
1.3 hive与传统型数据库的区别
- Hive采用了类SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。
- 数据库可以用在OLTP的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。
- Hive不适合用于联机事务处理(OLTP),也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的SQL语句首先提交到DRIVER驱动,然后调COMPILER解释驱动,最终解释成MapReduce 任务执行,最后将结果返回。
- MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。
1.3.1 hive和MySQL的比较
- mysql用自己的存储存储引擎,hive使用的hdfs来存储。
- mysql使用自己的执行引擎,而hive使用的是mapreduce来执行。
- mysql使用环境几乎没有限制,hive是基于hadoop的。
- mysql的低延迟,hive是高延迟。
- mysql的handle的数据量较小,而hive的handle数据量较大。
- mysql的可扩展性较低,而hive的扩展性较高。
- mysql的数据存储格式要求严格,而hive对数据格式不做严格要求。
- mysql可以允许局部数据插入、更新、删除等,而hive不支持局部数据的操作。