Hadoop CapacityScheduler插槽预留方案是否会造成死锁?

时间:2013-09-10 03:25:01

标签: hadoop mapreduce

如果可用内存不满足正在调度的作业的需要(在TaskSchedulingMgr.getTaskFromQueue(...)中),Hadoop CapacityScheduler会在TaskTracker上保留插槽。但是,这会造成任何僵局吗?假设我有两个不同队列的两个不同的作业,每个映射任务需要3个插槽。每台机器只有4个地图插槽。首先,当安排作业1时,机器A上有2个可用插槽,因此作业1保留这2个插槽。稍后,当在机器A上安排作业2时,另外2个插槽变得可用,因此作业2保留剩余的两个插槽。在这种情况下,作业1或作业2都不会在机器A上获得足够的插槽。

CapacityScheduler中是否有任何方案可以防止这种情况发生?

1 个答案:

答案 0 :(得分:2)

好问题!我不知道答案,所以没有比运行它更好的方法:)

让我们只考虑故事的Reduce版本,我可以看到两种方式来看待这个:

  1. 需要减少3个任务才能完成工作的减少阶段
  2. 减少需要三个虚拟插槽的任务 存储器
  3. 在这两种情况下,作业都会在彼此前后几分之一的时间内发送到作业跟踪器。在两种情况下,第二个作业都被强制暂停,直到第一个作业完成。没有发生死锁。从第二个到完成,资源都会缺乏资源。关于没有这种死锁的原因我的“猜测”是“其他”当前未使用的队列的“剩余未使用”资源被分配给正在运行的作业以构成运行它所需的资源。因此饿死了第二个,并暂停。

    当然,#2的结果是每个任务一次运行一个,因为每个任务等待直到3个可用空间,因此每个任务有效地一次执行一个。希望有所帮助。