之前Fayson介绍了《如何使用HAProxy实现HiveServer2负载均衡》,这种方案也有一些弊端,如HAProxy本身就是单点,虽然可以通过Keepalived来实现HAProxy的高可用,但这样配置会比较麻烦并且需要多部署两个组件,增大了系统运维的复杂度。在大数据平台中Zookeeper是一个必不可少且自身具有高可用保证的组件,本文主要讲述如何使用Zookeeper实现HiveServer2的HA。
1.配置HiveServer2与Zookeeper集成
2.Beeline测试
1.CM和CDH版本为5.13.0
2.采用root用户操作
3.集群未启用Kerberos
1.Hive版本必须高于0.14(含0.14)
2.修改Hive配置
1.登录CM,进入Hive服务,在HiveServer2中增加如下配置
hive.server2.support.dynamic.service.discovery true hive.server2.zookeeper.namespace hiveserver2_zk hive.zookeeper.quorum ip-172-31-10-118.fayson.com:2181,ip-172-31-5-190.fayson.com:2181,ip-172-31-6-148.fayson.com:2181 hive.zookeeper.client.port 2181
保存配置,回到CM主页根据提示重启服务。
2.修改完配置,可以通过zookeeper-client命令查看,HiveServer2已在Zookeeper注册成功
[root@ip-172-31-6-148 ~]# zookeeper-client [zk: localhost:2181(CONNECTED) 0] ls / [hiveserver2_zk, hive_zookeeper_namespace_hive, hbase, zookeeper] [zk: localhost:2181(CONNECTED) 1] ls /hiveserver2_zk [serverUri=ip-172-31-6-148.fayson.com:10000;version=1.1.0-cdh5.13.0;sequence=0000000006, serverUri=ip-172-31-5-190.fayson.com:10000;version=1.1.0-cdh5.13.0;sequence=0000000005] [zk: localhost:2181(CONNECTED) 25]
通过上面截图可以看到两个HiveServer2的服务都注册到了Zookeeper。
3.Beeline测试
HiveServer2注册Zookeeper后,JDBC连接的URL格式为:
jdbc:hive2:/// ;ServiceDiscoveryMode=zookeeper;zooKeeperNameSpace=hiveserver2
参数说明:
serviceDiscoveryMode:指定模式为zooKeeper
zooKeeperNamespace:指定ZK中的nameSpace,即参数hive.server2.zookeeper.namespace所定义
具体可以参考官网:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-ConnectionURLWhenZooKeeperServiceDiscoveryIsEnabled
1.使用Beeline连接HiveServer2服务
[root@ip-172-31-6-148 ~]# beeline beeline> !connect jdbc:hive2://ip-172-31-10-118.fayson.com:2181,ip-172-31-5-190.fayson.com:2181,ip-172-31-6-148.fayson.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk .... 17/11/10 08:23:26 [main]: INFO jdbc.HiveConnection: Connected to ip-172-31-6-148.fayson.com:10000 ... 0: jdbc:hive2://ip-172-31-10-118.fayson.com:2> select * from test; ... INFO : OK +----------+----------+--+ | test.s1 | test.s2 | +----------+----------+--+ | 11 | 222 | +----------+----------+--+ 1 row selected (3.516 seconds) 0: jdbc:hive2://ip-172-31-10-118.fayson.com:2>
通过上图标注可以看到通过Beeline连接到的是ip-172-31-6-148.fayson.com的HiveServer2服务,这时我们停止ip-172-31-6-148.fayson.com的服务,再次连接。
2.停止ip-172-31-6-148.fayson.com的HivServer2服务
3.使用Beeline再次连接
[root@ip-172-31-6-148 ~]# beeline beeline> !connect jdbc:hive2://ip-172-31-10-118.fayson.com:2181,ip-172-31-5-190.fayson.com:2181,ip-172-31-6-148.fayson.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk ... 17/11/10 08:34:27 [main]: INFO jdbc.HiveConnection: Connected to ip-172-31-5-190.fayson.com:10000 0: jdbc:hive2://ip-172-31-10-118.fayson.com:2> select * from test; +----------+----------+--+ | test.s1 | test.s2 | +----------+----------+--+ | 11 | 222 | +----------+----------+--+ 1 row selected (2.103 seconds) 0: jdbc:hive2://ip-172-31-10-118.fayson.com:2>
可以看到在ip-172-31-6-148.fayson.com节点上的HiveServer2服务停止后,再次连接时自动指向了ip-172-31-5-190.fayson.com节点上的HiveServer2。