我对Hadoop相对较新。我使用此link在本地计算机上设置了hadoop 0.20.2。使用工作代码(在另一台机器上成功测试)并在我的机器上运行它。除了驱动程序类中的分隔符没有分隔这一事实外,一切都正常工作而没有错误。它假设向我发送输入块,但仍然以每行为基础向我发送输入。
我的驱动程序类看起来像这样 -
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
conf.set("textinputformat.record.delimiter","\n\n\n");
Job job = new Job(conf);
job.setJobName("Aggregated occurence");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setJarByClass(EntityCoOccurence.class);
job.setMapperClass(CoOccuringEntityMap.class);
job.setReducerClass(CoOccuringEntityCountReduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.submit();
}
我的输入文件由3行文本组成,然后是2行空白。像这样的东西 -
abc
def
ghi
abc
dfg
sas
pos
sdf
sfd
分隔符在我的大学hadoop集群中完美运行,但在我的本地计算机上不起作用。我打印出输入,发现尽管有分隔符,hadoop也会将每行发送给我作为输入。任何想法?
我对此进行了一些调查,发现hadoop-0.20.2-core jar的recordReader方法中的 TextInputFormat 类看起来像这样 -
@Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
return new LineRecordReader();
}
这应该是这样的 -
@Override
public RecordReader<LongWritable, Text>
createRecordReader(InputSplit split,
TaskAttemptContext context) {
// By default,textinputformat.record.delimiter = ‘/n’(Set in configuration file)
String delimiter = context.getConfiguration().get(
"textinputformat.record.delimiter");
byte[] recordDelimiterBytes = null;
if (null != delimiter)
recordDelimiterBytes = delimiter.getBytes();
return new LineRecordReader(recordDelimiterBytes);
}
但是,我受版本约束。任何人都能提出建议吗?
答案 0 :(得分:1)
自定义分隔符(由“textinputformat.record.delimiter”参数提供)。但是,您仍然可以创建自己的记录阅读器来处理该特定情况。
尝试给出字符串分隔符=&#39; \ n \ n \ n&#39;在你的行记录阅读器中,而不是从上下文对象中拉出它。