1

我通常使用 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 集群并像“hadoop jar”命令一样执行这个 jar,以使 main 方法指定映射器和减速器。

那么我该如何处理这个问题呢?

4

1 回答 1

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在使用前正确设置。获得正确的一种方便方法CLASSPATHhadoop classpath. 键入此命令,您将获得完整的CLASSPATH.

CLASSPATH然后在运行 java 应用程序之前进行设置。例如,

export CLASSPATH=$(hadoop classpath):$CLASSPATH
java -jar YourJar.jar
于 2013-08-23T05:23:16.303 回答