1

cdh3u4、Hadoop、および HBase を使用しています。HBaseTestingUtility によって提供される miniMapReduceCluster を起動した後、MapReduce ジョブを開始する単体テストを実行しようとしています。

map および reducer タスクの stderr ログで、ジョブは次のように失敗します。

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapred/Child
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapred.Child
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
 Could not find the main class: org.apache.hadoop.mapred.Child.  Program will exit.
java.lang.Throwable: Child Error

私は何日もこれを理解しようとしてきました。私はそれが誤った構成であると推測しています.fs / hdfs構成値が誤って構成されているため、クラスターは私のjarファイルを見つけられません。私のテスト セットアップ コードは次のようになります (これは Scala からの翻訳であるため、タイプミスをお許しください)。

HBaseTestingUtility htest = new HBaseTestingUtility();
Configuration c = htest.getConfiguration();
c.set("hadoop.log.dir", "/tmp/hadoop-test-logs"); // required or else can't start the miniMapReduceCluster
htest.startMiniCluster();
htest.startMiniMapReduceCluster();

// create and run a MapReduce job that works in production but not in test

これが重要な場合のために、Play! を使用しています。フレームワーク 2.0 (SBT を使用) と Specs2 テスト フレームワークおよび Scala。それは問題ではないと思います (Java + JUnit を使用していないこと)。

誰もこれを見たことがありますか?どこを見るべきかについての指針はありますか?

前もって感謝します、

マーク

4

2 に答える 2

0

ミニカスターでクラスパスを手動で設定する必要があることがわかりました。これはSBT/Ivyのことかもしれません-私が見たすべての例はこれを行う必要はなく、おそらくMaven(およびJava)を使用しているためです。

クラスパスの問題を(Scalaで)解決した方法は次のとおりです。

// unit test setup:
val htest = new HBaseTestingUtility
htest.startMiniCluster()

val conf = htest.getConfiguration
conf.set("hadoop.log.dir", "/tmp/hadoop-test-logs") // required to prevent NPE when starting miniMapReduceCluster
htest.startMiniMapReduceCluster()

// Set up cluster classpath:
val fs = FileSystem.get(conf)
val jarsDir = new Path("/tmp/hadoop-test-lib")
fs.mkdirs(jarsDir)

// copy jars over to hdfs and add to classpath:
for (jar <- myjars) {
    val localJarPath = new Path("file://%s".format(jar.getAbsolutePath))
    val hdfsJarPath = new Path("/tmp/hadoop-test-lib/%s".format(jar.getName))
    fs.copyFromLocalFile(localJarPath, hdfsJarPath)
    DistributedCache.addFileToClassPath(hdfsJarPath)
}

// now Map and Reduce tasks can find classes
于 2012-09-10T15:11:20.957 に答える
0

私はブログをコンパイルしました: http://mevivs.wordpress.com/2012/05/03/perform-crud-over-hbase-using-hbasetestingutilityembeddedhbase/

これを見てください。

それが役に立てば幸い。

-Vivek

于 2012-09-13T06:36:54.917 に答える