只有在所有映射运行后,我才需要在一台计算机中发送映射器的输出。
例如:
如果1号计算机运行他的地图功能1000次,我希望在所有1000张地图发生后发送输出。
有什么办法吗?
编辑-解释我为什么要这样做:
我正在实现算法遮篷。我的计划是在我拥有的每台机器上运行遮篷,并找到它的本地数据的质心。
一旦我找到了要发送到reducer的局部质心,以及与它们相关的点的数量。
例如:机器#1发现了3个质心,每个质心有30个视图。我想提交减少(质心,视图)。但问题是,只有在机器的所有地图功能运行后,我才能知道视图。这就是为什么我想发送机器映射器的输出,以便在全部运行后进行reduce。
实现接近这一点的唯一方法是调整配置属性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>
但是,错误调整此设置可能会损害集群的吞吐量。通常,减速器可以在完成映射任务时尽早开始从映射任务中获取中间映射输出。将其调整为1.0将防止减速器在完成所有映射任务之前获取任何内容。当最后一个映射任务完成并且缩减器开始获取时,这将导致网络带宽利用率的突然爆发。
通常,减速器获取映射输出的时间不应改变MapReduce程序的正确性。这一切都发生在MapReduce洗牌的内部。最终呈现给reducer代码的数据将是相同的,而与reducer获取映射输出的时间无关。
在映射任务完成之前,除了将映射器输出复制到reducer节点之外,reducer端不会发生任何事情。减速器只有在所有地图任务完成后才启动。你想这么做有什么具体的原因吗?
将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>
这对hadoop1.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。