Hadoop Java程序始终以独立模式运行

Hadoop Java程序始终以独立模式运行,java,hadoop,mapreduce,classpath,Java,Hadoop,Mapreduce,Classpath,我已经编写了一个使用Hadoop的Java程序。我使用“java-jarprog.jar”从命令行执行我的程序,我可以看到它在独立模式下运行。我可以说,因为我的程序不需要运行JobTracker和TaskTracker守护进程就可以成功执行。如果我使用“hadoop jar prog.jar”(关闭map/reduce守护进程)执行我的程序,它自然不起作用 我希望我的java程序以伪分布式模式执行,但我感觉它找不到配置文件。我尝试以“java-cp/usr/hadoop-1.1.1/conf-j

我已经编写了一个使用Hadoop的Java程序。我使用“java-jarprog.jar”从命令行执行我的程序,我可以看到它在独立模式下运行。我可以说,因为我的程序不需要运行JobTracker和TaskTracker守护进程就可以成功执行。如果我使用“hadoop jar prog.jar”(关闭map/reduce守护进程)执行我的程序,它自然不起作用

我希望我的java程序以伪分布式模式执行,但我感觉它找不到配置文件。我尝试以“java-cp/usr/hadoop-1.1.1/conf-jar prog.jar”的形式执行它,以便将它指向配置文件所在的位置,但仍然没有骰子

我有一种感觉,类路径是错误的或什么的。我是个笨蛋,任何帮助都很感激。谢谢

乔丹

下面是我的配置对象的作业启动代码片段

    Configuration config = new Configuration();     
    Job job = new Job(config);
    job.setJobName("Test");
    job.setJarByClass(MyMapper.class);      

    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    job.setMapOutputKeyClass(LongWritable.class);
    job.setMapOutputValueClass(Text.class);

    job.setInputFormatClass(MyInputFormat.class);

    FileInputFormat.addInputPath(job, new Path("hdfs://hadoop0.hq.net:54310/" + saFileName));
    FileOutputFormat.setOutputPath(job, new Path("hdfs://hadoop0.hq.net:54310/" + saFileName + "-output"));

    job.waitForCompletion(true);
我使用“java-jarprog.jar”从命令行执行我的程序,我可以看到它在独立模式下运行

事实并非如此。
java-jar
命令用于运行独立的java应用程序。要运行Hadoop作业,需要使用前面提到的
Hadoop jar
命令

在运行任何任务之前,需要在环境中安装Hadoop。如果您还没有准备好,可以按照或中的步骤进行操作。 您可以通过运行Hadoop发行版提供的一些示例来验证设置:

bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
如果上述命令成功运行,则可以尝试自己的任务

编辑: 您可以使用
Runtime.exec
调用
hadoop jar
,如下所示:

Process p = Runtime.getRuntime().exec(cmd);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = input.readLine();
while (line != null) {
  // process output of the task
  // ...
}
input.close();
// wait for the task complete
p.waitFor();
int ret = p.exitValue();
// process the task result
// ...

我发现如果手动添加config.addResource(新路径(“core site.xml”);
bin/hadoop
脚本将为您设置环境(类路径、配置文件路径等)
bin/hadoop-jar
调用调用主类的
core/org/apache/hadoop/util/RunJar.java
。如果您使用
bin/hadoop jar
命令,则不需要手动添加资源,我认为这是一种首选方法。我尝试的是创建一个Java服务,该服务具有一个可以启动作业的web界面。作业完成后,我的服务会将结果发回。由于某些原因,bin/hadoop jar对我来说似乎不合适。我已经编辑了我的答案,为
bin/hadoop jar
添加了一个包装器,希望能有所帮助。