Hive 本质
Hive 是构建在 hadoop 上的数据仓库,也可以说是一个操作 hdfs 文件 的客户端,它可以将结构化的数据文件映射成表,并提供类 SQL 查询功能,用于查询的 SQL 语句会被转化为 MapReduce 作业,然后提交到 Hadoop 上运行。Hive 执行引擎可以是 MapReduce、Spark、Tez,如果是 MR,Hive 就会把 HQL 翻译成 MR 进行数据计算。
由于 Hive 是针对数据仓库应⽤设计的,⽽数据仓库的内容是读多写少的。因此,Hive 中不⽀持 对数据的改写和添加,所有的数据都是在加载的时候中确定好的。
Hive 不适合⽤于联机事务处理(OLTP),也不提供实时查询功能。它最适合应⽤在基于⼤量不可变数据的批处理 作业。Hive 的特点是可伸缩(在 Hadoop 的集群上动态的添加设备),可扩展、容错、输⼊格式的松散耦合。 Hive 的⼊⼝是 DRIVER ,执⾏的 SQL 语句⾸先提交到 DRIVER 驱动,然后调 COMPILER 解释驱动,最终解释成 MapReduce 任务执⾏,最后将结果返回。
优点:
简单、容易上手 (提供了类似 sql 的查询语言 hql),使得精通 sql 但是不了解 Java 编程的人也能很 好地进行大数据分析;
灵活性高,可以自定义用户函数 (UDF) 和存储格式;
为超大的数据集设计的计算和存储能力,集群扩展容易;
4.统一的元数据管理,可与 presto/impala/sparksql 等共享数据;
- 执行延迟高,不适合做数据的实时处理,但适合做海量数据的离线处理。
Hive 主要有以下 3 个模块:
⽤户接⼝模块
含 CLI、HWI、JDBC、Thrift Server 等,⽤来实现对 Hive 的访问。CLI 是 Hive ⾃带 的命令⾏界⾯;HWI 是 Hive 的⼀个简单⽹⻚界⾯;JDBC、ODBC 以及 Thrift Server 可向⽤户提供进 ⾏编程的接⼝,其中 Thrift Server 是基于 Thrift 软件框架开发的,提供
Hive 的 RPC 通信接⼝
驱动模块(Driver):含编译器 compiler、优化器 optimizer、执⾏器 executor 等,负责把 HiveQL 语句转换成⼀系列 MR 作业, 所有命令和查询都会进⼊驱动模块,通过该模块的解析变异,对计算过程进⾏优化,然后按照指定 的步骤执⾏。
元数据存储模块(Metastore)
是⼀个独⽴的关系型数据库,通常与 MySQL 数据库连接后创建的 ⼀个 MySQL 实例,也可以是 Hive ⾃带的 Derby 数据库实例。此模块主要保存表模式和其他系统元数 据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据所在位置信息等。
|
|
hive 创建的内部表,默认放在 hdfs 的/usr/hive/warehouse 文件夹下
可以看到 db_msg.db、myhive.db 是数据库,其他的是表,而这些表创建时默认放在另一个 default 库中只是在 hdfs 中没有显示,在 hive 中才能显示出来。由此可见 hive 的表和库其实就是一个个 hdfs 文件夹,表和库可以是并列同级关系。表有内外之分,创建时默认是内部表,而 external_stu1 是外部表,外部表和内部表的区别就在于外部表只是把 hdfs 的文件数据和 hive 的表相关联,在 hive 中删除外部表,hdfs 的文件数据依然存在不会被删除,而删除内部表,表的文件数据和表本身会一同删除。

架构

Hive 日志配置
|
|
properties 文件的日志存放目录修改之后如下:
日志目录是后来配置的,于是又把/tmp/root 目录下的 hive 日志手动移到了 hive/logs 下:

HQL 执行过程
Hive 在执行一条 HQL 的时候,会经过以下步骤:
- 语法解析:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象 语法树 AST Tree;
- 语义解析:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
- 生成逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
- 优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变换,合并不必要的 * ReduceSinkOperator,减少 shuffle 数据量;
- 生成物理执行计划:遍历 OperatorTree,翻译为 MapReduce 任务;
- 优化物理执行计划:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。
Hive 四种玩法:
CLI
配置 hive 环境变量(通常是/etc/profile 文件)后,在任意目录下直接输入命令 hive 即可启动(或者 hive –service cli),前提是要启动 hdfs(start-dfs.sh)和 hive 元数据服务(start-hivemetastore.sh 自己写的脚本配置到环境变量),因为 hive 就是操作 hdfs 的文件的。
注意!!!
注意第一行提到 Hive-on -MR is deprecated 在 2.x 版本已经废弃不推荐使用,后续都是 hive on spark (on Tez),但是 MapReduce 的 hive 优化还是建议学一下。
上面这种情况可能就是没启动元数据服务。
hive 通常是在集群环境中使用的,如果只启动了一台服务器,那么在启动 hive 时会报错,如下:
name node 处于安全模式,服务器数量少于最小要求数量,这种情况要么等 18s 后重新启动 cli,要么启动第二台服务器并启动上面的 hdfs。
HiveServer2
启动 hiveserver2 服务,提供 thrift 端口供其他客户连接,启动之后就可以使用 hive 之外的其他工具操作 hdfs 文件,比如 DBserver,IDEA 的数据库插件
需要在 hdfs 的 core-site.xml 文件中加如下配置:
|
|
任意目录下启动 hiveserver2(前台)或者切换到后台。 自己写的后台脚本,配置到环境变量中
[root@linux01 bin]# cat start-hiveserver2.sh
|
|
Beeline
启动 beeline 必须先启动 hiveserver2,启动 beeline 后,键入
|
|

Web UI
在 hive-site-xml 中添加 hive 配置。
|
|
启动 hive,浏览器即可访问 10002 端口