hive server2在集群启用kerberos 环境下使用 haproxy 进行负载均衡时,会出现连接hive server2失败。异常产生的原因是hive server2实例DBTokenStore缓存的票据信息没有共享给其它实例,每个实例是独立的,客户端从一个hive server2获取票据,查询时可能访问的就是另外一个hive server2实例,导致失败。在这里有人可能就会想到用 ip hash负载方法将请求连接到同一台服务器,这种方法是解决不了这个问题的,举个例子:oozie 调度hive 任务,oozie首先从一个hive server2获取票据,hive任务调度时会在另外一个节点执行去访问另外一个hive server2。
解决方案:
1. 在官方没有修改DBTokenStore前,可以将hive server2 delegation token store的存储策略改为:
<property>
<name>hive.cluster.delegation.token.store.class</name>
<value>org.apache.hadoop.hive.thrift.ZooKeeperTokenStore</value>
</property>
2. 升级hive,cdh在5.13.0后修复了此问题,apache hive 在2.1版本后修复了此问题