hadoop中的-libjars问题

Shr*_*pai 10 hadoop mapreduce

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

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

Hadoop的@ Ubuntu的:在/ usr /本地/ Hadoop的$斌/ Hadoop的罐子/home/hadoop/vardtst.jar -libjars /home/hadoop/clui.jar -libjars /home/hadoop/model.jar古滕贝格ou101

我得到以下例外:

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

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

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

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

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

请帮助..谢谢

Vla*_*roz 19

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

  • -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
Run Code Online (Sandbox Code Playgroud)

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

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

  • Job类必须实现Tool接口
  • 必须通过调用getConf()而不是创建新实例来获取配置类实例;

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


Isa*_*110 6

通过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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

hadoop jar YourApplication.jar [myDriverClass] args -libjars路径/到/ jar /文件

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

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

现在在run方法中,当我们调用getConf()时,将获得Configuration的修改版本。因此,请确保您的代码中包含以下行。如果您实现了其他所有功能,但仍然使用Configuration conf = new Configuration(),则将无法进行任何操作。

配置conf = getConf();


Shr*_*pai 3

我找到了答案,它抛出错误,因为我在命令中缺少“主”类名。

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

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

谢谢

  • 这在 Hadoop 2.2 上对我不起作用 - Hadoop 只是采用“-libjars”选项和 jar 路径并将其用作我的主类的参数。 (7认同)