【问题标题】:Condor job using DAG with some jobs needing to run the same host使用 DAG 的 Condor 作业和一些需要运行同一主机的作业
【发布时间】:2011-01-21 08:27:08
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

    标签: workflow distributed cluster-computing hpc condor


    【解决方案1】:

    Condor 没有任何简单的解决方案,但至少有一种方法可以解决问题:

    让 B 在执行节点上留下一些状态,可能是以文件的形式,上面写着MyJobRanHere=UniqueIdentifier"。使用STARTD_CRON support 检测到这一点,并在机器 ClassAd 中发布广告。让 D 使用Requirements=MyJobRanHere=="UniqueIdentifier"。 D 最终清理的一部分,或者可能是一个新节点 E,它删除了状态。如果您正在运行大量作业,您可能需要偶尔清除剩余的状态。

    【讨论】:

    • 好把戏。最后,我采用了类似且更简单的方法:作业 B 和 D 在同一个脚本中运行,但 D 等待 C 在共享驱动器上的已知位置创建文件。
    【解决方案2】:

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

    如果不提前将它们锁定到特定的主机(DAG 或无 DAG),在 Condor 的同一主机上保持两个作业通常相当困难。我实际上想不出一种真正可行的方法来做到这一点,让 B 在 C 之前开始或 C 在 B 之前开始。如果你愿意强制 B 必须始终在 C 之前开始,你就可以完成工作 B 的部分工作当它开始运行时会修改作业 C 的 ClassAd 的 Requirements 部分,以便它有一个“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...
    

    并且有一个静态 slot startd 策略,上面写着:“如果 MultiCPUJob=True 的作业试图在我的 slot 1 上运行,我会抢占恰好在这台机器上 slot 2 中的任何作业,因为我知道这个作业需要 2核心/CPU”。

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

    如果您有兴趣了解有关该抢占选项的更多信息,请告诉我,我可以在 condor-user 列表档案中为您提供一些进一步的配置阅读。

    【讨论】:

    • 发了邮件,如果我得到有意义的答案会在这里总结
    • 列表中没有答案 :-( 也许这不可行。我会解决这个问题。
    • 是的,这对我来说听起来很难。
    【解决方案3】:

    这里的解决方案是使用这样一个事实,即只要 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 相同的执行主机上运行。

    我目前从事这方面的工作很多。效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2012-03-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多