diff --git a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java index 5aad29fd789..706fce467aa 100644 --- a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java +++ b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiBeeLine.java @@ -60,7 +60,9 @@ public class KyuubiBeeLine extends BeeLine { private static final int ERRNO_OTHER = 2; private static final String PYTHON_MODE_PREFIX = "--python-mode"; + private static final String IGNORE_LAUNCH_ENGINE_PREFIX = "--ignore-launch-engine"; private boolean pythonMode = false; + private boolean ignoreLaunchEngine = false; public KyuubiBeeLine() { this(true); @@ -90,6 +92,8 @@ void usage() { super.usage(); output("Usage: java " + KyuubiBeeLine.class.getCanonicalName()); output(" --python-mode Execute python code/script."); + output("Usage: java " + KyuubiBeeLine.class.getCanonicalName()); + output(" --ignore-launch-engine Ignore launch engine log."); } public boolean isPythonMode() { @@ -101,6 +105,15 @@ public void setPythonMode(boolean pythonMode) { this.pythonMode = pythonMode; } + public boolean isIgnoreLaunchEngine() { + return ignoreLaunchEngine; + } + + // Visible for testing + public void setIgnoreLaunchEngine(boolean ignoreLaunchEngine) { + this.ignoreLaunchEngine = ignoreLaunchEngine; + } + /** Starts the program. */ public static void main(String[] args) throws IOException { mainWithInputRedirection(args, null); @@ -169,6 +182,8 @@ int initArgs(String[] args) { protected void processOption(String arg, ListIterator iter) throws ParseException { if (PYTHON_MODE_PREFIX.equals(arg)) { pythonMode = true; + } else if (IGNORE_LAUNCH_ENGINE_PREFIX.equals(arg)) { + ignoreLaunchEngine = true; } else { super.processOption(arg, iter); } @@ -176,6 +191,10 @@ protected void processOption(String arg, ListIterator iter) throws ParseExceptio }; cl = beelineParser.parse(options, args); + if (getOpts().getVerbose()) { + ignoreLaunchEngine = false; + } + connSuccessful = DynMethods.builder("connectUsingArgs") .hiddenImpl(BeeLine.class, BeelineParser.class, CommandLine.class) diff --git a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiCommands.java b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiCommands.java index fcfee49edb0..d98a8b1343c 100644 --- a/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiCommands.java +++ b/kyuubi-hive-beeline/src/main/java/org/apache/hive/beeline/KyuubiCommands.java @@ -18,6 +18,7 @@ package org.apache.hive.beeline; import static org.apache.kyuubi.jdbc.hive.JdbcConnectionParams.*; +import static org.apache.kyuubi.jdbc.hive.KyuubiConnection.IGNORE_LAUNCH_ENGINE_PROPERTY; import com.google.common.annotations.VisibleForTesting; import java.io.*; @@ -450,6 +451,10 @@ public boolean connect(Properties props) throws IOException { AUTH_PASSWD, "javax.jdo.option.ConnectionPassword", "ConnectionPassword", }); + if (beeLine.isIgnoreLaunchEngine()) { + props.put(IGNORE_LAUNCH_ENGINE_PROPERTY, "true"); + } + if (url == null || url.length() == 0) { return beeLine.error("Property \"url\" is required"); } diff --git a/kyuubi-hive-beeline/src/test/java/org/apache/hive/beeline/KyuubiBeeLineTest.java b/kyuubi-hive-beeline/src/test/java/org/apache/hive/beeline/KyuubiBeeLineTest.java index 9c7aec35a42..9cdc3340c32 100644 --- a/kyuubi-hive-beeline/src/test/java/org/apache/hive/beeline/KyuubiBeeLineTest.java +++ b/kyuubi-hive-beeline/src/test/java/org/apache/hive/beeline/KyuubiBeeLineTest.java @@ -19,6 +19,7 @@ package org.apache.hive.beeline; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.IOException; @@ -88,6 +89,32 @@ public void testKyuubiBeeLinePythonMode() { kyuubiBeeLine.setPythonMode(false); } + @Test + public void testKyuubiBeelineIgnoreLaunchEngine() { + KyuubiBeeLine kyuubiBeeLine = new KyuubiBeeLine(); + String[] args1 = {"-u", "badUrl", "--ignore-launch-engine"}; + kyuubiBeeLine.initArgs(args1); + assertTrue(kyuubiBeeLine.isIgnoreLaunchEngine()); + kyuubiBeeLine.setIgnoreLaunchEngine(false); + + String[] args2 = {"--ignore-launch-engine", "-f", "test.sql"}; + kyuubiBeeLine.initArgs(args2); + assertTrue(kyuubiBeeLine.isIgnoreLaunchEngine()); + assert kyuubiBeeLine.getOpts().getScriptFile().equals("test.sql"); + kyuubiBeeLine.setIgnoreLaunchEngine(false); + + String[] args3 = {"-u", "badUrl"}; + kyuubiBeeLine.initArgs(args3); + assertFalse(kyuubiBeeLine.isIgnoreLaunchEngine()); + kyuubiBeeLine.setIgnoreLaunchEngine(false); + + String[] args4 = {"--ignore-launch-engine", "--verbose", "-f", "test.sql"}; + kyuubiBeeLine.initArgs(args4); + assertFalse(kyuubiBeeLine.isIgnoreLaunchEngine()); + assert kyuubiBeeLine.getOpts().getScriptFile().equals("test.sql"); + kyuubiBeeLine.setIgnoreLaunchEngine(false); + } + @Test public void testKyuubiBeelineComment() { KyuubiBeeLine kyuubiBeeLine = new KyuubiBeeLine(); diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java index 87872581c9c..46b41777b9c 100644 --- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java +++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/KyuubiConnection.java @@ -78,6 +78,7 @@ public class KyuubiConnection implements SQLConnection, KyuubiLoggable { public static final Logger LOG = LoggerFactory.getLogger(KyuubiConnection.class.getName()); public static final String BEELINE_MODE_PROPERTY = "BEELINE_MODE"; + public static final String IGNORE_LAUNCH_ENGINE_PROPERTY = "IGNORE_LAUNCH_ENGINE_LOG"; public static final String HS2_PROXY_USER = "hive.server2.proxy.user"; public static int DEFAULT_ENGINE_LOG_THREAD_TIMEOUT = 10 * 1000; @@ -112,6 +113,8 @@ public class KyuubiConnection implements SQLConnection, KyuubiLoggable { private boolean isBeeLineMode; + private boolean ignoreLaunchEngineLog; + /** Get all direct HiveServer2 URLs from a ZooKeeper based HiveServer2 URL */ public static List getAllUrls(String zookeeperBasedHS2Url) throws Exception { @@ -127,6 +130,7 @@ public static List getAllUrls(String zookeeperBasedHS2Url) public KyuubiConnection(String uri, Properties info) throws SQLException { isBeeLineMode = Boolean.parseBoolean(info.getProperty(BEELINE_MODE_PROPERTY)); + ignoreLaunchEngineLog = Boolean.parseBoolean(info.getProperty(IGNORE_LAUNCH_ENGINE_PROPERTY)); try { connParams = Utils.parseURL(uri, info); } catch (ZooKeeperHiveClientException e) { @@ -262,7 +266,7 @@ public List getExecLog() throws SQLException, ClosedOrCancelledException "Method getExecLog() failed. The " + "connection has been closed."); } - if (launchEngineOpHandle == null) { + if (launchEngineOpHandle == null || ignoreLaunchEngineLog) { return Collections.emptyList(); } @@ -285,7 +289,7 @@ public List getExecLog() throws SQLException, ClosedOrCancelledException } private void showLaunchEngineLog() { - if (launchEngineOpHandle != null) { + if (launchEngineOpHandle != null && !ignoreLaunchEngineLog) { LOG.info("Starting to get launch engine log."); engineLogThread = new Thread("engine-launch-log") {