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 任务执⾏,最后将结果返回。

优点:

1. 简单、容易上手 (提供了类似 sql 的查询语言 hql),使得精通 sql 但是不了解 Java 编程的人也能很 好地进行大数据分析;

2. 灵活性高,可以自定义用户函数 (UDF) 和存储格式;

3. 为超大的数据集设计的计算和存储能力,集群扩展容易;

4. 统一的元数据管理,可与 presto/impala/sparksql 等共享数据;

5. 执行延迟高,不适合做数据的实时处理,但适合做海量数据的离线处理。

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数据库实例。此模块主要保存表模式和其他系统元数 据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据所在位置信息等。

Metastore

metastore是Hive最重要的部件,在 Hive 中,表名、表结构、字段名、字段类型、表的分隔符等统一被称为元数据。所有的元数据默认存储在 Hive 内置的 derby 数据库中,但由于 derby 只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL中的自建数据库代替derby。Hive 进行的是统一的元数据管理,就是说你在 Hive 上创建了一张表,然后在 presto、impala、sparksql中都是可以直接使用的,它们会从 Metastore 中获取统一的元数据信息,同样的你在 presto、impala、sparksql 中创建一张表,在 Hive 中也可以直接使用。

hive创建的内部表,默认放在hdfs的/usr/hive/warehouse文件夹下

 可以看到db_msg.db、myhive.db是数据库,其他的是表,而这些表创建时默认放在另一个default库中只是在hdfs中没有显示,在hive中才能显示出来。由此可见hive的表和库其实就是一个个hdfs文件夹,表和库可以是并列同级关系。表有内外之分,创建时默认是内部表,而external_stu1是外部表,外部表和内部表的区别就在于外部表只是把hdfs的文件数据和hive的表相关联,在hive中删除外部表,hdfs的文件数据依然存在不会被删除,而删除内部表,表的文件数据和表本身会一同删除。

架构 

Hive日志配置

-- Hive中的日志分为两种

1. 系统日志,记录了hive的运行情况,错误状况。

2. Job 日志,记录了Hive 中job的执行的历史过程。

系统日志存储在什么地方呢 ?

在hive/conf/hive-log4j.properties 文件中记录了Hive日志的存储情况,

如果没有hive-log4j.properties。那么需要找到该文件夹下的hive-log4j.properties.templete,这个是模板文件,运行mv命令把templete重命名成properties文件即可。

properties文件默认的存储情况:

property.hive.root.logger=WARN,DRFA

property.hive.log.dir=/tmp/${user.name} # 默认的存储位置,一般是/tmp/root,此处改成hive/logs

property.hive.log.file=hive.log # 默认的文件名

Job日志又存储在什么地方呢 ?

//Location of Hive run time structured log file

HIVEHISTORYFILELOC("hive.querylog.location", "/tmp/" + System.getProperty("user.name")),

默认存储与在/tmp/{user.name}目录下。但是我没找到。。。

 properties文件的日志存放目录修改之后如下:

 日志目录是后来配置的,于是又把/tmp/root目录下的hive日志手动移到了hive/logs下:

HQL执行过程

Hive 在执行一条 HQL 的时候,会经过以下步骤:

1. 语法解析:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象 语法树 AST Tree;

2. 语义解析:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;

3. 生成逻辑执行计划:遍历 QueryBlock,翻译为执行操作树 OperatorTree;

4. 优化逻辑执行计划:逻辑层优化器进行 OperatorTree 变换,合并不必要的 ReduceSinkOperator,减少 shuffle 数据量;

5. 生成物理执行计划:遍历 OperatorTree,翻译为 MapReduce 任务;

6. 优化物理执行计划:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划。

Hive四种玩法:

1)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。

2)HiveServer2

启动hiveserver2服务,提供thrift端口供其他客户连接,启动之后就可以使用hive之外的其他工具操作hdfs文件,比如DBserver,IDEA的数据库插件

需要在hdfs的core-site.xml文件中加如下配置:

                hadoop.proxyuser.root.groups                 *                 允许root用户代理任何其他用户                                   hadoop.proxyuser.root.hosts                 *                 允许代理任意服务器的请求              root也可以换成hadoop等其他用户,我这里设置成了超级用户root

 任意目录下启动hiveserver2(前台)或者切换到后台

自己写的后台脚本,配置到环境变量中

[root@linux01 bin]# cat start-hiveserver2.sh  #!/bin/bash nohup $HIVE_HOME/bin/hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 & #启动hiveserver2服务,提供thrift端口供其他客户连接

3)Beeline

启动beeline必须先启动hiveserver2,启动beeline后,键入

!connect jdbc:hive2://linux01:10000

并输入用户名密码即可,这里的登录用户可以是任意用户因为hadoop的core-site.xml设置了root用户可以代理任意用户。linux01是我的服务器名

4)Web UI

在 hive-site-xml 中添加 hive 配置。

             hive.server2.webui.host                  linux01                   hive.server2.webui.port         10002     

启动hive,浏览器即可访问10002端口

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: