diff --git a/beeline/src/java/org/apache/hive/beeline/BeeLine.java b/beeline/src/java/org/apache/hive/beeline/BeeLine.java index 855e8d9bd7..44e02555f3 100644 --- a/beeline/src/java/org/apache/hive/beeline/BeeLine.java +++ b/beeline/src/java/org/apache/hive/beeline/BeeLine.java @@ -65,6 +65,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; import java.util.ResourceBundle; import java.util.ServiceLoader; @@ -94,6 +95,7 @@ import org.apache.hive.beeline.hs2connection.HiveSiteHS2ConnectionFileParser; import org.apache.hive.beeline.hs2connection.UserHS2ConnectionFileParser; import org.apache.hive.common.util.ShutdownHookManager; +import org.apache.hive.jdbc.HiveConnection; import org.apache.hive.jdbc.JdbcUriParseException; import org.apache.hive.jdbc.Utils; import org.apache.hive.jdbc.Utils.JdbcConnectionParams; @@ -389,6 +391,12 @@ .withLongOpt("help") .withDescription("Display this message") .create('h')); + + // -getUrlsFromBeelineSite + options.addOption(OptionBuilder + .withLongOpt("getUrlsFromBeelineSite") + .withDescription("Print all urls from beeline-site.xml, if it is present in the classpath") + .create()); // Substitution option --hivevar options.addOption(OptionBuilder @@ -712,7 +720,7 @@ private void processBeeLineOpt(final String arg) { private boolean isBeeLineOpt(String arg) { return arg.startsWith("--") && !(HIVE_VAR_PREFIX.equals(arg) || (HIVE_CONF_PREFIX.equals(arg)) - || "--help".equals(arg) || PROP_FILE_PREFIX.equals(arg)); + || "--help".equals(arg) || PROP_FILE_PREFIX.equals(arg) || "--getUrlsFromBeelineSite".equals(arg)); } } @@ -843,6 +851,12 @@ private boolean connectUsingArgs(BeelineParser beelineParser, CommandLine cl) { getOpts().setHelpAsked(true); return true; } + + if (cl.hasOption("getUrlsFromBeelineSite")) { + printBeelineSiteUrls(); + getOpts().setBeelineSiteUrlsAsked(true); + return true; + } Properties hiveVars = cl.getOptionProperties("hivevar"); for (String key : hiveVars.stringPropertyNames()) { @@ -919,6 +933,44 @@ private boolean connectUsingArgs(BeelineParser beelineParser, CommandLine cl) { return false; } + private void printBeelineSiteUrls() { + BeelineSiteParser beelineSiteParser = getUserBeelineSiteParser(); + if (!beelineSiteParser.configExists()) { + output("No beeline-site.xml in the path", true); + } + if (beelineSiteParser.configExists()) { + // Get the named url from user specific config file if present + try { + Properties userNamedConnectionURLs = beelineSiteParser.getConnectionProperties(); + userNamedConnectionURLs.remove(BeelineSiteParser.DEFAULT_NAMED_JDBC_URL_PROPERTY_KEY); + StringBuilder sb = new StringBuilder("urls: "); + for (Entry entry : userNamedConnectionURLs.entrySet()) { + String urlFromBeelineSite = (String) entry.getValue(); + if (isZkBasedUrl(urlFromBeelineSite)) { + List jdbcUrls = HiveConnection.getAllUrlStrings(urlFromBeelineSite); + for (String jdbcUrl : jdbcUrls) { + sb.append(jdbcUrl + ", "); + } + } else { + sb.append(urlFromBeelineSite + ", "); + } + } + output(sb.toString(), true); + } catch (Exception e) { + output(e.getMessage(), true); + return; + } + } + } + + private boolean isZkBasedUrl(String urlFromBeelineSite) { + String zkJdbcUriParam = ("serviceDiscoveryMode=zooKeeper").toLowerCase(); + if (urlFromBeelineSite.toLowerCase().contains(zkJdbcUriParam)) { + return true; + } + return false; + } + private void setHiveConfVar(String key, String val) { getOpts().getHiveConfVariables().put(key, val); if (HiveConf.ConfVars.HIVE_EXECUTION_ENGINE.varname.equals(key) && "mr".equals(val)) { @@ -1060,6 +1112,9 @@ public int begin(String[] args, InputStream inputStream) throws IOException { if (getOpts().isHelpAsked()) { return 0; } + if (getOpts().isBeelineSiteUrlsAsked()) { + return 0; + } if (getOpts().getScriptFile() != null) { return executeFile(getOpts().getScriptFile()); } diff --git a/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java b/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java index 7775a88041..bae1e50322 100644 --- a/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java +++ b/beeline/src/java/org/apache/hive/beeline/BeeLineOpts.java @@ -114,6 +114,7 @@ private Map hiveVariables = new HashMap(); private Map hiveConfVariables = new HashMap(); private boolean helpAsked; + private boolean beelineSiteUrlsAsked; private String lastConnectedUrl = null; @@ -679,7 +680,16 @@ public void setHelpAsked(boolean helpAsked) { public boolean isHelpAsked() { return helpAsked; } + + public void setBeelineSiteUrlsAsked(boolean beelineSiteUrlsAsked) { + this.beelineSiteUrlsAsked = beelineSiteUrlsAsked; + } + + public boolean isBeelineSiteUrlsAsked() { + return beelineSiteUrlsAsked; + } + public String getLastConnectedUrl(){ return lastConnectedUrl; } diff --git a/beeline/src/main/resources/BeeLine.properties b/beeline/src/main/resources/BeeLine.properties index c41b3ed637..b1a6b8ad9f 100644 --- a/beeline/src/main/resources/BeeLine.properties +++ b/beeline/src/main/resources/BeeLine.properties @@ -211,6 +211,7 @@ cmd-usage: Usage: java org.apache.hive.cli.beeline.BeeLine \n \ \ --delimiter=DELIMITER set the query delimiter; multi-char delimiters are allowed, but quotation\n \ \ marks, slashes, and -- are not allowed; defaults to ;\n \ \ --convertBinaryArrayToString=[true/false] display binary column data as string or as byte array \n \ +\ --getUrlsFromBeelineSite Print all urls from beeline-site.xml, if it is present in the classpath\n \ \ --help display this message\n \ \n \ \ Example:\n \ diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java index 458158e91b..738450f80e 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java @@ -157,6 +157,79 @@ } return ZooKeeperHiveClientHelper.getDirectParamsList(params); } + + public static List getAllUrlStrings(String zookeeperBasedHS2Url) throws Exception { + List jdbcUrls = new ArrayList<>(); + List allConnectionParams = getAllUrls(zookeeperBasedHS2Url); + for (JdbcConnectionParams cp : allConnectionParams) { + String jdbcUrl = makeDirectJDBCUrlFromConnectionParams(cp); + if ((jdbcUrl != null) && (!jdbcUrl.isEmpty())) { + jdbcUrls.add(jdbcUrl); + } + } + return jdbcUrls; + } + + private static String makeDirectJDBCUrlFromConnectionParams(JdbcConnectionParams cp) { + // Direct JDBC Url format: + // jdbc:hive2://:/dbName;sess_var_list?hive_conf_list#hive_var_list + StringBuilder url = new StringBuilder(""); + if (cp != null) { + if (cp.getHost() != null) { + url.append(cp.getHost()); + url.append(":"); + url.append(cp.getPort()); + url.append("/"); + url.append(cp.getDbName()); + // Add session vars + if ((cp.getSessionVars() != null) && (!cp.getSessionVars().isEmpty())) { + for (Entry sessVar : cp.getSessionVars().entrySet()) { + if ((sessVar.getKey().equalsIgnoreCase(JdbcConnectionParams.SERVICE_DISCOVERY_MODE)) + || (sessVar.getKey().equalsIgnoreCase(JdbcConnectionParams.ZOOKEEPER_NAMESPACE))) { + continue; + } + url.append(";"); + url.append(sessVar.getKey()); + url.append("="); + url.append(sessVar.getValue()); + } + } + // Add hive confs + if ((cp.getHiveConfs() != null) && (!cp.getHiveConfs().isEmpty())) { + url.append("?"); + boolean firstKV = true; + for (Entry hiveConf : cp.getHiveConfs().entrySet()) { + if (!firstKV) { + url.append(";"); + } else { + firstKV = false; + } + url.append(hiveConf.getKey()); + url.append("="); + url.append(hiveConf.getValue()); + } + } + // Add hive vars + if ((cp.getHiveVars() != null) && (!cp.getHiveVars().isEmpty())) { + url.append("#"); + boolean firstKV = true; + for (Entry hiveVar : cp.getHiveVars().entrySet()) { + if (!firstKV) { + url.append(";"); + } else { + firstKV = false; + } + url.append(hiveVar.getKey()); + url.append("="); + url.append(hiveVar.getValue()); + } + } + } else { + return url.toString(); + } + } + return url.toString(); + } public HiveConnection(String uri, Properties info) throws SQLException { setupLoginTimeout(); diff --git a/jdbc/src/java/org/apache/hive/jdbc/Utils.java b/jdbc/src/java/org/apache/hive/jdbc/Utils.java index 42b3975975..852942e6a2 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/Utils.java +++ b/jdbc/src/java/org/apache/hive/jdbc/Utils.java @@ -114,7 +114,7 @@ // Use ZooKeeper for indirection while using dynamic service discovery public static final String SERVICE_DISCOVERY_MODE_ZOOKEEPER = "zooKeeper"; public static final String SERVICE_DISCOVERY_MODE_ZOOKEEPER_HA = "zooKeeperHA"; - static final String ZOOKEEPER_NAMESPACE = "zooKeeperNamespace"; + public static final String ZOOKEEPER_NAMESPACE = "zooKeeperNamespace"; // Default namespace value on ZooKeeper. // This value is used if the param "zooKeeperNamespace" is not specified in the JDBC Uri. static final String ZOOKEEPER_DEFAULT_NAMESPACE = "hiveserver2";