我为Hadoop0.20.2编写了一个简单的地图任务,输入数据集由44个文件组成,每个文件约为3-5 5MB。任何文件的每一行都具有int,int格式。输入格式是默认的TextInputFormat,映射器的工作是将输入Text解析为整数。
任务运行后,hadoop框架的统计数据显示,map任务的输入记录数仅为44条。我尝试过调试,发现map方法的输入记录只是每个文件的第一行。
有没有人知道问题是什么,我在哪里能找到解决办法?
谢谢你的进阶。
编辑1
输入数据是由一个不同的map-还原任务生成的,其输出格式是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
我刚刚检查过,映射器实际上只读取每个文件的一行,而不是作为一个Text值读取整个文件。
发布于 2013-05-21 07:11:18
InputFormat定义了如何将数据从文件读入Mapper instances.The默认的TextInputFormat读取文本文件行。它为每条记录发出的键是行读取的字节偏移量(作为LongWritable),值是行的内容,直到终止的'\n‘字符(作为文本对象).If(作为文本对象)--每个多行记录都由$字符分隔,您应该编写自己的InputFormat,将文件解析为在该字符上拆分的记录。
发布于 2013-05-21 08:18:41
我怀疑您的映射器会将所有文本作为输入并打印输出。你能出示你的Mapper类解密和映射函数解密吗?i.e
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
}
}我想知道这句话有什么不同吗?
https://stackoverflow.com/questions/16662579
复制相似问题