Condor 入门

作者:Irfan Habib

集群计算兴起于 1990 年代初期,当时硬件价格正在下降,个人电脑变得越来越强大。公司正在从大型小型计算机转向小型且强大的微型计算机,许多人意识到这将导致计算能力的巨大浪费,因为计算资源正变得越来越分散。如今,组织机构的办公室里有数百甚至数千台个人电脑。其中许多电脑大部分时间都处于空闲状态。然而,同样的组织机构也面临着巨大的计算密集型问题,因此需要强大的计算能力来保持竞争力——因此,对主要基于集群计算概念构建的超级计算解决方案的需求依然稳定。

许多供应商提供商业集群计算解决方案。通过使用免费和开源软件,可以避免购买这些昂贵的商业集群计算解决方案,并建立自己的集群。本文介绍了一种由威斯康星大学开发的名为 Condor 的解决方案。

Condor 背后的想法很简单。将其安装在您想使其成为集群一部分的每台机器上。(在 Condor 术语中,Condor 集群被称为池。本文交替使用这两个术语。)您可以从任何机器启动作业,Condor 会将作业的需求与当前可用空闲计算机提供的能力相匹配。一旦找到合适的空闲机器,它会将作业传输到该机器,执行作业并检索执行结果。Condor 的一个特点是它不需要修改程序即可在集群上运行。

然而,在实践中,Condor 更加复杂。Condor 在每台机器上以不同的配置安装。每个 Condor 池都有一个中央管理器。顾名思义,中央管理器是集群的中央管理单元。它管理新空闲机器的检测,并协调作业需求和可用资源之间的匹配。Condor 池中的机器也可以具有提交和完整安装配置。提交机器是那些只能提交作业但不能运行任何作业的机器;完整安装机器是可以同时执行提交和运行作业的机器。

要求和安装

Condor 不需要向网络添加任何新硬件;现有网络本身就足够了。Condor 可以运行在各种操作系统上,包括 Linux、Solaris、Digital Unix、AIX、HP-UX 和 Mac OS X 以及 MS Windows 2000 和 XP。它支持各种架构,包括 Intel x86、PowerPC、SPARC 等。但是,在一个特定架构(如 Intel x86)上开发的作业只能在 Intel x86 计算机上运行。因此,最好 Condor 池中的所有计算机都采用单一架构。但是,Java 应用程序可以在不同的架构上运行。

在本文中,我们将介绍从 Linux 上的基本 tarball 压缩包进行安装,尽管也可能可以从官方站点或来源获得特定于发行版/操作系统的软件包。(有关更多详细信息,请参阅 Condor 项目站点:www.cs.wisc.edu/condor/downloads。)

从项目站点下载 tarball 压缩包,并使用以下命令解压缩:

tar -zvf condor.tar.gz

位于 sbin 目录中的 condor_install 脚本是您在机器上设置 Condor 所需要运行的全部内容。在运行此脚本之前,添加一个名为 condor 的用户。出于安全原因,Condor 不允许您以 root 用户身份运行作业;因此,建议创建一个新用户来保护系统。

脚本提出的首批问题之一是您要设置多少台机器作为池的一部分?如果您有共享文件系统,这很重要。如果您有,安装脚本将提示您输入这些机器的名称,并且在这些机器上安装 Condor 将由软件本身处理。如果不存在共享文件系统,则必须在每个系统上手动安装 Condor。此外,如果您想能够使用 Java 支持,则需要在安装 Condor 之前安装 Sun 的 Java 虚拟机。安装脚本为它提出的每个问题提供了大量的帮助和注释,您始终可以查阅 Condor 的综合用户手册及其相关的邮件列表以获得帮助。

从现在开始,变量 $CONDOR 用于表示 condor 安装(解压)到的根路径。

安装完成后,通过运行以下命令启动 Condor:

$CONDOR/bin/condor_master

此命令应衍生 Condor 所需的所有其他进程。在中央管理器上,您应该能够在输入以下命令后看到五个 condor_ 进程正在运行:

ps -aux | grep condor

在中央管理器机器上,您应该有以下进程:

  • condor_master

  • condor_collector

  • condor_negotiator

  • condor_startd

  • condor_schedd

池中的所有其他机器都应具有以下进程:

  • condor_master

  • condor_startd

  • condor_schedd

并且,在仅提交机器上,您将看到:

  • condor_master

  • condor_schedd

