Pivotal Knowledge Base

フォローする

GPHDFSのTaskAttemptContextでNoClassDefFoundErrorが発生する

環境

  • GPDB 4.3
  • PHD 3.0
  • HDB 2.x

事象

GPHDFSにてhdfsからデータを読み込もうとするとTaskAttemptContextでNoClassDefFoundError が発生する。

gpadmin=# select * from foo;
ERROR: external table gphdfs protocol command ended with error. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/TaskAttemptContext (seg1 slice1 etl2.gphd.local:1026 pid=239593) DETAIL: at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2570) at java.lang.Class.getMethod0(Class.java:2813) at java.lang.Class.getMethod(Class.java:1663) at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) Caused by: java.lang.ClassNotFoundExcept Command: 'gphdfs://nest/danl/data' External table foo, file gphdfs://nest/danl/data

原因

gp_hadoop_home が「/usr/phd/current」へのシンボリックリンクとして設定されている

gpadmin=# show gp_hadoop_target_version;
 gp_hadoop_target_version
--------------------------
 gphd-2.0
(1 row)

gpadmin=# show gp_hadoop_home;
   gp_hadoop_home
--------------------
 /usr/phd/current
(1 row)

TaskAttemptContext.classクラスを含むjarファイルを検索すると、hadoop-mapreduce-client-core-2.6.0.3.0.1.0-1.jarというjarファイルに存在していることが分かる。

find /usr/phd/3.0.1.0-1 -type f -name *.jar | while read line; do l=$line; echo $l; jar tvf $l | egrep TaskAttemptContext; done
./hadoop-mapreduce/hadoop-mapreduce-client-core-2.6.0.3.0.1.0-1.jar
  3358 Sat Jun 20 01:31:50 EDT 2015 org/apache/hadoop/mapred/TaskAttemptContextImpl.class
   862 Sat Jun 20 01:31:50 EDT 2015 org/apache/hadoop/mapred/TaskAttemptContext.class
  3298 Sat Jun 20 01:31:50 EDT 2015 org/apache/hadoop/mapreduce/task/TaskAttemptContextImpl.class
  1370 Sat Jun 20 01:31:50 EDT 2015 org/apache/hadoop/mapreduce/task/TaskAttemptContextImpl$DummyReporter.class
  1142 Sat Jun 20 01:31:50 EDT 2015 org/apache/hadoop/mapreduce/TaskAttemptContext.class

このjarファイルは以下のパスから読み込むことができる。

[gpadmin@etl1 current]$ ls /usr/phd/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core.jar
/usr/phd/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core.jar
[gpadmin@etl1 current]$ ls /usr/phd/3.0.1.0-1/hadoop-mapreduce/hadoop-mapreduce-client-core.jar
/usr/phd/3.0.1.0-1/hadoop-mapreduce/hadoop-mapreduce-client-core.jar

GPHDFSが必要とするjarファイルを読み込むため、GPDBでは/usr/local/greenplum-db/lib/hadoop/hadoop-env.shを用いる。 この場合、GPDBは「$GP_HADOO_HOME/hadoop-mapreduce/」(/usr/phd/current/hadoop-mapreduce)というパスを読み込むが、/usr/phd/current/hadoop-mapreduceへのシンボリックリンクが存在しない。そのため、GPDBはこのmapreduce-client-core jar ファイルを見つけることができずjava.lang.NoClassDefFoundErrorというエラーが出力される。 

解決方法

GUC(Global User Configuration Parameter)のgp_hadoop_homeを「/usr/phd/3.0.1.0-1」を使用するよう変更する。

セッションレベルでの設定方法。

gpadmin=# set gp_hadoop_home = '/usr/phd/3.0.1.0-1';
SET

グローバルレベルでの設定方法。

[gpadmin@etl1 ~]$ gpconfig -c gp_hadoop_home -v "'/usr/phd/3.0.1.0-1'"

コメント

Powered by Zendesk