
Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言 HQL,用于访问和分析存储在Hadoop文件中的大型数据集。
Hive的核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行。这里需要注意下:在 Hive2 中,由于MapReduce的特征,就已经不建议继续使用MapReduce运算,推荐使用速度更快的 spark 或 tez。
MapReduce,减少开发人员的学习成本。HDFS存储数据,默认利用MapReduce查询分析数据,可以有效利用 Hdoop 的优点。Hive 的数据模型类似于 RDBMS 库表结构,并且还有自己特有模型,在粒度级别上可以分为:database数据库、Table 表、Partition分区、Bucket 分桶。
其中 Table 表 可以理解称 HDFS 中的某个目录,Partition分区 表示文件根据某种规则拆分到不同的目录文件下存储,Bucket 分桶表示具体存放数据的文件。
Hive 中也类似于 RDBMS 中有数据库,并且数据库也有 Schema 的概念,每个数据库下面有各自的表组成。默认的数据库为 default。数据默认存储在 HDFS 中的 /user/hive/warehouse 下,可以通过修改 Hive 的配置文件
hive-site.xml 中的 hive.metastore.warehouse.dir 制定存储根目录。
Hive 中的表的元数据是存储在RDBMS中的,比如可以配置存储在 MySql 中。Hive有两种类型的表:Managed Table内部表、托管表、External Table外部表,默是情况下是内部表。
在创建表时,如果没有 external 修饰则是内部表,有external修饰则是外部表,内部表的数据是Hive自身管理,外部表数据由HDFS管理,外部表的数据存储位置可以自己指定,比如指定 /user/hive/warehouse 之外的路径。在删除时如果删除的时内部表,则会删除元数据和存储数据,如果时外部表仅删除元数据,在HDFS上的文件不会删除。
Partitions 分区,类似于数据库的分库分表,可以根据某个列(例如:时间、地区等)将表划分为不同分区。有效减少某个文件的大小,增加读的速度。分区在存储层面上的表现为,表目录下的子目录的形式存在。一个目录表示一个分区。子目录命名方式为:分区列=分区值,另外还支持多重分区,在分区下继续创建子分区。
Buckets 分桶是指根据表中的某个字段(例如:id,手机号等)的值,经过hash计算规则将数据文件划分成指定的若干个小文件。这样的好处是可以优化 join 查询并方便抽样查询。Bucket 分桶在 hdfs 中表现为同一个表目录下数据根据 hash 散列之后的多个不同文件。

Hive具有数据库的外表,SQL操作的语法使得 Hive 上手起来非常容易,但Hive 的应用场景却和 MySQL 完全不同。Hive由于其实时性较低,执行延迟大,比较适合用来做海量数据的离线分析。定位是数据仓库,面向分析的OLAP系统。而 MySQL 适合承担业务场景的数据处理,只要面向 OLTP 系统。
| Hive | MySQL | |
|---|---|---|
| 定位 | 数据仓库 | 业务数据库 |
| 场景 | OLAP | OLTP |
| 查询语言 | HQL | SQL |
| 存储方式 | HDFS | 所在安装文件系统磁盘 |
| 执行引擎 | MR、Tez、Spark | Excutor |
| 执行延迟 | 高 | 低 |
| 处理数据量 | 大 | 小 |
| 常用操作 | 批量导入数据、聚合查询统计 | 增删改查 |
元数据包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息。元数据是存储在关系型数据库中。如 hive 内置的Derby,也可以存储在第三方如MySQL中。
Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。保证了元数据的安全。
metastore 有三种配置方式:内嵌模式(使用内置的Derby)、本地模式、远程模式。
内嵌模式:metastore 默认的部署模式。此种模式下,元数据存储在内置的Derby数据库,并且Derby数据库和metastore服务都嵌入在主HiveServer进程中,当启动HiveServer进程时,Derby和metastore都会启动。不需要额外起Metastore服务。但是一次只能支持一个活动用户,仅适用于测试体验,不适用于其他环境。
本地模式:Hive Metastore服务与主HiveServer进程在同一进程中运行,但是存储元数据的数据库在单独的进程中运行,并且可以在单独的主机上。metastore服务将通过JDBC与metastore数据库进行通信。这种方式的缺点是每启动一次hive服务,都内置启动了一个metastore。
远程模式:Metastore服务在其自己的单独JVM上运行,而不在HiveServer的JVM中运行。如果其他进程希望与Metastore服务器通信,则可以使用Thrift Network API进行通信。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。这种方式需要单独手动启动 metastore服务。
在安装前,需要确保已经安装好了 Hadoop 环境,并且启动Hadoop 环境,如果不了解可以参考下面我的博客:
首先下载 Hive 的安装包:
https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
将下载后的安装包上传至服务器中:
解压安装包:
tar zxvf apache-hive-3.1.2-bin.tar.gz
进去到安装目录:
cd apache-hive-3.1.2-bin/
将 Hive 中的 guava 依赖包和 Hadoop 中的一致,不然启动的时候回报错,删除 Hive 中的guava 包:
rm -rf lib/guava-19.0.jar
将Hadoop 中的依赖包 Copy 过来:
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
下面修改Hive的环境变量,添加 HADOOP_HOME 以及 Hive 的配置和依赖目录:
mv conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh
追加下面数据,注意 Hadoop 和 Hive 的安装目录修改为自己真实的
export HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/hive/apache-hive-3.1.2-bin/lib

初始化 metadata:
bin/schematool -dbType derby -initSchema
启动hive服务:
bin/hive

测试查看数据库:
show databases;

测试创建数据库:
create database bxc;

