Hive 2.3 および Hadoop 2.7 構成環境において、コマンド実行時に予期せぬ例外が発生する事象について解説します。特に Sqoop を経由して Hive へのデータ取り込みを試みた際、Facebook Thrift サービス関連のメソッドが見つからないというエラーが観測されました。
エラー現象の確認
Hive CLI または Sqoop ジョブ実行時に、コンソール出力に以下のスタックトレースが記録されます。主要な例外内容は java.lang.NoSuchMethodError であり、特定のメソッドシグネチャが解決できないことを示しています。
ERROR ql.Driver: FAILED: Hive Internal Error: java.lang.NoSuchMethodError
java.lang.NoSuchMethodError: com.facebook.fb303.FacebookService$Client.sendBaseOneway(...)
at com.facebook.fb303.FacebookService$Client.send_shutdown(FacebookService.java:436)
at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.close(HiveMetaStoreClient.java:555)
...
Caused by: java.lang.NoSuchMethodError: com.facebook.fb303.FacebookService$Client.sendBaseOneway
at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:331)
このエラーは、JVM がクラスロードしようとした際に、該当するメソッド定義を持つクラスを見つけられなかったことを意味します。
ライブラリ存在確認
エラーメッセージから libfb303 関連の jar ファイルがクラスパス上に存在しない可能性が考えられます。まず、Hive のインストールディレクトリ内に関係ファイルが配置されているか検証します。
$ ls -l /opt/hive/latest/lib/ | grep libfb
-rw-r--r-- 1 hive user 313702 Mar 24 17:35 libfb303-0.9.3.jar
ファイル自体は物理的に存在しているため、クラスパスの参照設定または環境変数の展開方法に問題がある可能性があります。
環境変数設定の修正
システム全体の環境変数設定ファイルを開き、Hive のライブラリパスがどのように定義されているか確認します。
$ cat /etc/profile.d/hive_env.sh
export HIVE_HOME=/opt/hive/latest
export HADOOP_CLASSPATH=$HIVE_HOME/lib/*
export PATH=$PATH:$HIVE_HOME/bin:$HADOOP_CLASSPATH
ここで、HADOOP_CLASSPATH にワイルドカード(*)が含まれていることが問題の原因でした。一部の環境構成では、シェル展開されたワイルドカードが Java のクラスパス解釈と競合し、特定の jar ファイルが正しくロードされない場合があります。
設定をディレクトリパスのみを指定する形式に変更し、ワイルドカードを除去します。
$ vi /etc/profile.d/hive_env.sh
export HIVE_HOME=/opt/hive/latest
export HADOOP_CLASSPATH=$HIVE_HOME/lib
export PATH=$PATH:$HIVE_HOME/bin:$HADOOP_CLASSPATH
修正後、設定を反映させるためにシェル環境をリロードします。
$ source /etc/profile.d/hive_env.sh