只有在所有地图都运行后,我才需要在单台计算机上发送mapper的输出。
例如:
如果计算机#1运行他的地图功能1000次,我希望在所有1000张地图发生后发送输出。
有没有办法这样做?
编辑 - 解释我为什么要这样做:
我正在实施算法冠层。 我的计划是在我拥有的每台机器上运行遮篷,并找到它的本地数据的质心。
一旦找到局部质心,我想向reducer发送当地质心以及与它们相关的点数。
例如: 机器#1找到3个质心,每个都有30个视图。 我想提交减少(质心,观点)。 但问题是,只有在机器的所有地图功能运行后,我才会知道这些视图。 这就是为什么我想发送机器映射器的输出以减少一次全部运行。
答案 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。