我正在准备考试,讲稿上有一个问题:
Why Map tasks outputs are written to the local disk and not to HDFS?
以下是我的想法:减少网络流量使用,因为reducer可能与输出在同一台机器上运行,因此不需要复制。不需要hdfs的容错性。如果任务半途而废,我们总是可以重新运行map任务。其他可能的原因是什么?我的回答合理吗?
jw5wzhpr1#
因为它不使用宝贵的集群带宽。这称为数据局部性优化。但是,有时,为map任务的输入剥离托管hdfs块副本的所有节点都在运行其他map任务,因此作业调度器将在与其中一个块位于同一机架中的节点上查找空闲的map插槽。有时甚至不可能做到这一点,因此使用机架外节点,从而导致机架间网络传输。来自“hadoop最终指南4版”
j2datikz2#
有一点我知道写Map输出到本地文件系统,输出的所有Map最终得到合并,并最终作出了输入洗牌和排序阶段之前的减速器阶段。
jexiocij3#
你的理由是正确的。不过,我想补充几点:如果map输出被写入hdfs会怎么样。现在,写入hdfs与写入本地磁盘不同。这是一个更复杂的过程,namenode至少保证 dfs.replication.min 副本写入hdfs。namenode还将运行一个后台线程,为复制不足的块创建额外的副本。假设,用户在两个作业之间终止了作业,或者作业失败了。在hdfs上会有很多中间文件,您必须手动删除它们。如果这个过程发生太多次,集群的性能就会下降hdfs优化了附加,而不是频繁删除。另外,在Map阶段,如果作业失败,它会在退出之前执行清理。如果是hdfs,则删除过程将要求namenode向相应的datanodes发送块删除消息,这将导致该块失效并从中删除 blocksMap . 这么多的操作只为失败的清理而毫无收获!!
dfs.replication.min
blocksMap
3条答案
按热度按时间jw5wzhpr1#
因为它不使用宝贵的集群带宽。这称为数据局部性优化。但是,有时,为map任务的输入剥离托管hdfs块副本的所有节点都在运行其他map任务,因此作业调度器将在与其中一个块位于同一机架中的节点上查找空闲的map插槽。有时甚至不可能做到这一点,因此使用机架外节点,从而导致机架间网络传输。
来自“hadoop最终指南4版”
j2datikz2#
有一点我知道写Map输出到本地文件系统,输出的所有Map最终得到合并,并最终作出了输入洗牌和排序阶段之前的减速器阶段。
jexiocij3#
你的理由是正确的。
不过,我想补充几点:如果map输出被写入hdfs会怎么样。
现在,写入hdfs与写入本地磁盘不同。这是一个更复杂的过程,namenode至少保证
dfs.replication.min
副本写入hdfs。namenode还将运行一个后台线程,为复制不足的块创建额外的副本。假设,用户在两个作业之间终止了作业,或者作业失败了。在hdfs上会有很多中间文件,您必须手动删除它们。如果这个过程发生太多次,集群的性能就会下降hdfs优化了附加,而不是频繁删除。
另外,在Map阶段,如果作业失败,它会在退出之前执行清理。如果是hdfs,则删除过程将要求namenode向相应的datanodes发送块删除消息,这将导致该块失效并从中删除
blocksMap
. 这么多的操作只为失败的清理而毫无收获!!