如果可用内存不能满足被调度作业的需要,Hadoop CapacityScheduler 会在 TaskTracker 上保留插槽(在 TaskSchedulingMgr.getTaskFromQueue(...) 中)。但是,这会造成任何僵局吗?假设,我有来自两个不同队列的两个不同作业,每个映射任务需要 3 个槽。每台机器只有 4 个 map 槽。起初,作业1被调度时,机器A上有2个slot可用,因此作业1保留了这2个slot。稍后,当作业 2 在机器 A 上被调度时,又有 2 个槽位可用,因此作业 2 保留了剩余的两个槽位。在这种情况下,作业 1 或作业 2 都不会获得足够的插槽在机器 A 上执行。
CapacityScheduler 中是否有任何方案可以防止这种情况发生?
最佳答案
好问题!我也不知道答案,所以没有比运行它更好的检查方法了:)
让我们只考虑故事的 Reduce 版本,我可以通过两种方式来看待这个问题:
在这两种情况下,作业都会比彼此提前/落后几分之一秒发送到作业跟踪器。在这两种情况下,第二个作业都被迫暂停,直到第一个作业完成。不会发生死锁。资源从第二个到完成都处于饥饿状态。我对没有这种死锁的原因的“猜测”是,“其他”当前未使用队列的“剩余未使用”资源被分配给正在运行的作业,以补充运行它所需的资源。因此使第二个挨饿,并暂停。
自然地,#2 的一个结果是每个任务一次运行一个,因为每个任务等待直到 3 个槽可用,因此每个任务有效地一次执行一个。希望有所帮助。
关于hadoop - Hadoop CapacityScheduler slot reservation scheme 会死锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18710237/