diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java index 73e4734..1311d2d 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java @@ -20,6 +20,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.common.auth.HiveAuthUtils; +import org.apache.hadoop.hive.shims.ShimLoader; import org.apache.hive.jdbc.Utils.JdbcConnectionParams; import org.apache.hive.service.auth.HiveAuthConstants; import org.apache.hive.service.auth.KerberosSaslHelper; @@ -148,7 +149,7 @@ public HiveConnection(String uri, Properties info) throws SQLException { // sess_var_list -> sessConfMap // hive_conf_list -> hiveConfMap // hive_var_list -> hiveVarMap - host = connParams.getHost(); + host = ShimLoader.getHadoopThriftAuthBridge().getCanonicalHostName(connParams.getHost()); port = connParams.getPort(); sessConfMap = connParams.getSessionVars(); isEmbeddedMode = connParams.isEmbeddedMode(); @@ -213,7 +214,7 @@ public HiveConnection(String uri, Properties info) throws SQLException { } // Update with new values jdbcUriString = connParams.getJdbcUriString(); - host = connParams.getHost(); + host = ShimLoader.getHadoopThriftAuthBridge().getCanonicalHostName(connParams.getHost()); port = connParams.getPort(); } else { errMsg = warnMsg; diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index 24fc1f6..ef624ff 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -190,7 +190,15 @@ public HiveMetaStoreClient(HiveConf conf, HiveMetaHookLoader hookLoader, Boolean throw new IllegalArgumentException("URI: " + s + " does not have a scheme"); } - metastoreUris[i++] = tmpUri; + metastoreUris[i++] = new URI( + tmpUri.getScheme(), + tmpUri.getUserInfo(), + ShimLoader.getHadoopThriftAuthBridge().getCanonicalHostName(tmpUri.getHost()), + tmpUri.getPort(), + tmpUri.getPath(), + tmpUri.getQuery(), + tmpUri.getFragment() + ); } // make metastore URIS random diff --git a/shims/common/src/main/java/org/apache/hadoop/hive/thrift/HadoopThriftAuthBridge.java b/shims/common/src/main/java/org/apache/hadoop/hive/thrift/HadoopThriftAuthBridge.java index fd86fed..6c8b362 100644 --- a/shims/common/src/main/java/org/apache/hadoop/hive/thrift/HadoopThriftAuthBridge.java +++ b/shims/common/src/main/java/org/apache/hadoop/hive/thrift/HadoopThriftAuthBridge.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.net.InetAddress; import java.net.Socket; +import java.net.UnknownHostException; import java.security.PrivilegedAction; import java.security.PrivilegedExceptionAction; import java.util.Locale; @@ -114,6 +115,21 @@ public String getServerPrincipal(String principalConfig, String host) return serverPrincipal; } + /** + * Method to get canonical-ized hostname, given a hostname (possibly a CNAME). + * This should allow for service-principals to use simplified CNAMEs. + * @param hostName The hostname to be canonical-ized. + * @return Given a CNAME, the canonical-ized hostname is returned. If not found, the original hostname is returned. + */ + public String getCanonicalHostName(String hostName) { + try { + return InetAddress.getByName(hostName).getCanonicalHostName(); + } + catch(UnknownHostException exception) { + LOG.warn("Could not retrieve canonical hostname for " + hostName, exception); + return hostName; + } + } public UserGroupInformation getCurrentUGIWithConf(String authMethod) throws IOException {