我在下面提到一个简单的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.
答案 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)
ArrayOutofBounds
警告。否则,请检查您插入的库,确保插入所有CLIENT库或检查您的类是否在包中。
如果满足上述所有条件,您的工作将会执行。