【问题标题】:Problem with -libjars in hadoophadoop中的-libjars问题
【发布时间】:2011-10-16 22:24:12
【问题描述】:

我正在尝试在 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

我得到以下异常:

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

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

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

在 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)

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

请帮忙..谢谢

【问题讨论】:

  • 我认为libjars 语法有你给它一个逗号分隔的列表,如-libjars jar1,jar2,jar3Generic Options 参考。
  • @Matt - 我仍然遇到同样的错误
  • 在此处查看我的答案,我已在此处解释了解决此问题的所有可用选项:stackoverflow.com/a/36227260/1766402

标签: hadoop mapreduce


【解决方案1】:

我找到了答案,它引发了错误,因为我在命令中的“主”类名上丢失了。

正确的执行方式是: 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() 方法的类。

谢谢

【讨论】:

  • 这在 Hadoop 2.2 上对我不起作用 - Hadoop 只是采用“-libjars”选项和 jar 路径并将其用作我的主类的参数。
【解决方案2】:

另外值得注意的是微妙但重要的一点:为运行分布式 map reduce 任务的 JVM 和运行作业客户端的 JVM 指定额外 JAR 的方式非常不同。

  • -libjars 使 Jars 仅可用于运行远程 map 和 reduce 任务的 JVM

  • 要使这些相同的 JAR 可用于客户端 JVM(运行 hadoop jar 命令时创建的 JVM),需要设置 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

【讨论】:

  • 哇哦,谢谢!将 jar 添加到 HADOOP_CLASSPATH 对我有用。
  • HADOOP_CLASSPATH 成功了。升级到 Hadoop 2 后,libjars 不只是为我工作。
【解决方案3】:

当您使用 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[]) 运行给定的工具,在使用给定通用参数。它使用给定的配置,或者如果它为空则构建一个,然后使用可能修改过的 conf 版本设置工具的配置。

现在在 run 方法中,当我们调用 getConf() 时,我们会得到配置的修改版本。 因此,请确保您的代码中有以下行。如果你实现了其他所有东西并且仍然使用 Configuration conf = new Configuration(),那么什么都行不通。

配置 conf = getConf();

【讨论】:

  • @flexo :我已经编辑了答案以满足这个问题的具体需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多