diff --git a/dev/dependencyList b/dev/dependencyList index 88e3e3c9f40..4143b511ace 100644 --- a/dev/dependencyList +++ b/dev/dependencyList @@ -105,7 +105,7 @@ jetty-server/9.4.52.v20230823//jetty-server-9.4.52.v20230823.jar jetty-servlet/9.4.52.v20230823//jetty-servlet-9.4.52.v20230823.jar jetty-util-ajax/9.4.52.v20230823//jetty-util-ajax-9.4.52.v20230823.jar jetty-util/9.4.52.v20230823//jetty-util-9.4.52.v20230823.jar -jline/0.9.94//jline-0.9.94.jar +jline/2.14.6//jline-2.14.6.jar jul-to-slf4j/1.7.36//jul-to-slf4j-1.7.36.jar kafka-clients/3.5.1//kafka-clients-3.5.1.jar kubernetes-client-api/6.8.1//kubernetes-client-api-6.8.1.jar diff --git a/docs/configuration/settings.md b/docs/configuration/settings.md index a5af4e18010..66b551166c0 100644 --- a/docs/configuration/settings.md +++ b/docs/configuration/settings.md @@ -230,11 +230,9 @@ You can configure the Kyuubi properties in `$KYUUBI_HOME/conf/kyuubi-defaults.co | Key | Default | Meaning | Type | Since | |--------------------------------------------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|-------| | kyuubi.frontend.advertised.host | <undefined> | Hostname or IP of the Kyuubi server's frontend services to publish to external systems such as the service discovery ensemble and metadata store. Use it when you want to advertise a different hostname or IP than the bind host. | string | 1.8.0 | -| kyuubi.frontend.backoff.slot.length | PT0.1S | (deprecated) Time to back off during login to the thrift frontend service. | duration | 1.0.0 | | kyuubi.frontend.bind.host | <undefined> | Hostname or IP of the machine on which to run the frontend services. | string | 1.0.0 | | kyuubi.frontend.bind.port | 10009 | (deprecated) Port of the machine on which to run the thrift frontend service via the binary protocol. | int | 1.0.0 | | kyuubi.frontend.connection.url.use.hostname | true | When true, frontend services prefer hostname, otherwise, ip address. Note that, the default value is set to `false` when engine running on Kubernetes to prevent potential network issues. | boolean | 1.5.0 | -| kyuubi.frontend.login.timeout | PT20S | (deprecated) Timeout for Thrift clients during login to the thrift frontend service. | duration | 1.0.0 | | kyuubi.frontend.max.message.size | 104857600 | (deprecated) Maximum message size in bytes a Kyuubi server will accept. | int | 1.0.0 | | kyuubi.frontend.max.worker.threads | 999 | (deprecated) Maximum number of threads in the frontend worker thread pool for the thrift frontend service | int | 1.0.0 | | kyuubi.frontend.min.worker.threads | 9 | (deprecated) Minimum number of threads in the frontend worker thread pool for the thrift frontend service | int | 1.0.0 | @@ -254,7 +252,6 @@ You can configure the Kyuubi properties in `$KYUUBI_HOME/conf/kyuubi-defaults.co | kyuubi.frontend.ssl.keystore.password | <undefined> | SSL certificate keystore password. | string | 1.7.0 | | kyuubi.frontend.ssl.keystore.path | <undefined> | SSL certificate keystore location. | string | 1.7.0 | | kyuubi.frontend.ssl.keystore.type | <undefined> | SSL certificate keystore type. | string | 1.7.0 | -| kyuubi.frontend.thrift.backoff.slot.length | PT0.1S | Time to back off during login to the thrift frontend service. | duration | 1.4.0 | | kyuubi.frontend.thrift.binary.bind.host | <undefined> | Hostname or IP of the machine on which to run the thrift frontend service via the binary protocol. | string | 1.4.0 | | kyuubi.frontend.thrift.binary.bind.port | 10009 | Port of the machine on which to run the thrift frontend service via the binary protocol. | int | 1.4.0 | | kyuubi.frontend.thrift.binary.ssl.disallowed.protocols | SSLv2,SSLv3 | SSL versions to disallow for Kyuubi thrift binary frontend. | set | 1.7.0 | @@ -278,7 +275,6 @@ You can configure the Kyuubi properties in `$KYUUBI_HOME/conf/kyuubi-defaults.co | kyuubi.frontend.thrift.http.ssl.protocol.blacklist | SSLv2,SSLv3 | SSL Versions to disable when using HTTP transport mode. | seq | 1.6.0 | | kyuubi.frontend.thrift.http.use.SSL | false | Set this to true for using SSL encryption in http mode. | boolean | 1.6.0 | | kyuubi.frontend.thrift.http.xsrf.filter.enabled | false | If enabled, Kyuubi will block any requests made to it over HTTP if an X-XSRF-HEADER header is not present | boolean | 1.6.0 | -| kyuubi.frontend.thrift.login.timeout | PT20S | Timeout for Thrift clients during login to the thrift frontend service. | duration | 1.4.0 | | kyuubi.frontend.thrift.max.message.size | 104857600 | Maximum message size in bytes a Kyuubi server will accept. | int | 1.4.0 | | kyuubi.frontend.thrift.max.worker.threads | 999 | Maximum number of threads in the frontend worker thread pool for the thrift frontend service | int | 1.4.0 | | kyuubi.frontend.thrift.min.worker.threads | 9 | Minimum number of threads in the frontend worker thread pool for the thrift frontend service | int | 1.4.0 | diff --git a/docs/deployment/migration-guide.md b/docs/deployment/migration-guide.md index 3b3541b7ea2..cbd74ee440e 100644 --- a/docs/deployment/migration-guide.md +++ b/docs/deployment/migration-guide.md @@ -23,6 +23,7 @@ * Since Kyuubi 1.9.0, the support of Derby is removal for Kyuubi metastore. * Since Kyuubi 1.9.0, the support of Spark SQL engine for Spark 3.1 is deprecated, and will be removed in the future. * Since Kyuubi 1.9.0, the support of Spark extensions for Spark 3.1 is removed, please use Spark 3.2 or higher versions. +* Since Kyuubi 1.9.0, `kyuubi.frontend.login.timeout`, `kyuubi.frontend.thrift.login.timeout`, `kyuubi.frontend.backoff.slot.length`, `kyuubi.frontend.thrift.backoff.slot.length` are removed. ## Upgrading from Kyuubi 1.8.0 to 1.8.1 diff --git a/kyuubi-common/pom.xml b/kyuubi-common/pom.xml index 63ac03ed7a0..c36eb2f4673 100644 --- a/kyuubi-common/pom.xml +++ b/kyuubi-common/pom.xml @@ -98,6 +98,11 @@ commons-lang3 + + org.apache.kyuubi + kyuubi-relocated-thrift + + org.apache.kyuubi kyuubi-relocated-hive-service-rpc diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala index 5346d19a20b..6baca63e578 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala @@ -605,34 +605,6 @@ object KyuubiConf { .version("1.4.0") .fallbackConf(FRONTEND_MAX_MESSAGE_SIZE) - @deprecated("using kyuubi.frontend.thrift.login.timeout instead", "1.4.0") - val FRONTEND_LOGIN_TIMEOUT: ConfigEntry[Long] = - buildConf("kyuubi.frontend.login.timeout") - .doc("(deprecated) Timeout for Thrift clients during login to the thrift frontend service.") - .version("1.0.0") - .timeConf - .createWithDefault(Duration.ofSeconds(20).toMillis) - - val FRONTEND_THRIFT_LOGIN_TIMEOUT: ConfigEntry[Long] = - buildConf("kyuubi.frontend.thrift.login.timeout") - .doc("Timeout for Thrift clients during login to the thrift frontend service.") - .version("1.4.0") - .fallbackConf(FRONTEND_LOGIN_TIMEOUT) - - @deprecated("using kyuubi.frontend.thrift.backoff.slot.length instead", "1.4.0") - val FRONTEND_LOGIN_BACKOFF_SLOT_LENGTH: ConfigEntry[Long] = - buildConf("kyuubi.frontend.backoff.slot.length") - .doc("(deprecated) Time to back off during login to the thrift frontend service.") - .version("1.0.0") - .timeConf - .createWithDefault(Duration.ofMillis(100).toMillis) - - val FRONTEND_THRIFT_LOGIN_BACKOFF_SLOT_LENGTH: ConfigEntry[Long] = - buildConf("kyuubi.frontend.thrift.backoff.slot.length") - .doc("Time to back off during login to the thrift frontend service.") - .version("1.4.0") - .fallbackConf(FRONTEND_LOGIN_BACKOFF_SLOT_LENGTH) - val FRONTEND_THRIFT_HTTP_REQUEST_HEADER_SIZE: ConfigEntry[Int] = buildConf("kyuubi.frontend.thrift.http.request.header.size") .doc("Request header size in bytes, when using HTTP transport mode. Jetty defaults used.") @@ -3144,14 +3116,6 @@ object KyuubiConf { FRONTEND_MAX_MESSAGE_SIZE.key, "1.4.0", s"Use ${FRONTEND_THRIFT_MAX_MESSAGE_SIZE.key} instead"), - DeprecatedConfig( - FRONTEND_LOGIN_TIMEOUT.key, - "1.4.0", - s"Use ${FRONTEND_THRIFT_LOGIN_TIMEOUT.key} instead"), - DeprecatedConfig( - FRONTEND_LOGIN_BACKOFF_SLOT_LENGTH.key, - "1.4.0", - s"Use ${FRONTEND_THRIFT_LOGIN_BACKOFF_SLOT_LENGTH.key} instead"), DeprecatedConfig( SESSION_TIMEOUT.key, "1.2.0", diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TBinaryFrontendService.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TBinaryFrontendService.scala index 19e2e31eafe..92b3a8a8107 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TBinaryFrontendService.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TBinaryFrontendService.scala @@ -101,17 +101,13 @@ abstract class TBinaryFrontendService(name: String) } _actualPort = tServerSocket.getServerSocket.getLocalPort val maxMessageSize = conf.get(FRONTEND_THRIFT_MAX_MESSAGE_SIZE) - val requestTimeout = conf.get(FRONTEND_THRIFT_LOGIN_TIMEOUT).toInt - val beBackoffSlotLength = conf.get(FRONTEND_THRIFT_LOGIN_BACKOFF_SLOT_LENGTH).toInt val args = new TThreadPoolServer.Args(tServerSocket) .processorFactory(tProcFactory) .transportFactory(transFactory) .protocolFactory(new TBinaryProtocol.Factory) .inputProtocolFactory( new TBinaryProtocol.Factory(true, true, maxMessageSize, maxMessageSize)) - .requestTimeout(requestTimeout).requestTimeoutUnit(TimeUnit.MILLISECONDS) - .beBackoffSlotLength(beBackoffSlotLength) - .beBackoffSlotLengthUnit(TimeUnit.MILLISECONDS) + // THRIFT-5297 (fixed in 0.14.0) removes requestTimeout and beBackoffSlotLength .executorService(executor) // TCP Server server = Some(new TThreadPoolServer(args)) diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala index 9aefe63c8b6..32e004505e8 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala @@ -649,5 +649,9 @@ private[kyuubi] object TFrontendService { } def getSessionHandle: SessionHandle = sessionHandle + + override def unwrap[T](aClass: Class[T]): T = null.asInstanceOf[T] + + override def isWrapperFor(aClass: Class[_]): Boolean = false } } diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/HadoopThriftAuthBridgeServer.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/HadoopThriftAuthBridgeServer.scala index 6c1dfa5daee..845767c8848 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/HadoopThriftAuthBridgeServer.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/HadoopThriftAuthBridgeServer.scala @@ -131,7 +131,7 @@ object HadoopThriftAuthBridgeServer { class TUGIAssumingProcessor( wrapped: TProcessor, secretMgr: KyuubiDelegationTokenManager) extends TProcessor with Logging { - override def process(in: TProtocol, out: TProtocol): Boolean = { + override def process(in: TProtocol, out: TProtocol): Unit = { val transport = in.getTransport transport match { case saslTrans: TSaslServerTransport => diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/TSetIpAddressProcessor.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/TSetIpAddressProcessor.scala index 6a890593642..3c632b8bf41 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/TSetIpAddressProcessor.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/authentication/TSetIpAddressProcessor.scala @@ -28,7 +28,7 @@ class TSetIpAddressProcessor[I <: Iface]( import TSetIpAddressProcessor._ @throws[TException] - override def process(in: TProtocol, out: TProtocol): Boolean = { + override def process(in: TProtocol, out: TProtocol): Unit = { setIpAddress(in) setUserName(in) try { diff --git a/kyuubi-hive-beeline/pom.xml b/kyuubi-hive-beeline/pom.xml index 1068a81ce18..77337adcdba 100644 --- a/kyuubi-hive-beeline/pom.xml +++ b/kyuubi-hive-beeline/pom.xml @@ -135,13 +135,6 @@ jline jline - ${hive.client.jline.version} - - - * - * - - diff --git a/kyuubi-hive-jdbc/pom.xml b/kyuubi-hive-jdbc/pom.xml index 1ec5e597fa0..2bc7f690b45 100644 --- a/kyuubi-hive-jdbc/pom.xml +++ b/kyuubi-hive-jdbc/pom.xml @@ -97,6 +97,11 @@ httpclient + + org.apache.kyuubi + kyuubi-relocated-thrift + + org.apache.kyuubi kyuubi-relocated-hive-service-rpc diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/KerberosSaslHelper.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/KerberosSaslHelper.java index e3fb6729365..bd0dfcdf831 100644 --- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/KerberosSaslHelper.java +++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/KerberosSaslHelper.java @@ -22,6 +22,7 @@ import javax.security.sasl.SaslException; import org.apache.kyuubi.shaded.thrift.transport.TSaslClientTransport; import org.apache.kyuubi.shaded.thrift.transport.TTransport; +import org.apache.kyuubi.shaded.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +35,7 @@ public static TTransport createSubjectAssumedTransport( String host, TTransport underlyingTransport, Map saslProps) - throws SaslException { + throws SaslException, TTransportException { String resolvedPrincipal = KerberosUtils.canonicalPrincipal(serverPrincipal, host); String[] names = KerberosUtils.splitPrincipal(resolvedPrincipal); TTransport saslTransport = diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/PlainSaslHelper.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/PlainSaslHelper.java index 43272e48da5..95aae29fd62 100644 --- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/PlainSaslHelper.java +++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/PlainSaslHelper.java @@ -22,11 +22,13 @@ import javax.security.sasl.SaslException; import org.apache.kyuubi.shaded.thrift.transport.TSaslClientTransport; import org.apache.kyuubi.shaded.thrift.transport.TTransport; +import org.apache.kyuubi.shaded.thrift.transport.TTransportException; public final class PlainSaslHelper { public static TTransport getPlainTransport( - String username, String password, TTransport underlyingTransport) throws SaslException { + String username, String password, TTransport underlyingTransport) + throws SaslException, TTransportException { return new TSaslClientTransport( "PLAIN", null, diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/TFilterTransport.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/TFilterTransport.java index 6d462717b89..f3691e8cfb5 100644 --- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/TFilterTransport.java +++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/TFilterTransport.java @@ -17,6 +17,7 @@ package org.apache.kyuubi.jdbc.hive.auth; +import org.apache.kyuubi.shaded.thrift.TConfiguration; import org.apache.kyuubi.shaded.thrift.transport.TTransport; import org.apache.kyuubi.shaded.thrift.transport.TTransportException; @@ -95,4 +96,19 @@ public int getBytesRemainingInBuffer() { public void consumeBuffer(int len) { wrapped.consumeBuffer(len); } + + @Override + public TConfiguration getConfiguration() { + return wrapped.getConfiguration(); + } + + @Override + public void updateKnownMessageSize(long l) throws TTransportException { + wrapped.updateKnownMessageSize(l); + } + + @Override + public void checkReadBytesAvailable(long l) throws TTransportException { + wrapped.checkReadBytesAvailable(l); + } } diff --git a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/ThriftUtils.java b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/ThriftUtils.java index b76401d50ce..7f0099b299d 100644 --- a/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/ThriftUtils.java +++ b/kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/auth/ThriftUtils.java @@ -19,6 +19,7 @@ import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocket; +import org.apache.kyuubi.shaded.thrift.TConfiguration; import org.apache.kyuubi.shaded.thrift.transport.TSSLTransportFactory; import org.apache.kyuubi.shaded.thrift.transport.TSocket; import org.apache.kyuubi.shaded.thrift.transport.TTransport; @@ -30,8 +31,8 @@ */ public class ThriftUtils { public static TTransport getSocketTransport( - String host, int port, int connectTimeout, int socketTimeout) { - return new TSocket(host, port, socketTimeout, connectTimeout); + String host, int port, int connectTimeout, int socketTimeout) throws TTransportException { + return new TSocket(TConfiguration.DEFAULT, host, port, socketTimeout, connectTimeout); } public static TTransport getSSLSocket( diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/client/KyuubiSyncThriftClient.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/client/KyuubiSyncThriftClient.scala index d24387341e6..755e55d6d3f 100644 --- a/kyuubi-server/src/main/scala/org/apache/kyuubi/client/KyuubiSyncThriftClient.scala +++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/client/KyuubiSyncThriftClient.scala @@ -36,6 +36,7 @@ import org.apache.kyuubi.operation.FetchOrientation.FetchOrientation import org.apache.kyuubi.service.authentication.PlainSASLHelper import org.apache.kyuubi.session.SessionHandle import org.apache.kyuubi.shaded.hive.service.rpc.thrift._ +import org.apache.kyuubi.shaded.thrift.TConfiguration import org.apache.kyuubi.shaded.thrift.protocol.{TBinaryProtocol, TProtocol} import org.apache.kyuubi.shaded.thrift.transport.TSocket import org.apache.kyuubi.util.{ThreadUtils, ThriftUtils} @@ -457,7 +458,7 @@ private[kyuubi] object KyuubiSyncThriftClient extends Logging { port: Int, socketTimeout: Int, connectionTimeout: Int): TProtocol = { - val tSocket = new TSocket(host, port, socketTimeout, connectionTimeout) + val tSocket = new TSocket(TConfiguration.DEFAULT, host, port, socketTimeout, connectionTimeout) val tTransport = PlainSASLHelper.getPlainTransport(user, passwd, tSocket) tTransport.open() new TBinaryProtocol(tTransport) diff --git a/kyuubi-server/src/test/scala/org/apache/kyuubi/operation/KyuubiOperationPerConnectionSuite.scala b/kyuubi-server/src/test/scala/org/apache/kyuubi/operation/KyuubiOperationPerConnectionSuite.scala index 1324c70d775..859ccac984c 100644 --- a/kyuubi-server/src/test/scala/org/apache/kyuubi/operation/KyuubiOperationPerConnectionSuite.scala +++ b/kyuubi-server/src/test/scala/org/apache/kyuubi/operation/KyuubiOperationPerConnectionSuite.scala @@ -80,7 +80,9 @@ class KyuubiOperationPerConnectionSuite extends WithKyuubiServer with HiveJDBCTe assert(executeStmtResp.getOperationHandle === null) val errMsg = executeStmtResp.getStatus.getErrorMessage assert(errMsg.contains("Caused by: java.net.SocketException: Connection reset") || - errMsg.contains(s"Socket for ${SessionHandle(handle)} is closed")) + errMsg.contains(s"Socket for ${SessionHandle(handle)} is closed") || + errMsg.contains("Socket is closed by peer") || + errMsg.contains("SparkContext was shut down")) } } @@ -332,9 +334,10 @@ class KyuubiOperationPerConnectionSuite extends WithKyuubiServer with HiveJDBCTe assert(executeStmtResp.getStatus.getStatusCode === TStatusCode.ERROR_STATUS) val errorMsg = executeStmtResp.getStatus.getErrorMessage assert(errorMsg.contains("java.net.SocketException") || - errorMsg.contains("org.apache.thrift.transport.TTransportException") || + errorMsg.contains("org.apache.kyuubi.shaded.thrift.transport.TTransportException") || errorMsg.contains("connection does not exist") || - errorMsg.contains(s"Socket for ${SessionHandle(handle)} is closed")) + errorMsg.contains(s"Socket for ${SessionHandle(handle)} is closed") || + errorMsg.contains("Error submitting query in background, query rejected")) val elapsedTime = System.currentTimeMillis() - startTime assert(elapsedTime < 20 * 1000) eventually(timeout(3.seconds)) { diff --git a/pom.xml b/pom.xml index b70d5310acb..8f3c0baaf20 100644 --- a/pom.xml +++ b/pom.xml @@ -169,11 +169,11 @@ 2.39.1 0.7.7 9.4.52.v20230823 - 0.9.94 + 2.14.6 4.13.2 3.5.1 6.8.1 - 0.2.0 + 0.3.0 kyuubi-relocated-zookeeper-34 6.0.5 2.20.0 @@ -223,7 +223,6 @@ v8.6.1 - 2.12 2.2.0 kyuubi-hive-jdbc @@ -279,6 +278,11 @@ + + org.apache.kyuubi + kyuubi-relocated-thrift + ${kyuubi-relocated.version} + org.apache.kyuubi kyuubi-relocated-hive-service-rpc