阅读有关mapreduce的文章时,提到了将所有中间键分类到一起。
当reduce worker读取了所有中间数据时,它会按中间键对其进行排序,以便将同一个键的所有匹配项分组在一起。排序是必要的,因为通常许多不同的键Map到同一个reduce任务。如果中间数据量太大,无法放入内存,则使用外部排序
这里提到了在多台机器上执行相同的reduce任务。
当reduce任务完成时,reduce工作进程会自动将其临时输出文件重命名为最终输出文件。如果在多台机器上执行相同的reduce任务,则将对同一最终输出文件执行多个rename调用。
如果相同的键被分组在一起,那不是一个reduce工作者要运行的reduce任务吗?如何在多台机器上运行相同的reduce任务?
2条答案
按热度按时间svdrlsy41#
我想你搞错了。这意味着,如果一个reduce任务足够大,那么它不是在一台机器上处理,而是在多台机器上处理,然后将机器上的输出文件重命名、聚合并显示为单个输出文件。
同一个节点上可以发生多个reduce进程。它取决于该节点的速度,如果它足够快,以处理减少任务相比,其他节点,如果是,然后它再次与另一个减少任务饲料。
有关更多信息,请参阅https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapreducetutorial.html 这份文件中有一个主题“减少多少?”我想这会解决你的问题。
我希望我能解决你的问题。
8wtpewkr2#
. 如果在多台机器上执行相同的reduce任务,则将对同一最终输出文件执行多个rename调用。
这有可能是因为推测性的执行。
如果一个特定的map或reduce任务需要很长时间,hadoop框架会在不同的机器上启动相同的任务,推测长时间运行的任务有一些问题。长时间运行任务的缓慢可能是由网络故障、机器繁忙或硬件故障造成的。
你可以在这个问题中找到更多关于这个概念的细节:
hadoop推测性任务执行
从apache文档页@task side-effect files:
同一Map器或缩减器的两个示例同时运行(例如,推测性任务)试图打开和/或写入文件系统上的同一文件(路径)时可能会出现问题。因此,应用程序编写器必须为每个任务尝试选择唯一的名称(例如,使用attemptid)
attempt_200709221812_0001_m_000000_0
),而不仅仅是每个任务。为了避免这些问题,当outputcommitter为fileoutputcommitter时,mapreduce框架会维护一个特殊的
${mapreduce.output.fileoutputformat.outputdir}/_temporary/_${taskid}
子目录可通过${mapreduce.task.output.dir}
对于存储任务尝试输出的文件系统上的每个任务尝试。