Hadoop分隔符不适用于独立计算机

时间:2015-04-17 11:54:06

标签: java hadoop delimiter

我对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);
  }

但是,我受版本约束。任何人都能提出建议吗?

1 个答案:

答案 0 :(得分:1)

Hadoop 1.2.1版不支持

自定义分隔符(由“textinputformat.record.delimiter”参数提供)。但是,您仍然可以创建自己的记录阅读器来处理该特定情况。

尝试给出字符串分隔符=&#39; \ n \ n \ n&#39;在你的行记录阅读器中,而不是从上下文对象中拉出它。