我有一组数据,基本上是简单单词计数的Map结果(文本文件w/单词计数对,制表符分隔),我需要减少它。大约有160GB的数据,压缩成bz2文件。
当我在amazon web services elastic map reduce(aws emr)上运行我的作业时,我使用10个cc2.8x1大型从属服务器和一个m1.xlarge作为主服务器。最终有1200个map任务和54个reduce任务。只有一半的reduce任务在map任务完成后立即完成,它们的输出都是0字节。我假设输入是0个字节,但是我还没有深入查看日志来确认。其他27个reduce任务最终完成,所有这些任务的文件大小都是一致的(每个任务2.3gb)。对于输出文件(part-r-00000,…,part-r-00053),偶数文件是0字节文件。
当我在一个非常小的示例w/2 reducer上本地运行时,每个reducer输出都有数据。
我的mapper和reducer如下所示(java w/extras剥离):
// ...
public void map(LongWritable key, Text val, Context context) throws IOException, InterruptedException {
String[] parts = val.toString().split("\t");
if (parts.length > 1) {
keyOut.set(parts[0]);
valOut.set(Integer.parseInt(parts[1]));
context.write(keyOut, valOut);
}
}
// ...
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
// ...
还有其他人经历过吗?你知道为什么会发生这种情况,或者我如何进一步调试吗?我打开了emr调试,以防你在日志中找到什么。谢谢
编辑:我应该注意到我正在s3上读取和存储数据
编辑2:我以前运行过一次同样的作业,我看到了0字节的文件,并且假设我的减速机中有一个bug,所以取消了作业。因此,我知道这不是一个一次性的事件。作业在同一群集上运行。我最初是在cloudera4(cdh4)库上编译java类的,这些库有“hadoop2.0”,所以我认为这可能是问题所在。当我第二次运行它时,我使用了用cloudera3(cdh3)库和hadoop0.20编译的java类,基本上与aws的版本相同。我过去也用cdh3编译过,但没有这种行为。
暂无答案!
目前还没有任何答案,快来回答吧!