我有一组数据,基本上是简单字数统计的映射结果(带有单词和计数对的文本文件,制表符分隔),我需要减少它。大约有 160 GB 的数据,压缩成 bz2 文件。
当我在 Amazon Web Services Elastic Map Reduce (AWS EMR) 上运行我的工作时,我使用 10 个 cc2.8xlarge 从属服务器和一个 m1.xlarge 作为主服务器。最终有 1200 个 map 任务和 54 个 reduce 任务。恰好一半的reduce 任务在map 任务完成后立即完成,它们的输出都是0 字节。我假设输入是 0 字节,但我还没有充分挖掘日志来确认。其他 27 个 reduce 任务最终完成,并且它们的文件大小是一致的(每个 2.3gb)。对于输出文件(part-r-00000,...,part-r-00053),偶数文件是 0 字节文件。
当我在带有 2 个减速器的非常小的样本上本地运行它时,每个减速器输出都有数据。
我的映射器和减速器如下(去除了 Java 的附加功能):
// ...
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 字节文件,并认为我的 Reducer 中有错误,所以取消了作业。因此,我知道这不是一次性事件。该作业在同一个集群上运行。我最初在具有“Hadoop 2.0”的 Cloudera 4 (CDH4) 库上编译了我的 Java 类,所以我认为这可能是问题所在。当我第二次运行它时,我使用了使用 Cloudera 3 (CDH3) 库和 Hadoop 0.20 编译的 Java 类,与 AWS 的版本基本相同。在过去,我也使用 CDH3 来编译没有这种行为。