hadoop:任务不是文件本地的?

 阿斌之摩羯座 发布于 2023-02-09 11:27

我运行了一个hadoop作业,当我查看一些map任务时,我发现它们没有运行文件块的位置.例如,map任务在slave1上运行,但文件块(所有这些)都在slave2中.这些文件都是gzip.

为什么会发生这种情况以及如何解决?

更新:请注意,有许多待处理的任务,因此这不是节点空闲的情况,因此托管从其他节点读取的任务.

1 个回答
  • Hadoop的默认(FIFO)调度程序的工作方式如下:当节点具有备用容量时,它会与主服务器联系并请求更多工作.主服务器尝试分配数据本地任务或机架本地任务,但如果不能,则会将队列中的任何任务(等待任务)分配给该节点.但是,在为此节点分配此非本地任务(我们将其称为任务X)时,另一个节点也可能具有备用容量并联系主要求工作.即使该节点实际上具有X所需的数据的本地副本,也不会分配该任务,因为另一节点能够比后一节点稍快地获取对主节点的锁定.这会导致数据局部性较差,但FAST任务分配较差.

    相比之下,Fair Scheduler使用一种称为延迟调度的技术,通过将非本地任务分配延迟为"一点点"(可配置)来实现更高的局部性.它实现了更高的局部性,但延迟了一些任务的成本很低.

    其他人正在研究更好的调度程序,这可能会在未来得到改善.目前,如果您希望获得更高的数据位置,可以选择使用Fair Scheduler.

    我不同意@ donald-miner的结论:"默认复制因子为3,你看不到很多非本地数据的任务." 他注意到更多的副本会提高你的地点百分比是正确的,但数据本地任务的百分比可能仍然很低.我自己也进行了实验,并且使用FIFO调度程序看到了非常低的数据局部性.如果您的工作很大(有很多任务),您可以实现高位置,但对于更常见,更小的工作,他们会遇到称为"行头调度"的问题.引用本文:

    第一个位置问题发生在小型作业中(具有较小输入文件的作业,因此需要读取少量数据块).问题在于,只要作业到达排序列表的头部(即运行任务最少),其任务之一就会在下一个空闲的插槽上启动,无论该插槽位于哪个节点上.如果行头作业很小,则不太可能在节点上提供数据.例如,具有10%节点数据的作业将仅实现10%的位置.

    该文件继续引用Facebook生产集群中的数据,他们报告说在大型生产环境中仅观察到5%的数据位置.

    最后注意事项:如果您的数据位置较低,您是否应该关心?不是太多.作业的运行时间可能由落后者(需要更长时间才能完成的任务)和随机播放阶段所主导,因此改善数据局部性只会在运行时间方面有非常适度的改善(如果有的话).

    2023-02-09 11:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有