0

我有一个问题,需要我在迭代过程中过滤大量数据,数十 TB。由于大小,我想在 2 个连续的地图阶段中进行计算,这样数据就不需要通过网络重新传输。

所以算法中的步骤是1)分析所有数据并做出决定,2)重新运行相同的数据并根据1的决定进行过滤过程。

我认为有两种方法可以解决这个问题,但每种方法似乎都有很大的问题。

1)解决方案,ChainMapper。问题:第一个映射器需要在第二个开始之前完全完成。

2)解决方案,两个工作。问题:在作业之间删除数据时,数据会通过网络重新传输。

我确定我缺少一些东西,但我真的可以使用一些帮助!

谢谢

4

1 回答 1

1

鉴于您的澄清:您不能使用ChainMapper,但这正是因为它不能通过将映射器 1 应用于所有键、等待然后应用映射器 2 来操作。它将映射链应用于每个输入键。有些人会在其他人开始之前完成第 1 阶段和第 2 阶段。但是您是对的,它不会导致更多数据通过网络;在这里它甚至没有写入磁盘!

由于您需要完成第 1 阶段,因此您确实需要在第 2 阶段执行任何其他操作之前完成 Map 阶段。在 . 中执行第 1Mapper阶段,在Reducer. 这是最简单的。

奇怪的是,拥有两个 Map/Reduce 可能会更快,但没有Reducer. Reducer可以是无操作的,Reducer.class. 打电话setNumReduceTasks(0)。您可以通过这种方式避免洗牌阶段。它不会将数据复制到减速器,而只是转储到 HDFS。

通常,您的下一个映射器将在 HDFS 数据之上生成。那里没有额外的转移。

我认为您不会在这里避免一些数据传输以重新组织和重新编组数据,但我认为它不太可能主导您的计算。

于 2013-04-26T14:01:20.880 回答