Hadoop map reduce-只在所有映射运行后才发送mapper的输出

时间:2016-01-05 18:57:49

标签: hadoop mapreduce

只有在所有地图都运行后,我才需要在单台计算机上发送mapper的输出。

例如:

如果计算机#1运行他的地图功能1000次,我希望在所有1000张地图发生后发送输出。

有没有办法这样做?

编辑 - 解释我为什么要这样做:

我正在实施算法冠层。 我的计划是在我拥有的每台机器上运行遮篷,并找到它的本地数据的质心。

一旦找到局部质心,我想向reducer发送当地质心以及与它们相关的点数。

例如: 机器#1找到3个质心,每个都有30个视图。 我想提交减少(质心,观点)。 但问题是,只有在机器的所有地图功能运行后,我才会知道这些视图。 这就是为什么我想发送机器映射器的输出以减少一次全部运行。

3 个答案:

答案 0 :(得分:2)

实现接近此功能的唯一方法是调整配置属性mapreduce.job.reduce.slowstart.completedmaps。有关mapred-default.xml的Apache Hadoop文档中讨论了此设置。

<property>
  <name>mapreduce.job.reduce.slowstart.completedmaps</name>
  <value>0.05</value>
  <description>Fraction of the number of maps in the job which should be 
  complete before reduces are scheduled for the job. 
  </description>
</property>

但是,错误地使用此设置可能会损害群集的吞吐量。通常,reducers可以在map任务完成时尽早开始获取中间地图输出。将此调整为1.0将阻止Reducer在完成所有map任务之前获取任何内容。当最后一个映射任务完成并且reducers开始提取时,这将导致网络带宽利用率突然爆发。

通常,缩减器获取地图输出的时间不应改变MapReduce程序的正确性。这一切都发生在MapReduce shuffle内部。无论减速器如何获取地图输出,最终呈现给您的减速器代码的数据都是相同的。

答案 1 :(得分:1)

在map任务完成之前,除了将映射器输出复制到reducer节点之外,reducer端没有任何反应。只有在完成所有地图任务后,Reducer才会启动。您有什么理由要这样做吗?

答案 2 :(得分:1)

通过将slowstart设置为1.0可以轻松完成。

在以下位置编辑mapred-site.xml:

以hadoop用户身份登录

# vim ~/hadoopuser/hadoop/etc/hadoop/mapred-site.xml <-- Hadoop 2.x

# vim ~/hadoopuser/hadoop/conf/hadoop/mapred-site.xml <-- Hadoop 1.x

并将值更改为1.0,如下例所示:

<property>
  <name>mapreduce.job.reduce.slowstart.completedmaps</name>
  <value>1.0</value>
  <description>The setting would start once all maps are finished </description>
</property>

这适用于hadoop 1.2.1,2.x和Cloudera。

下的Cloudera V5.5.1配置中
 website: http://localhost:7180/cmf/services/10/config
 **Page 3**

 Number of Map Tasks to Complete Before Reduce Tasks
 mapred.reduce.slowstart.completed.maps

从默认值0.05更改为1.0。