【发布时间】:2017-03-01 08:37:17
【问题描述】:
TL;DR: Hive 和 MySql JDBC 一起使用会不会有问题?
我正在开发一个应用程序,该应用程序使用 MySql JDBC 驱动程序执行多个 SQL 查询,然后它还使用 Hive JDBC 发送另一个 Hive 查询。
现在发生的事情是 MySql 查询正常工作,当代码尝试执行 Hive 查询时,它会抛出此异常:
com.mysql.cj.core.exceptions.WrongArgumentException: Connector/J cannot handle a database URL of type 'jdbc:hive2:'.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
at com.mysql.cj.core.conf.url.ConnectionUrl$Type.fromValue(ConnectionUrl.java:149)
at com.mysql.cj.core.conf.url.ConnectionUrl.getConnectionUrlInstance(ConnectionUrl.java:193)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:195)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at company.services.HiveV2Provider.createConnection(HiveProvider.scala:105)
at company.services.HiveProvider$class.loanConnection(HiveProvider.scala:66)
现在抛出此异常后,查询将正确执行。
我的猜测是,由于我同时加载了 MySql 和 Hive 驱动程序,MySql 驱动程序首先尝试运行此查询,但是当它遇到 Hive URL 时会抛出此异常,然后 Hive 驱动程序会看到它并执行正确查询
这就是我执行 MySql 代码的方式:
val query = ... // query is created here
var mysqlConn: Connection = null
var stmt: Statement = null
try {
Class.forName("com.mysql.jdbc.Driver")
mysqlConn = DriverManager.getConnection(mysqlAddress, username, password)
stmt = mysqlConn.createStatement()
val rs = stmt.executeQuery(query)
val returnVal = someResultSetHandlingFunction(rs)
rs.close()
returnVal
} catch {
case NonFatal(e) =>
logWarning(s"Failed to execute query on: $mysqlAddress", e)
throw e
} finally {
if (mysqlConn != null) {
mysqlConn.close()
}
}
我的 Hive 代码看起来相同,只是驱动程序名称为:org.apache.hive.jdbc.HiveDriver(它与 jdbc:hive2://someurl 通信)
版本:
- Hive 是 hive-jdbc-1.1.0-cdh5.7.1
- MySql 是 mysql-connector-java 6.0.4
有人知道是否有任何方法可以避免收到此异常吗?加载 2 个不同的 JDBC 驱动程序是否有问题?阅读其他一些类似的问题,我觉得这应该不是问题
只是一些澄清:
- 我知道直接使用 JDBC 可能不是最好的方法,但我正在检查一些东西,JDBC 适合这项任务
- 我正在使用 Scala,但我认为这对于这个问题并不重要
提前致谢
【问题讨论】: