我正在尝试在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)
请帮助..谢谢
答案 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类的初始化。
请参阅: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()方法的类。
由于