Hive本质、架构、玩法

hive的本质,大致架构,4种玩法

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 等共享数据;

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


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

1
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 日志配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
-- 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 的时候,会经过以下步骤:

  • 语法解析: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 文件中加如下配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    <property>
                <name>hadoop.proxyuser.root.groups</name>
                <value>*</value>
                <description>允许root用户代理任何其他用户</description>
    </property>
    <property>
                <name>hadoop.proxyuser.root.hosts</name>
                <value>*</value>
                <description>允许代理任意服务器的请求</description>
    </property>
    root也可以换成hadoop等其他用户,我这里设置成了超级用户root

任意目录下启动 hiveserver2(前台)或者切换到后台。 自己写的后台脚本,配置到环境变量中

[root@linux01 bin]# cat start-hiveserver2.sh

1
2
3
#!/bin/bash
nohup $HIVE_HOME/bin/hive --service hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &
#启动hiveserver2服务,提供thrift端口供其他客户连接

Beeline

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

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

Web UI

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

1
2
3
4
5
6
7
8
9
    <property>
        <name>hive.server2.webui.host</name>
        <!--主机名或ip-->
        <value>linux01</value>
    </property>
    <property>
        <name>hive.server2.webui.port</name>
        <value>10002</value>
    </propert>

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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计