Tomcat 7 (7.0.54) でデプロイされた既存のアプリケーションに Impala/Hive2 JDBC ドライバーを追加しようとしています。他の JDBC ドライバーは正常に動作します (Oracle、MS SS、SyBase)。
ただし、ドライバーは接続せず、Eclipse (Kepler) の Java (JDK 1.7.0_55) によってトラップされない例外を常にスローしました。これは、Windows 8.1 Lenovo T500 ラップトップで実行されています。意味のあるエラー メッセージもスタック トレースもありませんでした。
エラーが発生した場所を見つけるために、Hive のソース コードを入手し、単純な Java プログラムを作成して、DEBUG でステップ スルーする JDBC 接続をテストしました。Clouder のドキュメントで指定されているよりも jar に含まれていなかった欠落クラスへの参照エラーがありました。HiveConnection.java (org.apache.hive.jdbc) に次のエラーがあります。
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.http.impl.client.DefaultHttpClient;
これらのクラスが存在する場所を追跡し、作成した UserLibrary に次の jar を追加しました。
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 を最後の 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。HIVE_CLI_SERVICE_PROTOCOL_Vx後者は、supportedProtocols のコレクションに追加されているHiveConnection.java の Java コードで確認するまで、追跡するのが困難でした。これは Impala からの応答を確認するために使用され、Impala がリストにない応答を使用する場合、接続はキャンセルされます。私が持っているバージョンでは、V1-V3 が使用されています。SVN の最新のソースは V7 までですが、これらは CDH5 に同梱されている JDBC コードでは使用されていません。
すべてを削除してからライブラリ jar を追加し、次に JDBC のソース コードを追加するという別のサイクルを実行します (JDBC jar は追加しませんでした)。
org.apache.hadoop.hive.jdbc (Hive 1 driver)
org.apache.hive.jdbc (Hive 2 driver)
やっとのことで、HiveConnection の DEBUG を実行し、正常に通信して、Impala からの応答を確認することができました。____V1 プロトコルを使用していると応答したので、受け入れられました。
ドキュメントには一部の jar のみが必要であると記載されていますが、インポート ステートメントを満たすためだけにさらにいくつかの jar が必要であることがわかりました。分散 JDBC ドライバーとそのサポート jar だけを使用できるように、Tomcat を構成するにはどうすればよいでしょうか? Catalina.jar でクラスローダーを使用してキラー例外が発生していることに気付いたので、Tomcat がクラスをロードする方法に問題があるのではないかと思います (このためのソース コードがないため、正確な場所や理由はわかりません)。