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

如何在没有ClassNotFound异常的情况下在ApacheTomcat中配置Impala/Hive2 JDBC驱动程序,tomcat,hadoop,jdbc,hive,impala,Tomcat,Hadoop,Jdbc,Hive,Impala,我试图将Impala/Hive2 JDBC驱动程序添加到使用Tomcat7.0.54部署的现有应用程序中。其他JDBC驱动程序运行良好Oracle、MS SS和SyBase 但是,驱动程序从未连接,总是抛出Eclipse开普勒中Java JDK 1.7.055不会捕获的异常。这是在Windows8.1LenovoT500笔记本电脑上完成的。没有有意义的错误消息或堆栈跟踪 为了找出错误发生的地方,我获得了配置单元源代码,并编写了一个简单的Java程序来测试调试中的JDBC连接。对缺少的类的引用错误

我试图将Impala/Hive2 JDBC驱动程序添加到使用Tomcat7.0.54部署的现有应用程序中。其他JDBC驱动程序运行良好Oracle、MS SS和SyBase

但是,驱动程序从未连接,总是抛出Eclipse开普勒中Java JDK 1.7.055不会捕获的异常。这是在Windows8.1LenovoT500笔记本电脑上完成的。没有有意义的错误消息或堆栈跟踪

为了找出错误发生的地方,我获得了配置单元源代码,并编写了一个简单的Java程序来测试调试中的JDBC连接。对缺少的类的引用错误不在JAR中,而不是在中指定的类。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作为Java源代码与JDBC包一起添加到Tomcat/WEB-INF/ib/文件夹中。Tomcat遇到了一些问题,包括无法发布一个IndexOutOfBounds异常。我发现这主要是由于hadoop通用jar。我能够通过彻底清理Tomcat定义和项目并添加这个jar作为最后一个jar来发布它。还是尝试了几次

然后,运行应用程序也在DriverManager.getConnectionconnstr处停止,出现异常。错误总是与没有看到jar文件中加载到/WEB-INF/lib/文件夹中的各种类有关。删除然后重新导入它们按以下顺序遍历这些错误:

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)  
配置单元CLI服务协议V6的最后一个奇数错误。后者很难找到,直到我在HiveConnection.Java中的Java代码中看到它,HIVE_CLI_SERVICE_PROTOCOL_Vx被添加到支持的协议集合中。这用于检查来自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)  
终于,我能够分步调试HiveConnection并成功地进行通信,并且可以检查来自Impala的响应。它回答说它正在使用V1协议,所以它被接受了


由于文档说明只需要一些jar,但我发现还需要几个jar来满足import语句,因此如何配置Tomcat,以便只使用分布式JDBC驱动程序及其支持jar?我怀疑Tomcat如何进行类加载可能存在问题,因为我注意到Catalina.jar中发生了致命的异常,其类加载程序没有这方面的源代码,所以我不知道确切的位置和原因

我可以从Tomcat连接到黑斑羚,尽管我使用的是Tomcat 8,而不是7。 我将所有这些JAR复制到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

谢谢你的评论。我刚刚做了一个关于Cloudera数据科学发行版的网络广播技术实验室。我注意到的一件事是另一个未记录的库依赖性问题,即为HDFS和Thread操作编写自定义Java。给那些认为这仅仅是使用Maven的问题的读者一个简短的信息:事实并非如此。拥有未记录的库依赖项是不合适的。在这种情况下,奇怪的解决方案是引用JAR的整个hadoop lib文件夹。成功了。我没有时间穿过雷区。