2

在 Hadoop 作业中,我正在映射多个 XML 文件并为每个元素过滤一个 ID (from < id>-tags)。由于我想将作业限制为一组特定的 ID,因此我读入了一个大文件(2.7 GB 中大约有 2.5 亿行,每行只有一个整数作为 ID)。所以我使用了一个分布式缓存,在 Mapper 的方法中使用 BufferedReader 解析文件setup()并将 ID 保存到 HashSet。

现在当我开始工作时,我得到了无数

Task attempt_201201112322_0110_m_000000_1 failed to report status. Killing!

在执行任何地图作业之前。

集群由 40 个节点组成,并且由于在DistributedCache执行作业的任何任务之前将 a 的文件复制到从节点,我假设失败是由大型HashSet. 我已经增加到mapred.task.timeout2000s。当然我可以把时间再提高一点,但实际上这段时间应该足够了,不是吗?

由于DistributedCache's曾经是一种“有效地分发大型只读文件”的方法,我想知道是什么导致了这里的失败,以及是否有另一种方法可以将相关 ID 传递给每个地图作业?

4

1 回答 1

0

你可以在你的设置方法中添加一些调试 println 来检查它在这个方法中是否超时(记录进入和退出时间)?

您可能还想考虑使用 BloomFilter 来保存 ID。您可以将这些值存储在 50MB 的布隆过滤器中,误报率很高 (~0.5%),然后运行辅助作业来执行分区检查对照实际的参考文件。

于 2012-05-17T01:35:30.080 回答