我正准备参加考试,这是讲义中的一个问题:
Why Map tasks outputs are written to the local disk and not to HDFS?
以下是我的想法:
其他可能的原因是什么?我的答案合理吗?
答案 0 :(得分:7)
你的推理是正确的。
但是我想补充一点:如果地图输出写入hdfs会怎样。
现在,写入hdfs与写入本地磁盘不同。它是一个更复杂的进程,namenode确保至少dfs.replication.min
个副本写入hdfs。并且namenode还将运行后台线程为下复制的块创建额外的副本。
假设,用户在两者之间杀死作业或者作业失败。 hdfs上会有很多中间文件无缘无故你必须手动删除。如果此过程发生的次数过多,则您的群集会执行并会降级。 Hdfs针对追加而非频繁删除进行了优化。另外,在映射阶段,如果作业失败,它会在退出前执行清理。如果是hdfs,则删除过程将要求namenode将块删除消息发送到适当的数据节点,这将导致该块无效并将其从blocksMap
中删除。如此多的操作只涉及清理失败而无法获得!!
答案 1 :(得分:0)
因为它不使用宝贵的群集带宽。这称为数据局部性优化。但是,有时,托管用于映射任务的输入拆分的HDFS块副本的所有节点都在运行其他映射任务,因此作业调度程序会在与其中一个块相同的机架中的节点上寻找空闲的映射槽。有时甚至是不可能的,因此使用机架外节点,这导致机架间网络传输。
来自“ Hadoop权威指南4版”
答案 2 :(得分:-1)
我知道将地图输出写入本地文件系统有一点,所有映射器的输出最终会合并,最后为在Reducer阶段之前的洗牌和排序阶段输入。