我使用多文本输出格式来创建单个文件的多个文件,即新文件中的每一行。
这是我的代码:
public class MOFExample extends Configured implements Tool {
private static double count = 0;
static class KeyBasedMultipleTextOutputFormat extends
MultipleTextOutputFormat<Text, Text> {
@Override
protected String generateFileNameForKeyValue(Text key, Text value,
String name) {
return count++ + "_";// + name;
}
}
/**
* The main job driver.
*/
public int run(final String[] args) throws Exception {
Path csvInputs = new Path(args[0]);
Path outputDir = new Path(args[1]);
JobConf jobConf = new JobConf(super.getConf());
jobConf.setJarByClass(MOFExample.class);
jobConf.setMapperClass(IdentityMapper.class);
jobConf.setInputFormat(KeyValueTextInputFormat.class);
jobConf.setOutputFormat(KeyBasedMultipleTextOutputFormat.class);
jobConf.setOutputValueClass(Text.class);
jobConf.setOutputKeyClass(Text.class);
FileInputFormat.setInputPaths(jobConf, csvInputs);
FileOutputFormat.setOutputPath(jobConf, outputDir);
//jobConf.setNumMapTasks(4);
jobConf.setNumReduceTasks(4);
return JobClient.runJob(jobConf).isSuccessful() ? 0 : 1;
}
public static void main(final String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new MOFExample(), args);
System.exit(res);
}
}
此代码在小文本文件上运行正常,但是当输入文件的行数大于1900但尚未成为大文件时,它会引发异常:
线程“main”中的异常java.io.IOException:作业失败! 在org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:836) 在MOFExample.run(MOFExample.java:57) 在org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 在MOFExample.main(MOFExample.java:61)
我也尝试了this tutorial但是当输入文件很大时,这一个返回空输出目录而没有任何异常,但是这个也适用于小输入文件。
注意:我使用的是单节点群集