输出目录未在JobConf中设置

时间:2012-08-23 08:14:46

标签: map hadoop mapreduce

我在下面提到一个简单的mapR程序的驱动程序代码

   import org.apache.hadoop.fs.Path;
   import org.apache.hadoop.io.IntWritable;
   import org.apache.hadoop.io.Text;
   import org.apache.hadoop.mapred.JobClient;
   import org.apache.hadoop.mapred.JobConf;
   import org.apache.hadoop.mapreduce.Job;
   import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
   import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

  @SuppressWarnings("deprecation")
  public class CsvParserDriver {
      @SuppressWarnings("deprecation")
      public static void main(String[] args) throws Exception
      {
          if(args.length != 2)
          {
              System.out.println("usage: [input] [output]");
              System.exit(-1);
          }

          JobConf conf = new JobConf(CsvParserDriver.class);
          Job job = new Job(conf);
          conf.setJobName("CsvParserDriver");

          FileInputFormat.setInputPaths(job, new Path(args[0]));
          FileOutputFormat.setOutputPath(job, new Path(args[1]));

          conf.setMapperClass(CsvParserMapper.class);
          conf.setMapOutputKeyClass(IntWritable.class);
          conf.setMapOutputValueClass(Text.class);

          conf.setReducerClass(CsvParserReducer.class);
          conf.setOutputKeyClass(Text.class);
          conf.setOutputValueClass(Text.class);

          conf.set("splitNode","NUM_AE");

          JobClient.runJob(conf);
      }
  }

我正在使用以下命令运行我的代码

hadoop jar CsvParser.jar CsvParserDriver /user/sritamd/TestData /user/sritamd/output

(创建上述命令中的所有相应的jar和目录)

我将错误视为

Exception in thread "main" org.apache.hadoop.mapred.InvalidJobConfException: Output directory not set in JobConf.

8 个答案:

答案 0 :(得分:1)

您没有像在apache-hadoop-tutorial中指定的那样创建HDFS输入和输出目录。

如果要使用本地目录file:///user/sritamd/TestData - 添加FS前缀。

答案 1 :(得分:1)

这可能是由旧API和新API引起的。

这是我的新Job API来进行配置。

Step1:导入新的API lib

import org.apache.hadoop.mapreduce.Job

步骤2:通过新的API作业进行配置。

val job = Job.getInstance(conf)
job.getConfiguration.set(TableOutputFormat.OUTPUT_TABLE, tableName)
job.setOutputFormatClass(classOf[TableOutputFormat[Put]])

希望这可以帮到你。

答案 2 :(得分:0)

我认为你需要将输入和输出目录设置为 conf 而不是作业赞:

FileInputFormat.setInputPaths(conf, new Path(args[0]));

FileOutputFormat.setOutputPath(conf, new Path(args[1]));

答案 3 :(得分:0)

试试这个

 Configuration configuration = new Configuration();
 Job job = new Job(configuration, "MyConfig");

然后

  FileInputFormat.setInputPaths(job, new Path(args[0]));
  FileOutputFormat.setOutputPath(job, new Path(args[1]));

答案 4 :(得分:0)

您可能无法创建HDFS文件系统,您需要先格式化给定目录,该目录可用作Hadoop文件的输入和输出

/ usr / local / hadoop / bin / hadoop namenode -format

使用链接: - http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/

并按照每个步骤进行操作

答案 5 :(得分:0)

如果您在标准模式(没有群集)上运行hadoop来测试代码,则不需要在输出路径中使用fs前缀。您可以初始化Job并设置路径。以下代码应该有效(确保您使用的是Job(来自org.apache.hadoop.mapreduce.Job)或来自org.apache.hadoop.mapred.JobConf的JobConf)

        Job job = new Job();
        job.setJobName("Job Name");
        job.setJarByClass(MapReduceJob.class);

        FileInputFormat.setInputPaths(job,new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));

        job.setMapperClass(MaxTemperatureMapper.class);
        job.setReducerClass(MaxTemperatureReducer.class);

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

        System.exit(job.waitForCompletion(true)? 0:1);

答案 6 :(得分:0)

我有同样的问题,但修好了。我使用job.waitForCompletion(true)时使用saveAsNewAPIHadoopFile(...)导致hbase上的火花崩溃 你不应该等待你的工作,因为它使用旧的Hadoop api而不是新的API

答案 7 :(得分:0)

  • 首先确保您的目录尚不存在。如果存在则删除它。
  • 第二次在Eclipse中运行代码,如果它正常运行并发出ArrayOutofBounds警告。

否则,请检查您插入的库,确保插入所有CLIENT库或检查您的类是否在包中。

如果满足上述所有条件,您的工作将会执行。