hadoop中的-libjars问题

时间:2011-07-31 14:43:48

标签: hadoop mapreduce

我正在尝试在Hadoop上运行MapReduce作业,但我遇到了错误,我不确定出了什么问题。我必须使用我的映射器所需的库jar。

我在终端上排除了以下内容:

hadoop @ ubuntu:/ usr / local / hadoop $ bin / hadoop jar /home/hadoop/vardtst.jar -libjars /home/hadoop/clui.jar -libjars /home/hadoop/model.jar gutenberg ou101

我得到以下例外:

at java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)

at java.security.AccessController.doPrivileged(Native Method)

在java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

在java.lang.ClassLoader.loadClass(ClassLoader.java:247)

at java.lang.Class.forName0(Native Method)

在java.lang.Class.forName(Class.java:247)

at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

请帮助..谢谢

3 个答案:

答案 0 :(得分:19)

另外值得注意的是微妙但重要的一点:为运行分布式地图减少任务的JVM指定其他JAR的方式以及为JVM运行作业客户端的方式是非常不同的。

  • -libjars使Jars仅适用于运行远程地图的JVM并减少任务

  • 要使客户端JVM(运行hadoop jar命令时创建的JVM)可以使用这些相同的JAR,需要设置HADOOP_CLASSPATH环境变量:

$ export LIBJARS=/path/jar1,/path/jar2
$ export HADOOP_CLASSPATH=/path/jar1:/path/jar2
$ hadoop jar my-example.jar com.example.MyTool -libjars ${LIBJARS} -mytoolopt value

请参阅:http://grepalex.com/2013/02/25/hadoop-libjars/

错误的-libjars行为的另一个原因可能是错误的实现和自定义Job类的初始化。

  • 作业类必须实施工具界面
  • 必须通过调用getConf()而不是创建新实例来获取配置类实例;

请参阅:http://kickstarthadoop.blogspot.ca/2012/05/libjars-not-working-in-custom-mapreduce.html

答案 1 :(得分:4)

使用Hadoop jar命令指定-LIBJARS时。首先确保编辑驱动程序类,如下所示:

    public class myDriverClass extends Configured implements Tool {

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

      public int run(String[] args) throws Exception
      {

        // Configuration processed by ToolRunner 
        Configuration conf = getConf();
        Job job = new Job(conf, "My Job");

        ...
        ...

        return job.waitForCompletion(true) ? 0 : 1;
    }
}

现在编辑你的“hadoop jar”命令,如下所示:

  

hadoop jar YourApplication.jar [myDriverClass] args -libjars path / to / jar / file

现在让我们了解下面发生了什么。基本上我们通过实现TOOL Interface来处理新的命令行参数。 ToolRunner用于运行实现Tool接口的类。它与GenericOptionsParser结合使用来解析泛型hadoop命令行参数并修改工具的配置。

在我们的Main()中,我们调用ToolRunner.run(new Configuration(),new myDriverClass(),args) - 这是通过Tool.run(String [])运行给定的工具,解析后使用给出通用参数。它使用给定的Configuration,或者如果它为null则构建一个,然后使用可能修改的conf版本设置Tool的配置。

现在在run方法中,当我们调用getConf()时,我们得到了Configuration的修改版本。 因此,请确保您的代码中包含以下行。如果您实现其他所有内容并仍然使用Configuration conf = new Configuration(),则无法正常工作。

  

配置conf = getConf();

答案 2 :(得分:3)

我找到了答案,这是错误,因为我在命令中的“主”类名称上缺少了。

正确的执行方式是: hadoop @ ubuntu:/ usr / local / hadoop $ bin / hadoop jar /home/hadoop/vardtst.jar VardTest -libjars /home/hadoop/clui.jar,/home/hadoop/model.jar gutenberg ou101

其中VardTest是包含main()方法的类。

由于