使用DAG的Condor作业,其中一些作业需要运行相同的主机

时间:2010-02-26 07:09:32

标签: workflow distributed cluster-computing hpc condor

我有一个计算任务,它被拆分为几个单独的程序执行,具有依赖性。我正在使用Condor 7作为任务调度程序(使用Vanilla Universe,由于对程序的限制超出了我的范围,因此不涉及检查点),因此DAG看起来像是一个自然的解决方案。但是,某些程序需要在同一主机上运行。我在Condor手册中找不到关于如何做到这一点的参考。

示例DAG文件:

JOB  A  A.condor 
JOB  B  B.condor 
JOB  C  C.condor    
JOB  D  D.condor
PARENT A CHILD B C
PARENT B C CHILD D

我需要表明B和D需要在同一个计算机节点上运行,而不会破坏B和C的并行执行。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

Condor没有任何简单的解决方案,但至少有一个应该有效的方法:

让B在执行节点上留下一些状态,可能是文件形式,类似MyJobRanHere=UniqueIdentifier"。使用STARTD_CRON support检测到这一点,并在机器ClassAd中对其进行广告宣传。让D使用Requirements=MyJobRanHere=="UniqueIdentifier"。作为D的最终清理的一部分,或者可能是新的节点E,它会移除状态。如果您正在运行大量工作,您可能需要偶尔清理剩余状态。

答案 1 :(得分:1)

我不知道答案,但你应该在Condor Users邮件列表上提出这个问题。在Condor中支持DAG功能的人员会对其进行监控并做出响应。有关订阅信息,请参阅this page。流量相当低。

通常很难将两个作业放在Condor的同一主机上,而不事先将它们锁定到特定主机,DAG或没有DAG。我实际上想不出一个真正可行的方法来让B在C或C开始之前B开始。如果你愿意强制执行B必须总是在C之前开始你可以做部分工作那个工作B当它开始运行时,修改Job C的ClassAd的Requirements部分,使其具有“Machine ==”字符串,其中是登陆的机器B的名称。这还要求在B运行之前提交或不提交作业C,B也必须在启动工作中将其发布。

这很复杂......

所以我只想到了:你可以使用Condor的动态启动/插槽功能并折叠你的DAG来实现你想要的。在您的DAG中,您当前有两个单独的节点B和C,您可以将其折叠为一个节点B',它在机器上启动时将并行运行B和C.作为工作要求的一部分,您注意到它在一台机器上需要2个CPU。切换你的startd以使用动态插槽配置,这样机器就可以宣传他们所有的资源,而不仅仅是静态分配的插槽。现在你总是在一台机器上同时运行B和C.当您在具有大量单CPU作业的队列中有一些多CPU作业时,动态插槽存在一些饥饿问题,但这至少是一个更容易解决的问题。

另一种选择是用特殊的工作属性标记B':

MultiCPUJob = True

并将其定位在机器的第1位:

Requirements = Slot == 1 &&  ...your other requirements...

并且有一个静态插槽启动策略,上面写着“如果MultiCPUJob = True的作业尝试在我的插槽1上运行,请抢占该机器上插槽2中的任何作业,因为我知道这个作业需要2核/ CPU的”。

效率低,但可以使用6.8.x以后的任何版本的Condor。我实际上在我自己的静态分区农场中使用这种类型的设置,因此如果一个工作需要一台机器来进行基准测试,它可以在不重新配置机器的情况下发生。

如果您有兴趣了解有关抢占选项的更多信息,请通知我,我可以向您指出在condor-user列表档案中进行更多配置阅读。

答案 2 :(得分:1)

这里的解决方案是使用以下事实:即使DAGMan正在运行,只要DAGMan尚未提交节点,您就可以修改提交描述。假设A -> B -> C的简单DAG。如果您希望所有节点在同一主机上运行,​​您可以执行以下操作:

  1. 在节点A上定义POST脚本。

  2. 帖子脚本会在condor_history中搜索已完成节点A的ClusterId。例如condor_history -l -attribute LastRemoteHost -m1 $JOB_ID ...您需要清理输出,但不是,但是您需要清除输出;留下运行节点A的主机。

  3. 然后,post脚本搜索并修改相关作业提交文件,并在其中插入提交文件顶部的作业作业要求。只需确保逐步建立您的工作要求,以便他们在存在时接受这一新要求。

  4. 当帖子脚本完成后,DAGMan将会提交准备好的节点,在本例中我们有一个节点:B。现在将使用您在步骤3中添加的新要求完成B的提交,以便它将在与A相同的执行主机上运行。

  5. 我目前做了很多工作。它很棒。