hive 通过beeline 连接 hive报错unable to read hiveserver2 configs zookeeper:
首先会在zookeeper里面创建一个namespace:并创建hiveserver2 znode。
image.png
可以看到是serverUri开头的几个节点。
此时用客户端(如beeline)连接hs2时,url需使用
jdbc:hive2://zk1:2181,zk2:2181,zk3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2
此时zk会随机从多个实例中随机拿一个实例供连接使用,过程在代码中体现如下:
image.png
先去指定的znode(/hiveserver2)下拿到所有实例,再通过Random随机拿其中一个去连接;也正因为这个随机的过程,此种方式的hs2高可用一定程度上实现了hiveserver2的负载均衡。
关于/hiveserver2下的leader节点如何产生:
当你同时开启了鉴权的服务(如ranger),hs2在启动时不仅会注册hs2的实例,还会注册一个leader节点,因为leader节点的存在,使上面讲的随机拿的过程中就可能会拿到这个leader节点,而该节点实际不是有效的hs2实例,故此时连接会报错“Unable to read HiveServer2 configs from ZooKeeper”.
鉴权模型不为null:
image.png
image.png
这个leader节点是有作用的:hiveserver2有高可用模式,ActivePassiveHA,此时leader节点才会发挥作用,但是hiveserver2实例之间并没有namenode那种主备的必要性,ActivePassiveHA是使用leader来实现active的作用,并且没有具体的实践案例,此处选择在hive随机znode时过滤leader节点。