我们正在使用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配置值,集群没有找到我的任何罐子。 我的测试设置代码如下所示(原因是来自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)。
有没有人见过这个?任何关于在哪里寻找的指针?
提前致谢,
标记
答案 0 :(得分:0)
原来我们必须在minicuster上手动设置类路径。这可能是一个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
答案 1 :(得分:0)
看看这个。
希望它有所帮助。
-Vivek