目录
1:官网下载安装包 Index of /dist/hive 。
b- 指定元数据库的驱动程序(以 mysql为元数据库为例)
e- 设置方便操作,查看的属性。 在 命令行 中显示 数据库名和数据的表头
f- 设置小规模数据时,使用本地模式,提高效率。本机练习时常用
4:将对应的mysql驱动程序拷贝到 hive-2.3.7/lib 下。
前提: 安装了 hadoop(提供数据的存储HDFS) 和 mysql (作为hive的元数据库)。
hadoop的安装文档: hadoop安装部署(学习)
mysql新建了hive的用户。 用户名为 hive , 密码为 "12345678"
软件 | node1 | node2 | node3 |
hadoop | √ | √ | √ |
hive | √ | ||
mysql | √ |
1:官网下载安装包 Index of /dist/hive 。
以hive-2.3.7为例
2:解压缩安装包
以 安装目录为 /opt/cluster/servers 为例,
# 解压到hive 到 /opt/cluster/servers/
tar zxvf apache-hive-2.3.7-bin.tar.gz -C /opt/cluster/servers/
# 重命名
mv /opt/cluster/servers/apache-hive-2.3.7-bin /opt/cluster/servers/hive-2.3.7
3:修改 hive配置。
可以拷贝 conf下的 hive-default.template.xml。也可以新建配置文件。
以新建 hive-site.xml为例。新建文件后,新增内容.
a- 指定hive的元数据 存储位置
b- 指定元数据库的驱动程序(以 mysql为元数据库为例)
c- 指定元数据库的 用户名和密码
d- 指定数据在HDFS上的存储路径
e- 设置方便操作,查看的属性。 在 命令行 中显示 数据库名和数据的表头
f- 设置小规模数据时,使用本地模式,提高效率。本机练习时常用
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- hive元数据的存储位置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node3:3306/hivemetadata?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<!-- 指定驱动程序 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<!-- 连接数据库的用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<!-- 连接数据库的口令 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>12345678</value>
<description>password to use against metastore database</description>
</property>
<!-- 数据默认的存储位置(HDFS) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 在命令行中,显示当前操作的数据库 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 在命令行中,显示数据的表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 操作小规模数据时,使用本地模式,提高效率 -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
</configuration>
注意jdbc的连接串,如果没有 useSSL=false 会有大量警告
在xml文件中 & 表示 &
4:将对应的mysql驱动程序拷贝到 hive-2.3.7/lib 下。
注意驱动程序版本要对应
我的mysql是 5.7.24, 驱动程序版本是 5.1.46, mysql-connector-java-5.1.46.jar
5:配置环境变量 。
配置hive的环境变量。方便后续的使用。
vi /etc/profile
# 在 /etc/profile 文件中增加环境变量
export HIVE_HOME=/opt/cluster/servers/hive-2.3.7
export PATH=$PATH:$HIVE_HOME/bin
# 执行并生效
source /etc/profile
6:初始化 元数据库
schematool -dbType mysql -initSchema
7:启动 hive,验证是否部署成功
# 启动hive服务之前,请先启动hdfs、yarn的服务
[root@node123 ~]$ hive
hive> show functions;
二: 生产环境的元数据管理
上面的配置,在hdfs-site.xml中暴露了元数据库(mysql)的连接信息(地址,驱动,用户名和密码)。所以在生产环境一般不采用这种方式。而是在上层暴露一个服务metastore,这个服务协议thift要兼容多语言(java,python等),多驱动(mysql,oracle等),为外部访问Hive元数据提供入口,通过它来屏蔽了 数据库访问的地址,驱动,用户名和密码。
第一种的元数据管理模式(元数据存在mysql,hdfs-site.xml中配置元数据库的连接信息),一般叫本地模式。每个hive 服务 都内嵌一个metastore(metastore是管理元数据的服务)。
生产环境一般采用的是远程模式,单独起一个metastore服务,通过它统一对外面提供元数据访问入口。它自己去元数据库mysql拿元数据。
生产环境中元数据管理的远程模式配置,以3个节点为例,服务配置如下,配置2个hive metastore,可以作为HA,提高可用性
节点 | hive metastore | hive client |
node1 | 是 | |
node2 | 是 | |
node3 | 是 |
1- 在全部的节点上解压安装hive。
参考之前解压安装的步骤,并配置hive的环境变量
2- 在hive metastore的节点上配置mysql信息。
在这里就是 node1 和 node3 。编辑 hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- hive元数据的存储位置 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node3:3306/hivemetadata?createDatabaseIfNotExist=true&useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<!-- 指定驱动程序 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<!-- 连接数据库的用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastore database</description>
</property>
<!-- 连接数据库的口令 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>12345678</value>
<description>password to use against metastore database</description>
</property>
<!-- 数据默认的存储位置(HDFS) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 在命令行中,显示当前操作的数据库 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 在命令行中,显示数据的表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 操作小规模数据时,使用本地模式,提高效率 -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
</configuration>
3- 在hive节点上,放入 mysql的驱动,并初始化元数据库
拷贝 mysql的驱动到 $HIVE_HOME/lib 下,注意要和mysql的版本对应上
初始化元数据库,在node1 和3 执行命令
schematool -dbType mysql -initSchema
4- 启动hive metastore服务并检查启动结果
在 node1 和 node3 中执行
nohup hive --service metastore &
metastore的默认服务端口是9083, 我这里使用的是lsof命令,其他的网络检查端口也可以。
lsof -i:9083
5- 修改hive 客户端的 hdfs-site.xml。
告知客户端metastore的地址,不需要配置元数据库(mysql)的连接信息。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 配置hive metastore 服务地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083,thrift://node2:9083</value>
</property>
<!-- 数据默认的存储位置(HDFS) -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 在命令行中,显示当前操作的数据库 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 在命令行中,显示数据的表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 操作小规模数据时,使用本地模式,提高效率 -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
</configuration>
6- 启动hive客户端
在node2 执行
hive
7- 高可用测试
7.1-进入hive客户端,随便执行命令。比如show databases
show databases;
7.2- 查看目前连接在哪个节点的metastore
分别在 node1,node3上执行
# metastore默认的服务端口是 9083
lsof -i:9083
在 链接的节点上会有两条信息
7.3- 杀死已连接的 metastore进程
到对应的节点 kill 9 <pid>
kill 9 <pid>
7.4- 再执行show databases;还是能正常执行命令。且链接到另外一个节点上