阅读有关MapReduce的论文,并提到将所有中间键排序到一起。
当减少工作人员已阅读全部 中间数据,它通过中间键对它进行排序 相同键的出现被组合在一起。排序是 需要因为通常许多不同的键映射到相同的减少 任务。如果中间数据量太大而无法容纳 内存,使用外部排序
有人提到在多台机器上执行相同的减少任务。
当reduce任务完成时,reduce worker会原子地重命名它 临时输出文件到最终输出文件。如果相同减少 任务在多台机器上执行,多次重命名调用 为同一个最终输出文件执行。
如果将相同的密钥组合在一起,那么这不会成为一个减少工作的减少任务吗?如何在多台机器上运行相同的reduce任务?
答案 0 :(得分:1)
我认为你错了。这意味着如果单个reduce任务足够大,那么它不是在单个机器上处理它而是在多台机器上处理,然后从机器输出文件被重命名,聚合并呈现为单个输出文件。
同一节点上可能会发生多个reduce过程。它依赖于该节点的速度,如果它与其他节点相比足够快以处理reduce任务,如果是,则再次使用另一个reduce任务进行处理。
有关更多信息,请参阅 https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html 本文档中有一个主题"减少多少? "我认为这将解决您的疑问。
我希望我能够解决您的问题。
答案 1 :(得分:1)
。如果在多台计算机上执行相同的reduce任务,则将对同一个最终输出文件执行多次重命名调用。
由于投机性执行,这是可能的。
如果特定的Map或Reduce任务需要很长时间,Hadoop Framework会在不同的计算机上启动相同的任务,推测长时间运行的任务存在一些问题。长时间运行任务的缓慢可能是由网络故障,繁忙的机器或故障硬件引起的。
您可以在此SE问题中找到有关此概念的更多详细信息:
Hadoop speculative task execution
来自Apache文档page @任务副作用文件:
同一Mapper或Reducer的两个实例同时运行(例如,推测性任务)尝试打开和/或写入FileSystem上的同一文件(路径)时可能会出现问题。因此,应用程序编写者必须为每次任务尝试选择唯一的名称(使用尝试,例如
attempt_200709221812_0001_m_000000_0
),而不仅仅是按任务。为了避免这些问题,当OutputCommitter是FileOutputCommitter时,MapReduce框架维护一个特殊的
${mapreduce.output.fileoutputformat.outputdir}/_temporary/_${taskid}
子目录,可以通过${mapreduce.task.output.dir}
访问文件系统上的每个任务尝试,其中任务的输出 - 尝试存储。