我正在尝试将 Impala/Hive2 JDBC 驱动程序添加到使用 Tomcat 7 (7.0.54) 部署的现有应用程序中。其他 JDBC 驱动程序工作正常(Oracle、MS SS、SyBase)。
但是,驱动程序从不连接并且总是抛出不会被 Eclipse (Kepler) 中的 Java (JDK 1.7.0_55) 捕获的异常。这是在 Windows 8.1 Lenovo T500 笔记本电脑上完成的。没有有意义的错误消息或堆栈跟踪。
为了找出错误发生的位置,我获取了 Hive 源代码并制作了一个简单的 Java 程序来测试在 DEBUG 中单步执行的 JDBC 连接。没有在 jar 中的缺失类的引用错误比Clouder 的文档中指定的要少。HiveConnection.java (org.apache.hive.jdbc) 中存在以下错误:
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.http.impl.client.DefaultHttpClient;
我追踪了这些类存在的位置,并将以下 jar 添加到我制作的 UserLibrary 中:
hive-exec-0.12.0.jar which contains the packages for ....hive.ql.....
httpclient-4.2.5.jar which contains the packages for ....http.impl.client....
添加后httpclient
,仍然存在引用错误
httpClient.addRequestInterceptor - message = The type org.apache.http.HttpRequestInterceptor cannot be resolved. It is indirectly referenced from required .class files
我跟踪到: httpcore-4.2.4.jar
独立 Java 程序成功连接到 Impala 守护程序。我将这些 jar 与 JDBC 包一起作为 Java 源代码添加到 Tomcat /WEB-INF/ib/ 文件夹中。Tomcat 遇到了一些问题,包括无法发布 IndexOutOfBounds 异常。我发现这主要是由于hadoop-common
罐子。我能够通过彻底清理 Tomcat 定义和项目并将这个 jar 添加为最后一个来发布它。还是试了几次。
然后,运行应用程序也停止,但在 DriverManager.getConnection(connstr) 处出现异常。这些错误总是与没有看到加载到 /WEB-INF/lib/ 文件夹中的 jar 文件中的各种类有关。删除然后重新导入它们按以下顺序遍历这些错误:
org/apache/http/client/httpclient (in httpclient jar)
org/apache/http/httprequestinterceptor (in httpcore jar)
org/apache/hadoop/conf/configuration (in hadoop-common jar)
org/apache/hadoop/hive/conf/hiveconf (in hive-common AND hive-exec jars)
的最后一个奇数错误HIVE_CLI_SERVICE_PROTOCOL_V6
。后者很难追踪,直到我在 HiveConnection.java 的 Java 代码中看到它HIVE_CLI_SERVICE_PROTOCOL_Vx
被添加到 supportedProtocols 集合中。这用于检查来自 Impala 的响应,如果 Impala 使用不在列表中的响应,则连接被取消。在我拥有的版本中,使用了 V1-V3。我发现 SVN 上的最新源代码是 V7,但这些在 CDH5 附带的 JDBC 代码中没有使用。
执行另一个循环删除所有内容,然后添加库 jar,然后将 JDBC 的源代码(因此没有添加 JDBC jar)添加到我的 Tomcat Java/src 文件夹中的包中:
org.apache.hadoop.hive.jdbc (Hive 1 driver)
org.apache.hive.jdbc (Hive 2 driver)
终于,我能够在 DEBUG 中单步调试 HiveConnection 并成功进行通信,并且可以检查来自 Impala 的响应。它响应它正在使用____V1 协议,因此它被接受了。
由于文档声明只需要一些 jar,但我发现还需要几个以满足 import 语句,我如何配置 Tomcat 以便仅使用分布式 JDBC 驱动程序及其支持 jar?我怀疑Tomcat如何进行类加载可能存在问题,因为我注意到Catalina.jar及其类加载器中发生了杀手级异常(没有源代码,所以我不知道确切的位置或原因)。