到 HDFS 中查看文件:

本地模式这里选用 MySQL 存储元数据,在安装前需要安装好 MySQL 环境。还需将MySQL 的驱动包放置 Hive 的 lib/ 目录下,找不到的该文件的可以去 Maven 仓库中下载一个,拷贝出来上传到服务器中。
scp F:/bigdata/mysql-connector-java-5.1.32.jar root@192.168.40.172:/export/hive/apache-hive-3.1.2-bin/lib
将 Hive 中的 guava 依赖包和 Hadoop 中的一致,不然启动的时候回报错,删除 Hive 中的guava 包:
rm -rf lib/guava-19.0.jar
将Hadoop 中的依赖包 Copy 过来:
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
下面修改Hive的环境变量,添加 HADOOP_HOME 以及 Hive 的配置和依赖目录:
mv conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh
追加下面数据,注意 Hadoop 和 Hive 的安装目录修改为自己真实的
export HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/hive/apache-hive-3.1.2-bin/lib

新增 hive-site.xml 配置 MySQL 相关信息:
vi conf/hive-site.xml
添加下面内容,注意MySQL的链接换成自己的:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value> jdbc:mysql://192.168.40.172:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8value>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
<property>
<name>hive.metastore.event.db.notification.api.authname>
<value>falsevalue>
property>
<property>
<name>hive.metastore.schema.verificationname>
<value>falsevalue>
property>
configuration>
初始化 metadata:
bin/schematool -initSchema -dbType mysql -verbos
初始化后,可以去MySQL 中看下是否有创建 Hive 的 74 张表:

启动hive服务:
bin/hive

测试查看数据库:
show databases;

测试创建数据库:
create database bxc;

在安装之前先了解下Hive的客户端,上面使用的都是 Hive Client 属于第一代客户端,在 Hive 的发展中还有个 Hive Beeline Client 属于第二代客户端,第一代客户端已经不推荐使用了,第二代客户端:$HIVE_HOME/bin/beeline是一个JDBC客户端,是官方强烈推荐使用的Hive命令行工具,和第一代客户端相比,性能加强安全性提高。
Beeline Shell在嵌入式模式和远程模式下均可工作。在嵌入式模式下,它运行嵌入式 Hive(类似于Hive Client),而远程模式下beeline通过 Thrift 连接到单独的 HiveServer2 服务上,这也是官方推荐在生产环境中使用的模式。因此在该模式下还要多部署一个 HiveServer2 服务。
同样需要提前安装好 MySQL 环境,以及将 MySQL 驱动包放到 Hive 的 lib 下。
在开始前,先修改 Hadoop 中的 core-site.xml 文件,增加下面两个配置,不然在使用 beeline 远程登录的时候,回报错:root is not allowed to impersonate root 异常:
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.groupsname>
<value>*value>
property>
修改后重启 Hadoop 环境。
将 Hive 中的 guava 依赖包和 Hadoop 中的一致,不然启动的时候回报错,删除 Hive 中的guava 包:
rm -rf lib/guava-19.0.jar
将Hadoop 中的依赖包 Copy 过来:
cp /export/server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
下面修改Hive的环境变量,添加 HADOOP_HOME 以及 Hive 的配置和依赖目录:
mv conf/hive-env.sh.template conf/hive-env.sh
vi conf/hive-env.sh
追加下面数据,注意 Hadoop 和 Hive 的安装目录修改为自己真实的
export HADOOP_HOME=/export/server/hadoop-3.1.4
export HIVE_CONF_DIR=/export/hive/apache-hive-3.1.2-bin/conf
export HIVE_AUX_JARS_PATH=/export/hive/apache-hive-3.1.2-bin/lib

新增 hive-site.xml 配置 MySQL 相关信息:
vi conf/hive-site.xml
添加下面内容,注意MySQL的链接换成自己的:
<configuration>
<property>
<name>javax.jdo.option.ConnectionURLname>
<value> jdbc:mysql://192.168.40.172:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8value>
property>
<property>
<name>javax.jdo.option.ConnectionDriverNamename>
<value>com.mysql.jdbc.Drivervalue>
property>
<property>
<name>javax.jdo.option.ConnectionUserNamename>
<value>rootvalue>
property>
<property>
<name>javax.jdo.option.ConnectionPasswordname>
<value>123456value>
property>
<property>
<name>hive.server2.thrift.bind.hostname>
<value>192.168.40.172value>
property>
<property>
<name>hive.metastore.urisname>
<value>thrift://192.168.40.172:9083value>
property>
<property>
<name>hive.metastore.event.db.notification.api.authname>
<value>falsevalue>
property>
<property>
<name>hive.metastore.schema.verificationname>
<value>falsevalue>
property>
configuration>
初始化 metadata:
bin/schematool -initSchema -dbType mysql -verbos
初始化后,可以去MySQL 中看下是否有创建 Hive 的 74 张表:

启动 Metastore 服务:
nohup bin/hive --service metastore &
查看是否启动成功:

如果启动失败,可以前台启动并打印debug日志:
bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
下面启动hive服务,测试是否启动成功:
bin/hive
测试创建数据库:
create database bxc;

远程模式下方便使用 Hive Beeline Client 进行远程连接,需要启动 HiveServer2
nohup bin/hive --service hiveserver2 &

使用 beeline 客户端远程连接 Hive:
bin/beeline

连接远程 Hive 服务:
! connect jdbc:hive2://192.168.40.172:10000
用户名为 root,密码随意字符即可:

测试查看数据库:
show databases;

可以看到展示效果比使用 bin/hive 要好。