4 部署 hive

4.1 配置 hive-env.sh

cd 到你解压的 hive 的目录下

1
cd /xxx/xxx/hive312/conf

复制 hive-env.sh.template 为 hive-env.sh

1
cp hive-env.sh.template hive-env.sh

编辑 hive-env.sh 在最下面找到并修改

1
2
3
4
5
HADOOP_HOME=/opt/module/hadoop313

export HIVE_CONF_DIR=/opt/module/hive313/conf

export HIVE_AUX_JARS_PATH=/opt/module/hive313/lib

4.2 MySQL JDBC驱动程序复制到Hive的lib目录:

1
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.32.tar.gz
1
tar -xzf mysql-connector-java-8.0.32.tar.gz
1
cp mysql-connector-java-8.0.32/mysql-connector-java-8.0.32.jar /usr/local/hive/lib/

此处应当注意其他驱动包报错,取高版本的覆盖低版本

4.3 搭建 hive HiveServer2的高可用性 (需要分发)

4.3.1 配置文件

高可用需要确保更改conf下的配置文件中以下的配置

确保ZooKeeper集群已经正确配置并运行,以下配置项将ZooKeeper用于Hive的服务发现:

1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>
<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
</configuration>

Hive Metastore高可用性需要配置多个Metastore实例,使用共享的数据库和ZooKeeper协调。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<configuration>
<!-- 配置JDBC -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</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>root</value>
</property>

<!-- 禁用元数据模式验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<!-- 配置Hive元数据服务的Thrift URI,多个Metastore实例可以共用相同的URI -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083,thrift://slave1:9083,thrift://slave2:9083</value>
</property>

<!-- 禁用Hive元数据事件通知的API认证 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
</configuration>

配置HiveServer2使用ZooKeeper进行服务发现和负载均衡:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<configuration>
<!-- 启用HiveServer2支持动态服务发现 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<!-- 配置HiveServer2在ZooKeeper中的命名空间 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<!-- 配置HiveServer2的Thrift服务端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 配置HiveServer2绑定的主机,高可用需要更改为该机器的hosts名字 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2的认证方式,这里设置为NONE表示不需要认证 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>

<!-- 配置HiveServer2 Web UI的主机 -->
<property>
<name>hive.server2.webui.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2 Web UI的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
</configuration>

下面是示例配置文件

4.3.2 编辑 master 主机 的 hive-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<configuration>
<!-- 配置JDBC -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</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>root</value>
</property>


<!-- 启用自动创建数据库模式 -->
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>

<!-- 配置Hive数据仓库目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<!-- 配置HiveServer2的Thrift服务端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 配置HiveServer2绑定的主机 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>master</value>
</property>

<!-- 配置HiveServer2的认证方式,这里设置为NONE表示不需要认证 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>

<!-- 配置HiveServer2 Web UI的主机 -->
<property>
<name>hive.server2.webui.host</name>
<value>master</value>
</property>

<!-- 配置HiveServer2 Web UI的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>

<!-- 禁用元数据模式验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<!-- 配置Hive元数据服务的Thrift URI -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>

<!-- 禁用Hive元数据事件通知的API认证 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

<!-- 配置Hive CLI打印表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<!-- 配置Hive CLI打印当前数据库名称 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

<!-- 启用HiveServer2支持动态服务发现 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<!-- 配置HiveServer2在ZooKeeper中的命名空间 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
</configuration>

4.3.3 编辑 slave1 主机 的 hive-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<configuration>
<!-- 配置JDBC连接URL,用于连接Hive元数据存储的MySQL数据库 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
</property>

<!-- 配置JDBC驱动程序类名,用于MySQL连接 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<!-- 配置连接MySQL数据库的用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>

<!-- 配置连接MySQL数据库的密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>

<!-- 启用自动创建数据库模式 -->
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>




<!-- 配置Hive数据仓库目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<!-- 配置HiveServer2的Thrift服务端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 配置HiveServer2绑定的主机 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2的认证方式,这里设置为NONE表示不需要认证 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>

<!-- 配置HiveServer2 Web UI的主机 -->
<property>
<name>hive.server2.webui.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2 Web UI的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>

<!-- 禁用元数据模式验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<!-- 配置Hive元数据服务的Thrift URI -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>

<!-- 禁用Hive元数据事件通知的API认证 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

<!-- 配置Hive CLI打印表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<!-- 配置Hive CLI打印当前数据库名称 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

<!-- 启用HiveServer2支持动态服务发现 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<!-- 配置HiveServer2在ZooKeeper中的命名空间 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
</configuration>

4.3.4 初始化 Hive Metastore

初始化Hive Metastore数据库:

1
schematool -initSchema -dbType mysql

4.5 启动和验证

启动Hive Metastore
在各个Metastore实例上启动Hive Metastore服务:

1
hive --service metastore &

启动HiveServer2
在各个HiveServer2实例上启动HiveServer2服务:

1
hive --service hiveserver2 &

使用 jps -m 查看是否有相关进程

1
jps -m

4.6 验证高可用性

通过beeline或hive CLI客户端连接到HiveServer2,使用ZooKeeper的连接字符串进行连接:

1
beeline -u "jdbc:hive2://master:2181,slave1:2181,slave2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk"

我只配了2台机器上的hive 所以地址只写了 master 和slave1

1
!connect jdbc:hive2://master,slave1/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk along root