Hadoop:在相同的数据或链映射上运行两个M/R作业,并设置同步障碍

Hadoop:在相同的数据或链映射上运行两个M/R作业,并设置同步障碍,hadoop,mapreduce,Hadoop,Mapreduce,我有一个问题,需要我在迭代过程中过滤大量数据,数十TB。由于大小的原因,我希望在两个连续的映射阶段进行计算,这样数据就不需要在网络上重新传输 因此,该算法的步骤是:1)分析所有数据并做出决策;2)重新运行相同的数据,并根据1的决策执行过滤过程 我认为有两种方法可以解决这个问题,但每种方法似乎都有很大的问题 1) 解决方案,链映射器。问题:第一个映射器需要在第二个开始之前完全完成 2) 解决方案,两份工作。问题:在作业之间删除数据时,数据会通过网络重新传输 我肯定我遗漏了一些东西,但我真的需要一些

我有一个问题,需要我在迭代过程中过滤大量数据,数十TB。由于大小的原因,我希望在两个连续的映射阶段进行计算,这样数据就不需要在网络上重新传输

因此,该算法的步骤是:1)分析所有数据并做出决策;2)重新运行相同的数据,并根据1的决策执行过滤过程

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

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

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

我肯定我遗漏了一些东西,但我真的需要一些帮助


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

因为您需要阶段1来完成,所以您确实需要在对阶段2执行任何其他操作之前完成映射阶段。在
映射器中执行阶段1,在
减速器中执行阶段2。这很简单

奇怪的是,有两个Map/reduce可能更快,但没有
Reducer
Reducer
可以是无操作,
Reducer.class
。调用
setNumReduceTasks(0)
。这样可以避免洗牌阶段。它不会将数据复制到还原器,而只是转储到HDFS

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


我不认为你会在这里避免一些数据传输来重新组织和重新整理数据,但我认为这不太可能主导你的计算

如果您必须拥有所有数据才能做出定义第二步的决策,那么为什么第一阶段必须首先完全完成?似乎需要。或者这不是完全重新布线,这是你问题的关键。因为决策是基于查看所有键/值。所以,在我看到所有的键/值对之前,我不能说决定是什么。所以我在想地图->根据地图->地图2做出决定。对不起,我误解了你的回答。是的,我想先完成第一张地图。我只是不知道如何在不通过网络两次重新发送所有数据的情况下实现这一点。这避免了到处发送数据,因为映射程序可以在上一个映射程序的数据之上生成。但是我感觉到阶段2取决于阶段1所有输出的结果,而映射器只能看到所有数据的一部分。你可能需要详细说明你的实际问题,以了解什么是可能的。你是对的。阶段2取决于阶段1所有输出的结果。我实际上可以将此输出存储在计数器中,因此传递不是问题。重要的是,我不会让网络过载,而且我很确定数据在我运行的每个作业中都会传输一次,而我真的很想像以前一样处理相同的数据。所以这听起来像是一种方法,但我只是运行了一个测试,我不确定这是否可以不传输两次数据。所以我所做的就是使用Teragen创建一个1TB的测试集。然后,我创建了一个程序,将减速机的数量设置为0。从这里开始,我做了一个让第一个映射器不发射任何东西的工作,doid Job.waituntlcompletion(),然后我就用另一个不发射任何东西的映射器做了第二个工作。这两个地图时间大约需要7分钟才能完成。做同样的事情,但是仅仅在两个映射器之间使用一个链式映射器总共只需要7分钟。也许吧,但我不认为根据您的要求链式映射器是一个选项。您需要在阶段2之前完成阶段1,而这不是它所做的。这7分钟纯粹是开销。你可以调低一些。你也可以试试Mapper+Reducer。ChainMapper绝对不是一个选项,我只是把它用作比较。我将尝试使用减缩器,但理想情况下,我不必进行洗牌/排序计算。此外,理想情况下,它将使用相同的节点,用于mapper和reducer,以减少网络流量。因此,如果你知道如何做这两件事中的任何一件,请告诉我。但是,我认为你的答案给出了两种方法,不幸的是,这对我来说并不理想,但我认为这些是hadoop的局限性,而不是你的答案。