之后,当您运行以下命令时,您应该能够看到中央管理器机器作为 Condor 集群的一部分:condor_status:

$CONDOR/bin/condor_status
Name OpSys Arch State Activity LoadAv Mem ActvtyTime Mycluster
LINUX INTEL Unclaimed Idle 0.115 3567 0+00:40:04
Machines Owner Claimed Unclaimed Matched Preempting
INTEL/LINUX 1    0    0    1    0    0
Total 1   0   0   1   0   0

如果您现在在池中的其他机器上运行condor_master您应该会在几分钟内(通常在五分钟左右)看到它们被添加到此列表中。

在新集群上启动作业

为了测试我们的新 condor 设置,让我们创建一个简单的“Hello Condor”作业:

#include
int main()
{ printf("Hello World!\n");}

使用 gcc 编译应用程序。

现在,要向 Condor 提交作业,我们需要编写一个提交文件。提交文件描述了 Condor 需要如何处理作业——即,它将从哪里获取应用程序的输入,在哪里生成输出,以及如果发生任何错误,应该将其存储在哪里。

Universe = Vanilla
Executable = hello
Output = hello.out
Input = hello.in
Error = hello.err
Log = hello.log
Queue

第一个 Universe 条目定义了 Condor 应在其中运行作业的运行时环境。有两个值得注意的 Universe:对于长时间运行的作业,例如那些将持续数周和数月的作业,建议使用 Standard Universe(标准 Universe),因为它确保了可靠性以及保存部分执行状态并在第一台机器崩溃时自动将作业重新定位到另一台机器的能力。这节省了大量重要的处理工作。但是,要使用 Standard Universe,应用程序必须是“condor 编译”的,并且需要源代码。Vanilla Universe(香草 Universe)适用于生命周期短的作业,但如果机器的稳定性得到保证,也可以执行长时间运行的作业。Vanilla 作业可以运行未经修改的二进制文件。

Condor 中的其他 Universe 包括 PVM、MPI 和 Java,分别用于 PVM、MPI 和 Java 应用程序。有关 Condor Universe 的更多详细信息,请查阅文档。

在本例中,我们的可执行文件名为 hello(传统的“Hello Condor”程序),并且我们正在使用 Vanilla Universe。Input、Output、Error 和 Log 指令告诉 Condor 要使用哪些文件作为 stdin、stdout 和 stderr,以及记录作业的执行。最后,Queue 指令指定要运行的程序副本数量。

在您准备好提交文件后,运行condor_submit hello.sub将其提交给 Condor。您可以使用以下命令检查作业的状态:condor_q,它将告诉您队列中有多少作业、它们的 ID 以及它们是正在运行还是空闲,以及一些统计信息。

Condor 还有许多其他功能;到目前为止,我们仅介绍了启动和运行它的基础知识。网上提供了许多教程,以及 Condor 手册 (www.cs.wisc.edu/condor/manual),它们将教您 Condor 的基本和高级功能。在阅读 Condor 手册时,请特别注意 Standard Universe,它允许您检查点您的作业,以及 Java Universe,它允许您无缝地运行 Java 作业。

您还可以将 Condor 添加到中央管理器和其他机器的启动序列中。您可以关闭集群机器,它们的作业将继续或在不同的机器上重新启动(取决于它是 Standard Universe 作业还是 Vanilla 作业)。这为管理系统提供了很大的灵活性。

超越集群

Condor 不仅仅关于集群。Condor 的一个扩展允许在一个机器池中提交的作业在另一个(独立的)Condor 池上执行。Condor 将此称为集群化(flocking)。如果提交作业的池中的机器无法运行该作业,则该作业将转移到另一个池。这通过池的特殊配置来实现。

最简单的集群化配置在 condor_config 文件中设置几个配置变量。例如,让我们设置一个环境,其中我们有两个集群 A 和 B,并且我们希望在 A 中提交的作业在 B 中执行。假设集群 A 的中央管理器位于 a.condor.org,而 B 的中央管理器位于 b.condor.org。以下是示例配置:

FLOCK_TO = b.condor.org
FLOCK_COLLECTOR_HOSTS = $(FLOCK_TO)
FLOCK_NEGOTIATOR_HOSTS = $(FLOCK_TO)

FLOCK_TO 变量可以指定多个池,方法是输入以逗号分隔的中央管理器列表。其他两个变量通常指向与 FLOCK_TO 相同的设置。必须在池 B 中设置的配置宏授权来自池 A 的作业集群化到池 B。以下是允许作业从 A 集群化到 B 的配置宏示例。与 FLOCK_TO 字段一样,FLOCK_FROM 允许用户授权来自特定池的传入作业的集群化。

