我有一个有 8 个节点的集群设置,我正在使用 mapreduce 解析一个 20GB 的文本文件。通常,我的目的是通过映射器获取每一行并使用一个键发送,该键是输入文件行上的列之一。reducer 拿到后,会根据 key 值写入不同的目录。如果我举个例子:输入文件:
test;1234;A;24;49;100
test2;222;B;29;22;22
test2;0099;C;29;22;22
所以这些行会写成这样:
/output/A-r-0001
/output/B-r-0001
/output/C-r-0001
我在 reducer 中使用 MultipleOutputs 对象,如果我使用小文件,一切正常。但是当我使用 20GB 文件时,正在初始化 152 个映射器和 8 个减速器。在 mapper 端,一切都很快完成,但一个 reducer 继续运行。7 个减速器完成最多 18 分钟,但最后一个需要 3 小时。首先,我怀疑那个减速器的输入比其他的要大,但事实并非如此。一个减速器的输入是慢速器的三倍,并且在 17 分钟内完成。
我也尝试将 reducer 的数量增加到 14 个,但这是因为减少了 2 个更慢的 reduce 任务。
我检查了很多文档,但不知道为什么会这样。你们能帮我吗?
已编辑
问题是由于我的数据集中的一些损坏的数据。我已经对映射器端的输入数据进行了一些严格的检查,现在它工作正常。
多谢你们。