From 3135fb78a4aeb1dee8caae3ddc95e4f28fdf7efb Mon Sep 17 00:00:00 2001 From: Cheng Pan Date: Wed, 31 Jan 2024 21:09:36 +0800 Subject: [PATCH] [KYUUBI #6036] JDBC driver conditional sets fetchSize on opening session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # :mag: Description ## Issue References ๐Ÿ”— I get reported by a user that using Kyuubi JDBC driver 1.8.0 to access Spark Thrift Server 2.4 (with Hive 1.2.1) with getting an error on opening the session even with `clientProtocol=7` ``` org.apache.hive.service.cli.HiveSQLException: java.lang.IllegalArgumentException: hive configuration hive.server2.thrift.resultset.default.fetch.size does not exists. at org.apache.hive.service.cli.session.HiveSessionImpl.configureSession(HiveSessionImpl.java:220) at org.apache.hive.service.cli.session.HiveSessionImpl.open(HiveSessionImpl.java:154) at org.apache.hive.service.cli.session.SessionManager.openSession(SessionManager.java:258) ... 13 more ``` ## Describe Your Solution ๐Ÿ”ง When `hive.conf.validation` is `true` (it also is the default value), an IllegalArgumentException will be thrown if the provided configurations start with `hive.` and can not be recognized by the server. One solution is to disable `hive.conf.validation` on the server side, but we can also address it by avoiding passing this configuration if we know that the server does not support it. HIVE-14901 (2.3.0, HIVE_CLI_SERVICE_PROTOCOL_V10) introduces `hive.server2.thrift.resultset.default.fetch.size`, so we can set this configuration only when protocol >= HIVE_CLI_SERVICE_PROTOCOL_V10 ## Types of changes :bookmark: - [ ] Bugfix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) ## Test Plan ๐Ÿงช Verified locally by connecting to HS2 2.1.1 and HS2 2.3.9 #### Behavior Without This Pull Request :coffin: IllegalArgumentException throws when using `jdbc:hive2://localhost:10000/default;clientProtocol=8` to connect HS2 2.1.1 Everything is OK when using `jdbc:hive2://localhost:10000/default` to connect HS2 2.3.9 #### Behavior With This Pull Request :tada: Everything is OK when using `jdbc:hive2://localhost:10000/default;clientProtocol=8` to connect HS2 2.1.1 Everything is OK when using `jdbc:hive2://localhost:10000/default` to connect HS2 2.3.9 --- # Checklist ๐Ÿ“ - [x] This patch was not authored or co-authored using [Generative Tooling](https://www.apache.org/legal/generative-tooling.html) **Be nice. Be informative.** Closes #6036 from pan3793/jdbc-fetchsize. Closes #6036 7ea91f12c [Cheng Pan] nit e6ea8291f [Cheng Pan] fix 1dbecbb48 [Cheng Pan] JDBC driver conditional sets fetchSize on opening session Authored-by: Cheng Pan Signed-off-by: Cheng Pan (cherry picked from commit 4bd259afd84460edea1955c9b217ab31859e93a9) Signed-off-by: Cheng Pan --- .../org/apache/kyuubi/jdbc/hive/KyuubiConnection.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 4d95ee0179b..054ae4fab4d 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 @@ -719,10 +719,6 @@ private void openSession() throws SQLException { } // switch the database openConf.put("use:database", connParams.getDbName()); - // set the fetchSize - openConf.put( - "set:hiveconf:hive.server2.thrift.resultset.default.fetch.size", - Integer.toString(fetchSize)); if (wmPool != null) { openConf.put("set:hivevar:wmpool", wmPool); } @@ -747,6 +743,12 @@ private void openSession() throws SQLException { clientProtocolStr, CLIENT_PROTOCOL_VERSION)); } openReq.setClient_protocol(clientProtocol); + // HIVE-14901: set the fetchSize + if (clientProtocol.compareTo(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V10) >= 0) { + openConf.put( + "set:hiveconf:hive.server2.thrift.resultset.default.fetch.size", + Integer.toString(fetchSize)); + } try { openConf.put("kyuubi.client.ipAddress", InetAddress.getLocalHost().getHostAddress()); } catch (UnknownHostException e) {