Hadoop:ClassNotFoundException - org.apache.hcatalog.rcfile.RCFileMapReduceOutputFormat

时间:2014-04-02 05:00:03

标签: hadoop mapreduce

当我为班级ClassNotFoundException开始工作时,我正面临org.apache.hcatalog.rcfile.RCFileMapReduceOutputFormat

我尝试使用-libjars传递其他jar文件,但我仍面临同样的问题。任何建议都会有很大帮助。提前谢谢。

以下是我正在使用的命令以及我正面临的例外情况!

hadoop jar MyJob.jar MyDriver -libjars hcatalog-core-0.5.0-cdh4.4.0.jar inputDir OutputDir
  

线程“main”中的异常java.lang.NoClassDefFoundError:org / apache / hcatalog / rcfile / RCFileMapReduceOutputFormat
          在com.cloudera.sa.omniture.mr.OmnitureToRCFileJob.run(OmnitureToRCFileJob.java:91)
          在org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
          在com.cloudera.sa.omniture.mr.OmnitureToRCFileJob.main(OmnitureToRCFileJob.java:131)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          在java.lang.reflect.Method.invoke(Method.java:597)
          在org.apache.hadoop.util.RunJar.main(RunJar.java:208)
  引起:java.lang.ClassNotFoundException:org.apache.hcatalog.rcfile.RCFileMapReduceOutputFormat
          在java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)
          at java.security.AccessController.doPrivileged(Native Method)
          at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
          在java.lang.ClassLoader.loadClass(ClassLoader.java:306)
          在java.lang.ClassLoader.loadClass(ClassLoader.java:247)
          ... 8更多

我也实现了ToolRunner,下面的代码确认了这一点!

public class OmnitureToRCFileJob extends Configured implements Tool {

    public static void main(String[] args) throws Exception {

        OmnitureToRCFileJob processor = new OmnitureToRCFileJob();
        String[] otherArgs = new GenericOptionsParser(processor.getConf(), args).getRemainingArgs();

        System.exit(ToolRunner.run(processor.getConf(), processor, otherArgs));
    }

}

3 个答案:

答案 0 :(得分:0)

如果查看hadoop命令文档,可以看到-libjars是一个通用选项。对于解析泛型选项,您必须覆盖驱动程序类中的ToolRunner.run()方法,如下所示:

public class TestDriver extends Configured implements Tool {
    @Override
    public int run(String[] args) throws Exception {
        Configuration conf = getConf();

        # Job configuration details            
        # Job submission  

        return 0;
    }        
}

public static void main(String[] args) throws Exception {
    int exitCode = ToolRunner.run(new TestDriver(), args);
    System.exit(exitCode);
}

我从你的驱动程序代码本身那里得到了这个例外。使用-libjars选项设置hcatalog-cor * .jar可能在客户端JVM(运行驱动程序代码的JVM)中不可用。最好你需要在HADOOP_CLASSPATH环境变量中设置这个jar,然后使用hadoop jar执行相同的操作,如下所示

export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:<PATH-TO-HCAT-LIB>/hcatalog-core-0.5.0-cdh4.4.0.jar;
hadoop jar MyJob.jar MyDriver -libjars hcatalog-core-0.5.0-cdh4.4.0.jar inputDir OutputDir

答案 1 :(得分:0)

您是否尝试通过在下面的行中提供“hcatalog-core-0.5.0-cdh4.4.0.jar”jar文件的完整路径来运行。

hadoop jar MyJob.jar MyDriver -libjars hcatalog-core-0.5.0-cdh4.4.0.jar inputDir OutputDir

以下配置也应该适合你

$ export LIBJARS= <fullpath>/hcatalog-core-0.5.0-cdh4.4.0.jar
$hadoop jar MyJob.jar MyDriver -libjars ${LIBJARS} inputDir OutputDir

答案 2 :(得分:0)

我有同样的问题,但发现jar命令不接受--libjars参数。 “指定要包含在类路径中的逗号分隔的jar文件。仅适用于作业。” - &GT; Hadoop Cli Generic Options

相反,您应该使用env vars添加额外的或替换罐子。

导出HADOOP_USER_CLASSPATH_FIRST = true export HADOOP_CLASSPATH =“./ lib / *”