org.apache.hive.beeline.hs2connection.HiveSiteHS2ConnectionFileParser Maven / Gradle / Ivy
The newest version!
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hive.beeline.hs2connection;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Properties;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.common.ServerUtils;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.annotations.VisibleForTesting;
/*
* Looks for a hive-site.xml from the classpath. If found this class parses the hive-site.xml
* to return a set of connection properties which can be used to construct the connection url
* for Beeline connection
*/
public class HiveSiteHS2ConnectionFileParser implements HS2ConnectionFileParser {
private Configuration conf;
private final URL hiveSiteURI;
private final static String TRUSTSTORE_PASS_PROP = "javax.net.ssl.trustStorePassword";
private final static String TRUSTSTORE_PROP = "javax.net.ssl.trustStore";
private static final Logger log = LoggerFactory.getLogger(HiveSiteHS2ConnectionFileParser.class);
public HiveSiteHS2ConnectionFileParser() {
hiveSiteURI = HiveConf.getHiveSiteLocation();
conf = new Configuration();
if(hiveSiteURI == null) {
log.debug("hive-site.xml not found for constructing the connection URL");
} else {
log.info("Using hive-site.xml at " + hiveSiteURI);
conf.addResource(hiveSiteURI);
}
}
@VisibleForTesting
void setHiveConf(HiveConf hiveConf) {
this.conf = hiveConf;
}
@Override
public Properties getConnectionProperties() throws BeelineHS2ConnectionFileParseException {
Properties props = new Properties();
if(!configExists()) {
return props;
}
props.setProperty(HS2ConnectionFileParser.URL_PREFIX_PROPERTY_KEY, "jdbc:hive2://");
addHosts(props);
addSSL(props);
addKerberos(props);
addHttp(props);
return props;
}
private void addSSL(Properties props) {
if (!HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_SERVER2_USE_SSL)) {
return;
} else {
props.setProperty("ssl", "true");
}
String truststore = System.getenv(TRUSTSTORE_PROP);
if (truststore != null && truststore.isEmpty()) {
props.setProperty("sslTruststore", truststore);
}
String trustStorePassword = System.getenv(TRUSTSTORE_PASS_PROP);
if (trustStorePassword != null && !trustStorePassword.isEmpty()) {
props.setProperty("trustStorePassword", trustStorePassword);
}
String saslQop = HiveConf.getVar(conf, ConfVars.HIVE_SERVER2_THRIFT_SASL_QOP);
if (!"auth".equalsIgnoreCase(saslQop)) {
props.setProperty("sasl.qop", saslQop);
}
}
private void addKerberos(Properties props) {
if ("KERBEROS".equals(HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_SERVER2_AUTHENTICATION))) {
props.setProperty("principal",
HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_SERVER2_KERBEROS_PRINCIPAL));
}
}
private void addHttp(Properties props) {
if ("http".equalsIgnoreCase(HiveConf.getVar(conf, ConfVars.HIVE_SERVER2_TRANSPORT_MODE))) {
props.setProperty("transportMode", "http");
} else {
return;
}
props.setProperty("httpPath", HiveConf.getVar(conf, ConfVars.HIVE_SERVER2_THRIFT_HTTP_PATH));
}
private void addHosts(Properties props) throws BeelineHS2ConnectionFileParseException {
// if zk HA is enabled get hosts property
if (HiveConf.getBoolVar(conf,
HiveConf.ConfVars.HIVE_SERVER2_SUPPORT_DYNAMIC_SERVICE_DISCOVERY)) {
addZKServiceDiscoveryHosts(props);
} else {
addDefaultHS2Hosts(props);
}
}
private void addZKServiceDiscoveryHosts(Properties props)
throws BeelineHS2ConnectionFileParseException {
props.setProperty("serviceDiscoveryMode", "zooKeeper");
props.setProperty("zooKeeperNamespace",
HiveConf.getVar(conf, ConfVars.HIVE_SERVER2_ZOOKEEPER_NAMESPACE));
props.setProperty("hosts", HiveConf.getVar(conf, ConfVars.HIVE_ZOOKEEPER_QUORUM));
}
private void addDefaultHS2Hosts(Properties props) throws BeelineHS2ConnectionFileParseException {
String hiveHost = System.getenv("HIVE_SERVER2_THRIFT_BIND_HOST");
if (hiveHost == null) {
hiveHost = HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_SERVER2_THRIFT_BIND_HOST);
}
InetAddress serverIPAddress;
try {
serverIPAddress = ServerUtils.getHostAddress(hiveHost);
} catch (UnknownHostException e) {
throw new BeelineHS2ConnectionFileParseException(e.getMessage(), e);
}
int portNum = getPortNum(
"http".equalsIgnoreCase(HiveConf.getVar(conf, ConfVars.HIVE_SERVER2_TRANSPORT_MODE)));
props.setProperty("hosts", serverIPAddress.getHostName() + ":" + portNum);
}
private int getPortNum(boolean isHttp) {
String portString;
int portNum;
if (isHttp) {
portString = System.getenv("HIVE_SERVER2_THRIFT_HTTP_PORT");
if (portString != null) {
portNum = Integer.parseInt(portString);
} else {
portNum = HiveConf.getIntVar(conf, ConfVars.HIVE_SERVER2_THRIFT_HTTP_PORT);
}
} else {
portString = System.getenv("HIVE_SERVER2_THRIFT_PORT");
if (portString != null) {
portNum = Integer.parseInt(portString);
} else {
portNum = HiveConf.getIntVar(conf, ConfVars.HIVE_SERVER2_THRIFT_PORT);
}
}
return portNum;
}
@Override
public boolean configExists() {
return (hiveSiteURI != null);
}
}