FLOCK_FROM=a.condor.org
HOSTALLOW_WRITE_COLLECTOR = $(HOSTALLOW_WRITE), $(FLOCK_FROM)
HOSTALLOW_WRITE_STARTD = $(HOSTALLOW_WRITE), $(FLOCK_FROM)
HOSTALLOW_READ_COLLECTOR = $(HOSTALLOW_READ), $(FLOCK_FROM)
HOSTALLOW_READ_STARTD = $(HOSTALLOW_READ), $(FLOCK_FROM)

以上设置设置了从池 A 到池 B 的集群化,但没有反向集群化。要启用双向集群化,需要分别考虑每个方向。也就是说,在池 B 中,您需要将 FLOCK_TO、FLOCK_COLLECTOR_HOSTS 和 FLOCK_NEGOTIATOR_HOST 设置为指向池 A,并在池 A 中为 B 设置授权宏。

请注意 HOSTALLOW_WRITE 和 HOSTALLOW_READ。这些设置允许您定义允许加入您的池的主机,或者那些可以查看您的池的状态但不允许加入的主机。

Condor 提供了灵活的方式来定义主机。例如,可以仅允许属于特定子网的主机具有读取访问权限,如下所示:

HOSTALLOW_READ=127.6.45.*
Condor-G

将分布式 Condor 池连接在一起的另一种方法是使用 Condor 的网格计算功能,该功能利用 Globus 工具包 (www.globus.org)。Globus 工具包是一个开源软件工具包,用于构建网格系统和应用程序。它为网格资源上的身份验证、授权和远程作业提交(包括数据传输)提供了一个基础设施。Condor-G 是 Condor 的一个扩展,它为网格上遥远的资源提供了 Condor 的所有作业提交功能。

Condor-G 有点像是 Condor 池通往网格的网关。Condor-G 是一个程序,它管理作业队列以及一个或多个站点(这些作业可以在这些站点上执行)的资源。它使用 Globus 机制与这些资源通信,并将文件传输到这些资源以及从这些资源传输文件。有关设置 Condor-G 的更多详细信息,请查阅前面提到的 Condor 手册。

以下是在 Globus 上执行的作业的示例提交文件:

executable = mygridjob
globusscheduler = grid.sample.net/jobmanager
input=mygridi.txt
universe = globus
output = mygridjob.out
log = mygridjob.log

queue

如您所见,网格作业和普通本地池作业只有两个不同之处。Universe 是 Globus,它告诉 Condor 此作业将计划到网格。并且,我们指定了 globusscheduler,它指向远程站点的 Globus 作业管理器。jobmanager 是在远程站点衍生的 Globus 服务,用于提交、跟踪和管理在本地系统上运行的作业的网格 I/O。可以使用 condor_q 以与普通 Condor 作业相同的方式监控网格作业。

结论

Condor 提供了独特的可能性,即利用我们当前的计算基础设施和投资来处理那些超出我们最强大系统能力的作业。Condor 是一款易于安装且易于使用的软件,用于设置集群。Condor 是可扩展的。它提供了扩展其覆盖范围的选项,从单个集群到可以位于世界任何地方的互连集群。Condor 一直是许多网格计算项目的基本软件。新闻界报道了许多 Condor 的成功案例。最近的一个案例是 Micron Technology。美光科技是世界领先的先进半导体解决方案提供商之一。在 2006 年 4 月接受 GridToday 采访时,美光科技的一位高级研究员表示,他们已部署了 11 个 Condor 池,包含 11,000 个处理器,分布在四个国家/地区的七个不同站点。为什么选择 Condor?因为它支持美光科技感兴趣的所有平台,并且它已被广泛使用、得到良好支持,当然,它是开源的。这些池已成为美光科技的重要资产。它们用于从制造、工程、报告和软件开发到安全等各个方面。Condor 不仅是一个研究玩具,而且是一个稳健的开源软件,可以解决现实世界的问题。

Irfan Habib 是巴基斯坦国立科技大学软件工程专业的本科生。多年来,他对免费和开源软件深感兴趣,并且他从事分布式计算和网格计算领域的研究。Condor 结合了他的两个兴趣。可以通过 irfan.habib@niit.edu.pk 与他联系。

加载 Disqus 评论