我通常使用main方法创建一个可执行jar包,并通过命令行“hadoop jar Some.jar ClassWithMain输入输出”运行
在这个main方法中,可以配置Job和Configuration,并且Configuration类有一个setter来指定mapper或reducer类,如conf.setMapperClass(Mapper.class)。
但是,在远程提交作业的情况下,我应该设置jar和Mapper或更多类来使用hadoop客户端api。
job.setJarByClass(HasMainMethod.class);
job.setMapperClass(Mapper_Class.class);
job.setReducerClass(Reducer_Class.class);
我想以编程方式将客户端中的jar传输到远程hadoop集群并执行此jar,如“hadoop jar”命令,使main方法指定mapper和reducer。
那我怎么处理这个问题呢?
答案 0 :(得分:2)
hadoop
只是一个shell脚本。最终,hadoop jar
将调用org.apache.hadoop.util.RunJar
。 hadoop jar
做的是帮助您设置CLASSPATH
。所以你可以直接使用它。
例如,
String input = "...";
String output = "...";
org.apache.hadoop.util.RunJar.main(
new String[]{"Some.jar", "ClassWithMain", input, output});
但是,您需要在使用前正确设置CLASSPATH
。获得正确CLASSPATH
的便捷方法是hadoop classpath
。输入此命令,您将获得完整的CLASSPATH
。
然后在运行Java应用程序之前设置CLASSPATH
。例如,
export CLASSPATH=$(hadoop classpath):$CLASSPATH
java -jar YourJar.jar