2

我有一个计算任务,它被分成几个单独的程序执行,具有依赖关系。我使用 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的并行执行。

谢谢你的帮助。

4

3 回答 3

2

Condor doesn't have any simple solutions, but there is at least one kludge that should work:

Have B leave some state behind on the execute node, probably in the form of a file, that says something like MyJobRanHere=UniqueIdentifier". Use the STARTD_CRON support to detect this an advertise it in the machine ClassAd. Have D use Requirements=MyJobRanHere=="UniqueIdentifier". A part of D's final cleanup, or perhaps a new node E, it removes the state. If you're running large numbers of jobs through, you'll probably need to clean out left-over state occasionally.

于 2010-09-03T21:09:21.890 回答
1

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

如果不提前将它们锁定到特定的主机(DAG 或没有 DAG),在 Condor 的同一主机上保持两个作业通常相当困难。我实际上想不出一种真正可行的方法来做到这一点,让 B 在 C 之前开始或 C 在 B 之前开始。如果你愿意强制 B 必须始终在 C 之前开始,你就可以完成工作 B 的部分工作当它开始运行时会修改作业 C 的 ClassAd 的需求部分,使其具有“Machine ==”字符串,其中机器 B 的名称是登陆的。这也要求在 B 运行之前提交作业 C 或根本不提交,B 还必须将其作为其启动工作的一部分释放。

这很复杂...

所以我有一个想法:你可以使用 Condor 的动态 startd/slots 功能并折叠你的 DAG 来实现你想要的。在您的 DAG 中,您当前有两个单独的节点 B 和 C,您可以将其折叠成一个节点 B',当 B 和 C 在一台机器上启动时,它会并行运行 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 列表档案中的一些进一步配置阅读。

于 2010-03-09T04:46:19.867 回答
1

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

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

  2. post 脚本搜索condor_history已完成节点 A 的 ClusterId。类似于condor_history -l -attribute LastRemoteHost -m1 $JOB_ID ...您需要清理输出等内容,但您将留下运行节点 A 的主机。

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

  4. 当 post 脚本完成后,DAGMan 将寻找提交就绪节点,在本例中我们有一个:B. 现在将使用您在步骤 3 中添加的新要求完成 B 的提交,以便它将在与A.

我目前有很多工作。它工作得很好。

于 2014-12-21T15:48:57.263 回答