xiaozhongcheng created HIVE-25096: ------------------------------------- Summary: beeline can't get the correct hiveserver2 using the zoopkeeper with serviceDiscoveryMode=zooKeeper. Key: HIVE-25096 URL: https://issues.apache.org/jira/browse/HIVE-25096 Project: Hive Issue Type: Bug Components: Beeline Affects Versions: 3.1.2 Environment: centos7.4
x86_64 Reporter: xiaozhongcheng Fix For: 4.0.0 beeline can't get the correct hiveserver2 using the zoopkeeper with serviceDiscoveryMode=zooKeeper. You know, HiveServer2#startPrivilegeSynchronizer will create the namespace of /hiveserver2/leader in the zookeeper, however, if you want to connect to the hiveserver2 using beeline with the command like "jdbc:hive2://vhost-120-26:2181,vhost-120-27:2181,vhost-120-28:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2", the beeline will randomly chose the sub-namespace under /hiveserver2. That arises a problem that the beeline will find the hiveserver2 information in the namespace of /hiveserver2/leader, it's impossible to detect the hiveserver2 connection information. That's to say, the sub-namespace of /hiveserver2 is like this: [zk: vhost-120-28:2181,vhost-120-27:2181,vhost-120-26:2181(CONNECTED) 1] ls /hiveserver2 [leader, serverUri=vhost-120-26:10000;version=3.1.2;sequence=0000000010, serverUri=vhost-120-28:10000;version=3.1.2;sequence=0000000011] Codes list bellow show {color:#222222}HiveServer2#startPrivilegeSynchronizer and beeline how to connect the hiveserver2.{color} {color:#222222}HiveServer2#startPrivilegeSynchronizer:{color} {color:#222222} public void startPrivilegeSynchronizer(HiveConf hiveConf) throws Exception {{color} {color:#222222} {color} {color:#222222} if (!HiveConf.getBoolVar(hiveConf, ConfVars.HIVE_PRIVILEGE_SYNCHRONIZER)) {{color} {color:#222222} return;{color} {color:#222222} }{color} {color:#222222} PolicyProviderContainer policyContainer = new PolicyProviderContainer();{color} {color:#222222} HiveAuthorizer authorizer = SessionState.get().getAuthorizerV2();{color} {color:#222222} if (authorizer.getHivePolicyProvider() != null) {{color} {color:#222222} policyContainer.addAuthorizer(authorizer);{color} {color:#222222} }{color} {color:#222222} if (MetastoreConf.getVar(hiveConf, MetastoreConf.ConfVars.PRE_EVENT_LISTENERS) != null &&{color} {color:#222222} MetastoreConf.getVar(hiveConf, MetastoreConf.ConfVars.PRE_EVENT_LISTENERS).contains({color} {color:#222222} "org.apache.hadoop.hive.ql.security.authorization.AuthorizationPreEventListener") &&{color} {color:#222222} MetastoreConf.getVar(hiveConf, MetastoreConf.ConfVars.HIVE_AUTHORIZATION_MANAGER)!= null) {{color} {color:#222222} List<HiveMetastoreAuthorizationProvider> providers = HiveUtils.getMetaStoreAuthorizeProviderManagers({color} {color:#222222} hiveConf, HiveConf.ConfVars.HIVE_METASTORE_AUTHORIZATION_MANAGER, SessionState.get().getAuthenticator());{color} {color:#222222} for (HiveMetastoreAuthorizationProvider provider : providers) {{color} {color:#222222} if (provider.getHivePolicyProvider() != null) {{color} {color:#222222} policyContainer.addAuthorizationProvider(provider);{color} {color:#222222} }{color} {color:#222222} }{color} {color:#222222} }{color} {color:#222222} {color} {color:#222222} if (policyContainer.size() > 0) {{color} {color:#222222} setUpZooKeeperAuth(hiveConf);{color} {color:#222222} zKClientForPrivSync = hiveConf.getZKConfig().startZookeeperClient(zooKeeperAclProvider, true);{color} {color:#222222} String rootNamespace = hiveConf.getVar(HiveConf.ConfVars.HIVE_SERVER2_ZOOKEEPER_NAMESPACE);{color} {color:#222222} String path = ZooKeeperHiveHelper.ZOOKEEPER_PATH_SEPARATOR + rootNamespace{color} {color:#222222} + ZooKeeperHiveHelper.ZOOKEEPER_PATH_SEPARATOR + "leader";{color} {color:#222222} LeaderLatch privilegeSynchronizerLatch = new LeaderLatch(zKClientForPrivSync, path);{color} {color:#222222} privilegeSynchronizerLatch.start();{color} {color:#222222} LOG.info("Find " + policyContainer.size() + " policy to synchronize, start PrivilegeSynchronizer");{color} {color:#222222} Thread privilegeSynchronizerThread = new Thread({color} {color:#222222} new PrivilegeSynchronizer(privilegeSynchronizerLatch, policyContainer, hiveConf), "PrivilegeSynchronizer");{color} {color:#222222} privilegeSynchronizerThread.setDaemon(true);{color} {color:#222222} privilegeSynchronizerThread.start();{color} {color:#222222} } else {{color} {color:#222222} LOG.warn({color} {color:#222222} "No policy provider found, skip creating PrivilegeSynchronizer");{color} {color:#222222} }{color} {color:#222222} }{color} {color:#222222}ZooKeeperHiveClientHelper#configureConnParams{color} {color:#222222} static void configureConnParams(JdbcConnectionParams connParams) throws ZooKeeperHiveClientException {{color} {color:#222222} if (isZkHADynamicDiscoveryMode(connParams.getSessionVars())) {{color} {color:#222222} configureConnParamsHA(connParams);{color} {color:#222222} } else {{color} {color:#222222} CuratorFramework zooKeeperClient = null;{color} {color:#222222} try {{color} {color:#222222} zooKeeperClient = getZkClient(connParams);{color} {color:#222222} {color} {color:#222222} final List<String> serverHosts = getServerHosts(connParams, zooKeeperClient);{color} {color:#222222} {color} {color:#222222} if (serverHosts.isEmpty()) {{color} {color:#222222} throw new ZooKeeperHiveClientException("No more HiveServer2 URIs from ZooKeeper to attempt");{color} {color:#222222} }{color} {color:#222222} {color} {color:#222222} // Pick a server node randomly{color} {color:#222222} final String serverNode = serverHosts.get(ThreadLocalRandom.current().nextInt(serverHosts.size()));{color} {color:#222222} {color} {color:#222222} updateParamsWithZKServerNode(connParams, zooKeeperClient, serverNode);{color} {color:#222222} } catch (ZooKeeperHiveClientException zkhce) {{color} {color:#222222} throw zkhce;{color} {color:#222222} } catch (Exception e) {{color} {color:#222222} throw new ZooKeeperHiveClientException("Unable to read HiveServer2 configs from ZooKeeper", e);{color} {color:#222222} } finally {{color} {color:#222222} if (zooKeeperClient != null) {{color} {color:#222222} zooKeeperClient.close();{color} {color:#222222} }{color} {color:#222222} }{color} {color:#222222} }{color} {color:#222222} }{color} {color:#222222}I wonder if it's ok to use /hiveserver2-leader to replace /hiveserver2/leader?{color} -- This message was sent by Atlassian Jira (v8.3.4#803005)