如何在没有ClassNotFound异常的情况下在Apache Tomcat中配置Impala / Hive2 JDBC驱动程序

时间:2014-08-14 21:06:57

标签: tomcat hadoop jdbc hive impala

我正在尝试将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连接。缺少类中的缺少类的引用错误比Clouder's documentation中指定的缺少。 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

成功连接到Impala守护程序的独立Java程序。我将这些jar作为Java源代码添加到Tomcat / WEB-INF / ib /文件夹以及JDBC包中。 Tomcat遇到了一些问题,包括无法发布一个IndexOutOfBounds异常。我发现这主要是由于hadoop-common jar。通过完全清除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代码中使用。

执行另一个循环,删除所有内容,然后在我的Tomcat Java / src文件夹中添加库jar,然后添加JDBC的源代码(因此没有添加JDBC jar):

org.apache.hadoop.hive.jdbc     (Hive 1 driver)  
org.apache.hive.jdbc            (Hive 2 driver)  

最后,我能够在DEBUG HEDConnection中逐步完成并成功进行通信,并可以检查Impala的响应。它回应它正在使用____V1协议,所以它被接受了。

由于文档声明只需要一些jar,但我发现只需要几个jar来满足import语句,我如何配置Tomcat以便只使用分布式JDBC驱动程序及其支持jar?我怀疑Tomcat如何进行类加载可能存在一个问题,因为我注意到Catalina.jar中发生的杀手异常及其类加载器(没有源代码,所以我不确切知道在哪里或为什么)。

1 个答案:

答案 0 :(得分:-1)

我可以从Tomcat连接到Impala(尽管我使用的是Tomcat 8,而不是7)。 我将所有这些罐子复制到tomcats lib目录:

commons-logging-1.1.3.jar          
hive-metastore-0.12.0-cdh5.0.2.jar 
libfb303-0.9.0.jar          
slf4j-log4j12.jar
hadoop-common-2.3.0-cdh5.0.2.jar   
hive-service-0.12.0-cdh5.0.2.jar   
libthrift-0.9.0.cloudera.2.jar
hive-common-0.12.0-cdh5.0.2.jar    
httpclient-4.2.5.jar               
log4j-1.2.16.jar
hive-jdbc-0.12.0-cdh5.0.2.jar      
httpcore-4.2.5.jar                 
slf4j-api-1.7.5.jar