我为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
值(value)。
最佳答案
InputFormat 定义了如何将文件中的数据读取到 Mapper 实例中。默认的 TextInputFormat 读取文本文件的行。它为每条记录发出的键是读取行的字节偏移量(作为 LongWritable),值是行的内容,直到终止字符“\n”(作为文本对象)。如果你有多个-line 记录,每个记录由 $ 字符分隔,您应该编写自己的 InputFormat,将文件解析为按此字符分割的记录。
关于java - hadoop textinputformat 每个文件只读一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16662579/