1

我为hadoop 0.20.2写了一个简单的map任务,输入数据集由44个文件组成,每个文件大约3-5MB。任何文件的每一行都有格式int,int。输入格式是默认TextInputFormat的,映射器的工作是解析输入Text为整数。

任务运行后,hadoop框架的统计显示map任务的输入记录数只有44条。我尝试调试,发现该方法的输入记录map只是每个文件的第一行。

有谁知道问题是什么,我在哪里可以找到解决方案?

提前谢谢你。

编辑 1

输入数据由不同的 map-reduce 任务生成,其输出格式为TextOutputFormat<NullWritable, IntXInt>. 的toString()方法IntXInt应该给出一个字符串int,int

编辑 2

我的映射器如下所示

static class MyMapper extends MapReduceBas
  implements Mapper<LongWritable, Text, IntWritable, IntWritable> {

  public void map(LongWritable key,
                  Text value,
                  OutputCollector<IntWritable, IntWritable> output,
                  Reporter reporter) {

    String[] s = value.toString().split(",");
    IntXInt x = new IntXInt(s[0], s[1]);
    output.collect(x.firstInt(), x.secondInt());
  }
}

编辑 3

我刚刚检查过,映射器实际上只为每个文件读取 1 行,而不是整个文件作为一个Text值。

4

2 回答 2

0

我怀疑您的映射器将所有文本作为输入并打印输出。你能展示你的 Mapper 类 decleration 和 mapper 函数 decleration 吗?IE

static class MyMapper extends Mapper <LongWritable,Text,Text,Text>{ 
    public void map (LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //do your mapping here

    }
}

我想知道这条线是否有不同之处

于 2013-05-21T08:18:41.203 回答
0

InputFormat 定义了如何将文件中的数据读取到 Mapper 实例中。默认的 TextInputFormat 读取文本文件的行。它为每条记录发出的键是读取的行的字节偏移量(作为 LongWritable),值是直到终止 '\n' 字符的行的内容(作为文本对象)。如果你有多个-line 记录每个由 $ 字符分隔,您应该编写自己的 InputFormat 将文件解析为在此字符上拆分的记录。

于 2013-05-21T07:11:18.470 回答