一、Hive介绍
Apache Hive
是一款建立在Hadoop
之上的开源数据仓库系统,可以将存储在Hadoop
文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL
的查询模型,称为Hive
查询语言 HQL
,用于访问和分析存储在Hadoop
文件中的大型数据集。
Hive
的核心是将HQL
转换为MapReduce
程序,然后将程序提交到Hadoop
群集执行。这里需要注意下:在 Hive2 中,由于MapReduce
的特征,就已经不建议继续使用MapReduce
运算,推荐使用速度更快的 spark
或 tez
。
Hive 的优点:
- 简化了学习成本:避免直接写
MapReduce
,减少开发人员的学习成本。 - 提升开发效率:操作接口采用类SQL语法,简单、容易上手。
- 支持自定义函数:扩展能力强
- 依靠于 Hadoop:利用
HDFS
存储数据,默认利用MapReduce
查询分析数据,可以有效利用Hdoop
的优点。
Hive的特点
Hive 的数据模型类似于 RDBMS
库表结构,并且还有自己特有模型,在粒度级别上可以分为:database数据库、Table 表、Partition分区、Bucket 分桶
。
其中 Table 表
可以理解称 HDFS
中的某个目录,Partition分区
表示文件根据某种规则拆分到不同的目录文件下存储,Bucket 分桶
表示具体存放数据的文件。
1. 数据库
Hive
中也类似于 RDBMS
中有数据库,并且数据库也有 Schema
的概念,每个数据库下面有各自的表组成。默认的数据库为 default
。数据默认存储在 HDFS
中的 /user/hive/warehouse
下,可以通过修改 Hive 的配置文件hive-site.xml
中的 hive.metastore.warehouse.dir
制定存储根目录。
2. 数据表
Hive
中的表的元数据是存储在RDBMS
中的,比如可以配置存储在 MySql
中。Hive有两种类型的表:Managed Table内部表、托管表、External Table外部表
,默是情况下是内部表。
在创建表时,如果没有 external
修饰则是内部表,有external
修饰则是外部表,内部表的数据是Hive
自身管理,外部表数据由HDFS
管理,外部表的数据存储位置可以自己指定,比如指定 /user/hive/warehouse
之外的路径。在删除时如果删除的时内部表,则会删除元数据和存储数据,如果时外部表仅删除元数据,在HDFS
上的文件不会删除。
3. Partitions 分区
Partitions 分区
,类似于数据库的分库分表,可以根据某个列(例如:时间、地区等)将表划分为不同分区。有效减少某个文件的大小,增加读的速度。分区在存储层面上的表现为,表目录下的子目录的形式存在。一个目录表示一个分区。子目录命名方式为:分区列=分区值
,另外还支持多重分区,在分区下继续创建子分区。
4. Buckets
Buckets 分桶
是指根据表中的某个字段(例如:id,手机号等)的值,经过hash
计算规则将数据文件划分成指定的若干个小文件。这样的好处是可以优化 join
查询并方便抽样查询。Bucket 分桶
在 hdfs
中表现为同一个表目录下数据根据 hash
散列之后的多个不同文件。
Hive 对比 MySQL
Hive
具有数据库的外表,SQL
操作的语法使得 Hive
上手起来非常容易,但Hive
的应用场景却和 MySQL
完全不同。Hive
由于其实时性较低,执行延迟大,比较适合用来做海量数据的离线分析。定位是数据仓库,面向分析的OLAP
系统。而 MySQL 适合承担业务场景的数据处理,只要面向 OLTP
系统。
Hive | MySQL | |
定位 | 数据仓库 | 业务数据库 |
场景 | OLAP | OLTP |
查询语言 | HQL | SQL |
存储方式 | HDFS | 所在安装文件系统磁盘 |
执行引擎 | MR、Tez、Spark | Excutor |
执行延迟 | 高 | 低 |
处理数据量 | 大 | 小 |
常用操作 | 批量导入数据、聚合查询统计 | 增删改查 |
Hive的部署组件
1. Metadata元数据存储方式
元数据包含用Hive
创建的database、table、表
的位置、类型、属性,字段顺序类型等元信息。元数据是存储在关系型数据库中。如 hive
内置的Derby
,也可以存储在第三方如MySQL
中。
2.Metastore元数据服务
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服务。
二、Hive 内嵌模式初体验
在安装前,需要确保已经安装好了 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 中查看文件:
三、Hive本地模式安装
本地模式这里选用 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.ConnectionURL</name>
<value> jdbc:mysql://192.168.40.172:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<!-- 这里注意MySQL 版本,我的是 5.X , 如果是 8 需要换成 8 的驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- 关闭元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 关闭元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
初始化 metadata
:
bin/schematool -initSchema -dbType mysql -verbos
初始化后,可以去MySQL
中看下是否有创建 Hive
的 74
张表:
启动hive
服务:
bin/hive
测试查看数据库:
show databases;
测试创建数据库:
create database bxc;
四、Hive远程模式安装
在安装之前先了解下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
异常:
<!-- 整合hive -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<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>
<!-- 存储元数据mysql相关配置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value> jdbc:mysql://192.168.40.172:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- H2S运行绑定host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>192.168.40.172</value>
</property>
<!-- 远程模式部署metastore 服务地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://192.168.40.172:9083</value>
</property>
<!-- 关闭元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- 关闭元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</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
要好。