2010-02-26 58 views
2

我有一个计算任务被拆分成几个单独的程序执行,并且依赖关系。我使用Condor 7作为任务调度程序(使用Vanilla Universe,由于对无法实现的程序有所限制,因此不涉及检查点设置),因此DAG看起来像是一个自然的解决方案。但是有些程序需要在同一台主机上运行。在Condor手册中我找不到如何做到这一点的参考。使用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.

感谢您的帮帮我。

回答

2

神鹰没有任何简单的解决办法,但至少有一个杂牌,应该工作:

具有B-留下一些国家背后的执行节点上,可能在一个文件的形式,即说了什么像MyJobRanHere=UniqueIdentifier"。使用STARTD_CRON support来检测这个广告它在机器ClassAd中。有D使用Requirements=MyJobRanHere=="UniqueIdentifier"。 D的最后清理的一部分,或者也许是一个新的节点E,它将删除状态。如果你通过大量工作,你可能需要偶尔清除遗留状态。

+0

好伎俩,我采用了一种相似和简单的方法,最后:作业B和D都在同一个脚本中运行,但D等待C在共享驱动器上的已知位置创建一个文件。 – 2010-09-06 06:50:16

1

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

在Condor的同一主机上将两个作业保持在一起,而不事先将它们锁定到特定主机,DAG或没有DAG,通常相当困难。我实际上想不出一种真正可行的方法来让B在C或C之前开始B之前开始。如果你愿意强制B必须始终在C之前开始,那么你可以参与工作B的一部分当它开始运行时,请修改Job C的ClassAd的Requirements部分,以便它具有“Machine ==”字符串,其中是机器B的名称。这还需要提交作业C,直到B正在运行,B还将作为其启动工作的一部分发布。

这是相当复杂的...

所以我只是有一个想法:你可以用秃鹰的动态startd /插槽的功能和折叠您的DAG达到你想要的东西。在当前有两个单独节点B和C的DAG中,您可以将它折叠到一个节点B'中,该节点在机器上启动时可同时运行B和C.作为工作要求的一部分,您注意到它需要一台机器上的2个CPU。切换你的startd以使用动态插槽配置,以便机器公布其所有资源,而不仅仅是静态分配的插槽。现在,您一直在一台机器上同时运行B和C.如果在有大量单CPU作业的队列中有几个多CPU作业,那么动态插槽会遇到一些问题,但这至少是一个更容易解决的问题。

另一种选择是用一个特殊的职业属性标记B”:

MultiCPUJob = True 

而就在机器上的插槽1个目标是:

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

而且有说静态插槽startd政策,“如果一个MultiCPUJob = True的作业试图在我的插槽1上运行,抢先于该机器上第2个插槽中的任何作业,因为我知道这个作业需要2个核心/ CPU”。

这是效率低下的,但可以用任何版本的Condor过去的6.8.x来完成。我实际上在我自己的静态分区农场中使用这种类型的设置,所以如果一项工作需要一台机器来进行基准测试,那么它可能会发生,而无需重新配置机器。

如果您有兴趣了解更多关于抢先选项的信息,请告诉我们,我可以指出您在condor-user列表存档中进一步阅读配置。

+0

感谢您的提示。 – 2010-03-09 08:28:36

+0

邮件发送,如果我得到有意义的答案,总结在这里 – 2010-03-24 09:59:54

+0

没有答案的清单:-(也许这是不可行的,我会解决这个问题 – 2010-04-17 11:27:35

1

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

  1. 节点A定义后脚本

  2. 后处理脚本搜索condor_history为完成节点A的群ID 。类似condor_history -l -attribute LastRemoteHost -m1 $JOB_ID ...您需要清理输出以及不需要的东西,但是您将与运行节点A的主机一起使用。

  3. 然后,后脚本搜索并修改相关作业提交文件,插入在他们的提交文件顶部的工作职位要求。只要确保你逐步建立你的工作要求,以便他们拿起这个新的要求,如果它存在。

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

我这样做目前有很多工作。它效果很好。