hive是数据仓库工具
hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。
Hive 定义了简单的类 SQL 查询语言,称为 QL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
hive解决的问题
将结构化的数据文件映射为一张数据库表,并定义了简单的类 SQL 查询语言,完成对HDFS数据的查询。
hive的结构
用户接口包括CLI,JDBC/ODBC,WUI;CLI就是shell 终端命令行,采用交互式使用hive命令行与hive进行交互;常用JDBC/ODBC,是hive基于JDBC提供的客户端,用户通过它连接至 hive server服务;Web UI,通过浏览器访问hive。
Driver组件包括Complier、Optimizer和Executor,它的作用是将我们写的HiveQL语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。
Metastore组件是元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。
元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性。
thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口,包括JDBC和ODBC接口。
hive的优缺点
1) 简单易上手
2) 扩展能力较好
3) 统一的元数据管理
4) 由于是从HDFS中读取数据,所以决定了hive不支持局部的修改和删除,只能整体的覆盖、删除。
hive与关系数据库
关系数据库里,表的加载模式是在数据加载时候强制确定的,这个就叫“写时模式”,写时模式会在数据加载时候对数据模式进行检查校验的操作。Hive在加载数据时候和关系数据库不同,hive在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行,这种模式叫“读时模式”。
关系数据库一个重要的特点是可以对某一行或某些行的数据进行更新、删除操作,hive不支持对某个具体行的操作,hive对数据的操作只支持覆盖原数据和追加数据。
Hive也不支持事务和索引。更新、事务和索引都是关系数据库的特征,这些hive都不支持。
Hive和hbase集成,hbase可以进行快速查询,但是hbase不支持类SQL的语句,那么此时hive可以给hbase提供sql语法解析的外壳,可以用类sql语句操作hbase数据库。
关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差。
Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比数据库差很多。
Hive与Hadoop
Hive构建在Hadoop之上
HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 ,所有的数据都是存储在 Hadoop 中;查询计划被转化为 MapReduce 任务,在 Hadoop 中执行(有些查询没有 MR 任务,如:select * from table)。
Hive的查询过程
在Hive执行下面的查询语句,通过 Hive 的 Client向 Hive 提交 SQL 命令。
如果是创建数据表的 DDL,Hive 就会通过执行引擎 Driver 将数据表的信息记录在 Metastore 元数据组件中,这个组件通常用一个关系数据库实现,记录表名、字段名、字段类型、关联 HDFS 文件路径等这些数据库的 Meta 信息。
如果我们提交的是查询分析数据的 DQL(数据查询语句),Driver 就会将该语句提交给自己的编译器 Compiler 进行语法分析、语法解析、语法优化等一系列操作,最后生成一个 MapReduce 执行计划。然后根据执行计划生成一个 MapReduce 的作业,提交给 Hadoop MapReduce 计算框架处理。
Hive 内部预置了很多函数,Hive 的执行计划就是根据 SQL 语句生成这些函数的 DAG,然后封装进 MapReduce 的 map 和 reduce 函数中。
上图的例子中,map 函数调用了三个 Hive 内置函数 TableScanOperator、FilterOperator、FileOutputOperator,就完成了 map 计算,而且无需 reduce 函数。
Hive 如何实现 join 操作
下面是两个表和一个关联关系的SQL语句如下:
这个 SQL 命令也可以转化为 MapReduce 计算&#xff0c;转换的过程如下&#xff0c;因为 join 涉及两张表&#xff0c;来自两个文件&#xff0c;所以需要在 map 输出的时候进行标记&#xff0c;比如来自第一张表的输出 Value 就记录为 <1, X>&#xff0c;这里的 1 表示数据来自第一张表。这样经过 shuffle 以后&#xff0c;相同的 Key 被输入到同一个 reduce 函数&#xff0c;就可以根据表的标记对 Value 数据求笛卡尔积&#xff0c;用第一张表的每条记录和第二张表的每条记录连接&#xff0c;输出就是 join 的结果
Hive on Other
后来 Hive 推出了 Hive on Spark&#xff0c;将 Hive 的执行计划转换成 Spark 的计算模型。
我们还希望在 NoSQL 的数据库上执行 SQL&#xff0c;毕竟 SQL 发展了几十年&#xff0c;积累了庞大的用户群体&#xff0c;很多人习惯了用 SQL 解决问题。于是 Saleforce 推出了 Phoenix&#xff0c;一个执行在 HBase 上的 SQL 引擎。