【发布时间】:2016-04-29 03:28:46
【问题描述】:
当 mapreduce 作业运行时,map 任务结果存储在本地文件系统中,然后来自 reducer 的最终结果存储在 hdfs 中。问题是
- map 任务结果存储在本地文件系统中的原因是什么?
- 对于没有reduce阶段(只有map阶段存在)的map reduce作业,最终结果存储在哪里?
【问题讨论】:
当 mapreduce 作业运行时,map 任务结果存储在本地文件系统中,然后来自 reducer 的最终结果存储在 hdfs 中。问题是
【问题讨论】:
1) Mapper 输出存储在本地 fs 中,因为在大多数情况下,我们对 Reducer 阶段给出的输出感兴趣(也称为最终输出)。Mapper <K,V> pair is intermediate output 一旦传递给 Reducer,它的重要性就最低了.如果我们将 Mapper 输出存储在 hdfs 中,这将浪费存储空间,因为 hdfs 具有复制因子(默认为 3),因此在进一步处理中根本不需要的数据将占用 3 倍的空间。
2) 对于map only job,最终输出存储在hdfs中。
【讨论】:
1) TaskTracker(TT) 映射器逻辑完成后,在将输出发送到 Sort 和 Shuffle 阶段之前,TT 会将 o/p 存储在 临时文件(LFS) 这是为了避免在网络故障的情况下再次启动整个 MR 作业。一旦存储在 LFS 中,映射器输出可以直接从 LFS 中提取。这个数据称为 中间数据,概念称为 数据本地化
一旦作业完成,这些中间数据将被删除。否则,随着时间的推移,LFS 的大小会随着来自不同作业的中间数据而增长。
数据本地化仅适用于Mapper阶段,不适用于Sort & Shuffle、Reducer阶段
2)当没有reducer阶段时,中间数据最终会被推送到HDFS上。
【讨论】:
map任务结果存储在本地文件系统的原因是什么?
Mapper 输出是临时输出,仅与Reducer 相关。在 HDFS 中存储临时输出(带有复制因子)是多余的。由于这个原因,Hadoop 框架将 Mapper 的输出存储到本地文件系统而不是 HDFS 系统中。它节省了大量的磁盘空间。
Apache 教程page 中更重要的一点:
与给定输出键关联的所有中间值随后由框架分组,并传递给 Reducer 以确定最终输出。
Mapper 输出经过排序,然后按 Reducer 分区
对于没有reduce阶段(只有map阶段存在)的map reduce作业,最终结果存储在哪里?
您可以从 Apache 教程页面了解有关此查询的更多详细信息。
减速器无
如果不需要减少,将减少任务的数量设置为零是合法的。
在这种情况下,映射任务的输出直接进入文件系统,进入由 FileOutputFormat.setOutputPath(Job, Path) 设置的输出路径。在将地图输出写入文件系统之前,框架不会对地图输出进行排序。
如果 Reducer 的数量大于 0,则 mapper 输出存储在本地文件系统中,并在发送到 Reducer 之前对其进行排序。如果 Reducer 的数量为 0,则 mapper 输出存储在 HDFS 中而不进行排序。
【讨论】: