2012-08-23 46 views
1

我提以下一个简单的MAPR程序的驱动程序代码输出目录中JobConf

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 

(所有相应的罐子和在上面的命令创建目录)

我得到错误作为

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

回答

1

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

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

0

我认为你需要的输入和输出目录设置的conf的代替工作我爱:

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

FileOutputFormat.setOutputPath(conf, new Path(args[1])); 
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])); 
1

这可能是由旧API和新API造成的。

这是我的新的作业API来做配置。

第一步:输入新的API的lib

import org.apache.hadoop.mapreduce.Job 

第二步:通过新的API工作做配置。

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

希望这可以帮助你。

+1

假设我想使用自定义记录写入器写入其他数据库(不是mysql,因为记录写入器已经在hadoop中)那么应该怎样配置才能删除此异常? – iec2011007

0

如果你正在标准模式下运行hadoop(没有集群)来测试你不需要在输出路径中有fs前缀的代码。您可以初始化作业并设置路径。下面的代码应该工作(请确保您所选择的职位(从org.apache.hadoop.mapreduce.Job)或JobConf org.apache.hadoop.mapred.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); 
0

我有同样的问题,但固定它。我使用job.waitForCompletion(true)这会导致在使用saveAsNewAPIHadoopFile(...)时hbase上的火花崩溃。一个 因为它使用的是旧的Hadoop API,而不是新的API的

0
  • 首先确保你的目录不存在,你不应该等待你的工作。如果存在删除它。
  • 第二次在Eclipse中运行您的代码,如果它运行正常并给出ArrayOutofBounds警告。

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

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