保持与 Globus Toolkit 的同步更新对于维持最新的网格技巧来说非常重要。本文将介绍 Globus Toolkit 的版本 4,在 Service-Oriented Architecture(SOA)和 Web 服务领域中展示这个工具包,并详细介绍 Grid Resource Allocation Manager 组件(GRAM),以及为网格作业提交、监视和控制例子创造条件的支持服务。
在本文中,我将在 Service-Oriented Architecture(SOA)和 Web 服务领域概要介绍 Globus Toolkit 4 的内容。重点介绍这个工具包中的 Grid Resource Allocation Manager(GRAM)组件(以及支持服务)—— 这是一组核心服务,可以帮助您在特定的资源上启动作业、检查状态并获取结果的实际操作。通过这个重点的介绍,我们将设置提交网格作业的一个例子中的步骤。网格作业的例子开始是以一个非常基本的例子形式出现的,然后逐渐向其中引入一些新的概念和特性,以支持更加复杂的作业 —— 最后通过 Globus GRAM 将多个作业提交给调度器。
不过首先让我们来讨论一下有关 SOA 和网格的问题。
SOA 和网格
SOA 是最近的一个热点问题。尽管这个概念已经并不新鲜,但是它却重新点燃了 Web 服务的活力。Web 服务可以通过一个使用标准协议仔细进行定义的接口为远程用户提供对程序的访问。高级的服务可以在现有的服务之上进行构建,应用程序可以通过将一系列 Web 服务连接在一起而进行开发。最后,我们还有一个非常有用的重用方法。
如果应用程序提供了一个通用的可重用服务,并且它是无状态的,需要少量的输入和输出数据,那么这个应用程序就应该打包为一个 Web 服务。为了增加重用性,甚至还有一种发现并调用现有服务的机制。这种方法对于在分布式环境中提供对常用应用程序的访问来说非常有效,因为它是基于标准协议的,例如 SOAP over HTTP。
在将 SOA 应用到网格实现上时,有一些常见的应用程序应该以 Web 服务的形式提供。然而,很多常见的应用程序都是特定于网格实现类型的,无论研究、科学方面的网格,还是教育网格。如果我们希望在这些应用程序域之间使用一些可重用的服务,那么应该区分任何网格实现中所需要的服务:
如果我们将网格实现中所需要的服务进行合并,就会得到一个基本的网格基础设施,我们称之为“面向服务的基础设施”(Service-Oriented Infrastructure)。
GRAM 功能和服务
这种环境中的 Web 服务为支持通用的作业提交方法提供了一个基础,当您希望在相关的输入数据之间提供可执行文件时,可能要在产生输出数据的同时访问这些数据,然后在执行过程中与作业进行交互,此时这种方法非常有效。这看起来可能有些超前,但是现在的确已经有了提供这种功能的工具和技术。
Globus Toolkit 4.0 就是这样一种工具。它对一组 Web 服务进行了打包,这些服务为我们提供了一个面向服务的基础设施。应用程序关注的是某个具体的问题领域,而 Globus Toolkit 关注的则是整个基础设施。Globus Web 服务可以帮助您对分布式基础设施组件进行访问和管理。
Globus Toolkit 的 GRAM 组件提供了一组 Web 服务,它们采用了 WS-Resource Framework,其设计目标是帮助您在网格环境中提交作业和管理作业。GRAM 可以用于那些需要信任证书、可靠执行以及协调文件步骤的作业。GRAM 可以帮助实现信任证书的管理,从而提交作业,监视作业的进展状况,控制作业的执行情况,并分阶段地处理相关的数据。不同的信任证书可以用来代表不同的功能。GRAM 提供了一个可靠的执行环境,并集成了多个专门用来在复杂环境中对作业执行管理进行优化的调度器。GRAM 和支持服务提供了文件分段传输的功能,甚至还提供了在作业运行时访问输出数据文件的功能,从而有效地实现对输出数据的利用。
GRAM 调度器
当您提交一个作业时,GRAM 创建一个 ManagedJob
对象,并返回其句柄。然后您就可以使用这个句柄与这个作业进行交互,这实际上是一个 WS-Addressing Endpoint Reference(EPR)。稍后我们将讨论一个典型的交互过程,并给出几个例子;但是首先让我们来了解一下支持作业执行所使用的基础设施。
网格作业可能会消耗大量的计算周期,因此一个网格环境通常会包含很多资源集群。这些集群通常是由一个调度器进行控制的。调度器负责对资源的使用进行优化,从而按照定义好的策略来有效地执行作业。有很多调度器可以使用,其中包括 Load Sharing Facility、Condor 和 Portable Batch System。
GRAM 使用调度器适配器将作业描述语法转换成调度器可以执行的命令。除了为调度器提供一个接口之外,GRAM 还包含了一种派生新的 UNIX® 进程来启动作业的机制。这适用于小型的串行作业,它们在运行时不需要集群资源,也不需要共享内存或消息传递。在后面的例子中,我们就会使用这个简单的派生进程。
派生进程使用一个 Fork Starter 程序来启动并监视针对 GRAM 的作业进程。它还记录了一些数据,例如启动时间、结束时间以及该作业的退出代码。当提交作业时,事件会被写入日志文件中。当有重要的事件发生时,会继续在后面添加日志。这些调度器日志文件是由称为 Scheduler Event Generator (SEG)的进程进行监视的,它会让 GRAM 通过监听相关的事件并与其通信,来保持与作业状态的同步。
GRAM 支持服务
GRAM 提供了作业和执行管理服务来提交、监视和控制作业,但是这都依赖于用来传输文件和管理证书所使用的支持服务。GridFTP 所提供的文件服务用来帮助 GRAM 实现对输入和输出文件的分段传输。证书管理服务处理证书对其他服务和所需要的分布式网格资源的委托。
GRAM 作业提交
现在我们已经基本了解了这些功能和支持服务,接下来让我们讨论一下实际的作业提交系统。
作业提交的基础知识
可以使用应用程序编程接口(API)或者通过命令行工具,以编程的方式提交作业。命令行工具是用来测试 Globus 安装的一种简单方法,因此我们首先介绍一下这种方法。
globusrun-ws
命令行工具取代了 managed-job-globusrun
命令,它用来提交、监视和控制作业。它可以协调文件的分段传输、证书委托和身份验证问题。信息可以使用命令行选项进行指定,也可以包含在一个基于 XML 的对象描述文件中。globusrun-ws
命令是同步执行的,因此作业在提交时并不会返回控制权。相反,它会通过显示作业的状态,以交互方式提供一些反馈。基于这些状态信息,您可以选择使用 Ctrl C 来取消某个作业。
作业提交的前提条件
所有的用户都必须通过身份验证并具有有效的证书才可以提交作业。这个作业可能需要将证书委托给他人来执行远程操作,例如分段传输文件。
下面的例子假设已经使用 grid-proxy-init
命令生成了一个有效的代理。然而,证书也可以通过作业请求进行传输,或者上传到 Delegation 服务中。清单 1 是提交一个简单作业(用来获取日期)的例子。-c
选项指定要运行 /bin/date
命令。
清单 1. 提交作业来获取日期
[globust@gt4-test ~]$ grid-proxy-init
Your identity: /C=US/O=UTAustin/OU=TACC/CN=Globus User/UID=globust
Enter GRID pass phrase for this identity:
Creating proxy .............................................. Done
Your proxy is valid until: Thu May 19 23:35:47 2005
[globust@gt4-test ~]$ globusrun-ws -submit -c /bin/date
Submitting job...Done.
Job ID: uuid:254e353e-c884-11d9-9304-0011435a15ac
Termination time: 05/20/2005 16:36 GMT
Current job state: Active
Current job state: CleanUp
Current job state: Done
Destroying job...Done.
|
作业描述文件
在命令行中指定多个作业参数可能会是一件令人讨厌的事情。当有多个参数与一个作业相关时,可以使用作业描述文件。
作业是使用 -f
选项提交的,后面跟着作业描述文件名。在作业描述文件中可以使用变量。在提交作业时,GRAM 会处理作业描述文件,并替换变量的值。
在下面这个例子中,变量 GLOBUS_USER_HOME
对应我的主目录。这个变量会被替换成解析后的值,这是到主目录的实际路径。在清单 2 中,我们提交了一个使用提交描述文件 simple_test.xml 描述的作业。这个作业使用 echo 命令将输入参数重定向到标准输出上。在这里,我们规定,应该将标准输出重定向到主目录中的 stdout 文件。
清单 2. 使用作业描述文件
globust@gt4-test ~]$ globusrun-ws -submit -f simple_test.xml
Submitting job...Done.
Job ID: uuid:db96c126-c884-11d9-8a94-0011435a15ac
Termination time: 05/20/2005 16:41 GMT
Current job state: Active
Current job state: CleanUp
Current job state: Done
Destroying job...Done.
[globust@gt4-test ~]$ cat simple_test.xml
<job>
<executable>/bin/echo</executable>
<argument>Wow, we're submitting Grid Jobs!</argument>
<stdout>${GLOBUS_USER_HOME}/stdout</stdout>
<stderr>${GLOBUS_USER_HOME}/stderr</stderr>
</job>
|
批处理模式
除了同步模式之外,globusrun-ws
命令还可以使用批处理模式来提交后台作业。
要使用批处理模式,则需要指定一个文件,其中 GRAM 应该将 Job EPR 保存到所管理的作业资源中,然后在与这个作业相关的一系列命令中指定这个文件。
在这个例子中,我们将提交与上一个例子相同的作业,但是我们使用 -batch
选项指定它应该在后台运行。控制权会立即返回,因此您可以在这个作业运行的同时执行其他工作。后台作业的状态可以使用 globusrun-ws
命令的 -status
参数进行查询,并指定 -job-epr-file,该参数可以确定与这个作业相关的 ManagedJob
对象。
清单 3. 在后台运行清单 2 中的作业
globust@gt4-test ~]$ globusrun-ws -submit -batch -f simple_test.xml -o st.epr
Submitting job...Done.
Job ID: uuid:db96c126-c884-11d9-8a94-0011435a15ac
Termination time: 05/20/2005 16:41 GMT
Current job state: Active
Current job state: CleanUp
Current job state: Done
Destroying job...Done.
[globust@gt4-test ~]$ globusrun-ws -status -job-epr-file st.epr
Submitting job...Done.
|
作业变量
您可以在作业描述文件中为这个作业设置环境变量,并通过指定一个 count 参数来控制该作业运行的次数。在下面这个例子中,环境变量 CONDOR_CONFIG
已经设置,以指定 condor 配置文件的位置;count 变量说明这个作业应该运行 25 次。
清单 4. 确定一个作业运行多少次
<environment>
<name>CONDOR_CONFIG</name>
<value>/usr/local/condor/condor-6.7.7/etc/condor_config</value>
</environment>
...
<count>25</count>
|
文件分段传输
作业描述符文件可以包括文件传输指令,它控制输入和输出文件的分段传输。这些指令使用了 Reliable FileTransfer(RFT)语法,在指定源 URL 和目的 URL 时可以支持第三方的文件传输。
RFT 服务是通过 GRAM 调用来分段传输输入文件和输出文件的。RFT 类似于一个 GridFTP 客户端,通过持续进行传输来管理数据的传输和状态信息。它通过支持检查点和为崩溃的文件传输提供重启功能而增强了可靠性。
除了要对输入和输出文件进行分段传输之外,GridFTP 还可以用来在作业执行期间对输出文件进行监视。GridFTP 可以检查输出文件的状态,并传输任何新信息,从而有效地处理输出数据。
清单 5 给出了文件分段传输指令,它用来从一个远程机器 gt4-test1 上获取一个文件,并将其复制到 /tmp/simpleTestFile 中的本地文件系统中。
清单 5. 文件分段传输指令
<fileStageIn>
<transfer>
<sourceUrl>gsiftp://gt4-test1:2811/tmp/simpleTestFile</sourceUrl>
<destinationUrl>file:////tmp/simpleTestFile</destinationUrl>
</transfer>
</fileStageIn>
|
除了对文件进行分段传输之外,还可以使用 <fileCleanUp>
指令自动删除文件,如清单 6 所示:
清单 6. 自动清除文件
<job>
<fileCleanUp>
<deletion>
<file>file:////tmp/simpleTestFile</file>
</deletion>
</fileCleanUp>
</job>
|
多作业支持
作业描述 XML 模式支持多作业 的概念,即由多个作业或子作业组成的作业。这种方法可以用来将一组相关的作业绑定在一起,并将其一次提交给 GRAM。
GRAM 使用一个集中地点来对多作业环境中的各个进程进行同步。这用于那些在完成其他计算之前需要在执行过程中的某个特定地方集中的并行作业。
作业描述符文件中的每个子作业都必须为工厂指定一个端点。这允许并行地向多个主机提交作业。
下面这个例子为一个由两个子作业做成的作业使用了一个多作业的描述文件 —— 一个作业用来获取日期,另外一个作业使用 echo
命令将输入参数传递给标准输出。第一个子作业的输出被发送到主目录中的 stdout.p1 文件中,第二个子作业的输出被发送到 stdout.p2 文件中。
清单 7. 两个作业,只花一份钱
<?xml version="1.0" encoding="UTF-8"?>
<multiJob xmlns:gram="http://www.globus.org/namespaces/2004/10/gram/job"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
<factoryEndpoint>
<wsa:Address>
https://localhost:8443/wsrf/services/ManagedJobFactoryService
</wsa:Address>
<wsa:ReferenceProperties>
<gram:ResourceID>Multi</gram:ResourceID>
</wsa:ReferenceProperties>
</factoryEndpoint>
<directory>${GLOBUS_LOCATION}</directory>
<count>1</count>
<job>
<factoryEndpoint>
<wsa:Address>https://localhost:8443/wsrf/services/ManagedJ
obFactoryService</wsa:Address>
<wsa:ReferenceProperties>
<gram:ResourceID>Fork</gram:ResourceID>
</wsa:ReferenceProperties>
</factoryEndpoint>
<executable>/bin/date</executable>
<stdout>${GLOBUS_USER_HOME}/stdout.p1</stdout>
<stderr>${GLOBUS_USER_HOME}/stderr.p1</stderr>
<count>2</count>
</job>
<job>
<factoryEndpoint>
<wsa:Address>https://localhost:8443/wsrf/services/ManagedJ
obFactoryService</wsa:Address>
<wsa:ReferenceProperties>
<gram:ResourceID>Fork</gram:ResourceID>
</wsa:ReferenceProperties>
</factoryEndpoint>
<executable>/bin/echo</executable>
<argument>Hello World!</argument>
<stdout>${GLOBUS_USER_HOME}/stdout.p2</stdout>
<stderr>${GLOBUS_USER_HOME}/stderr.p2</stderr>
<count>1</count>
</job>
</multiJob>
|
|
|
调度器
上面我们简要介绍了网格是如何包含在调度器的控制之下进行操作的集群资源。调度器会对吞吐量进行性能和效率的优化。
GRAM 使用实现 GRAM WS 适配器插件 API 的适配器来对调度器进行协调。这些调度器的安装和配置应该在安装或配置 Globus Toolkit 之前完成。
GRAM 调度器适配器包含在 Globus PBS (Portable Batch System)的发行版、 Condor 和 Platform Load Sharing Facility (LSF)中。 Globus 文档介绍了 PBS 的设置步骤,因此我们下面将介绍一下 Condor 和 Platform LSF。我们假设您已经正确安装并配置了 Globus(这包括导出的环境变量,例如 ANT_HOME
、JAVA_HOME
和 GLOBUS_LOCATION
)。在 Globus 的安装目录中,执行下面的命令:
% configure -prefix=$GLOBUS_LOCATION -enable-wsgram-lsf -enable-wsgram-condor
% make
% make install
|
假设这个步骤成功完成了,那么在 $GLOBUS_LOCATION/etc 目录中,每个调度器都会有一个 gram-service,如清单 8 所示:
清单 8. 创建一个 gram-service 监听
[mausolf@gt4-test etc]$ pwd
/usr/local/globus/globus-4.0.0/etc
[mausolf@gt4-test etc]$ ls gram-service-*
gram-service-Condor:
jndi-config.xml
gram-service-Lsf:
jndi-config.xml
gram-service-Fork:
jndi-config.xml
gram-service-Multi:
jndi-config.xml
|
jobType
在提交作业时,您可以使用 jobType
指令指定使用哪一个调度器。在 jobType
中指定的名称必须与 JNDI 配置文件中这个服务所使用的名称完全匹配。
例如,在下面这个例子中,作业 jndi-config.xml (位于 $GLOBUS_LOCATION/etc/gram-service-condor 目录中)将名称 condor
赋予这个服务。下面这个例子使用了一个作业描述文件 simple2test.xml 将作业提交给 condor
。
清单 9. 指定使用哪个调度器
<?xml version="1.0" encoding="UTF-8"?>
<job>
<executable>/usr/local/condor/condor-6.7.7/examples/sh_loop</executable>
<directory>${GLOBUS_USER_HOME}</directory>
<argument>123</argument>
<stdin>/dev/null</stdin>
<stdout>${GLOBUS_USER_HOME}/stdout</stdout>
<stderr>${GLOBUS_USER_HOME}/stderr</stderr>
<jobType>condor</jobType>
</job>
|
可以在命令行中使用 globusrun-ws
来提交这个作业,如下所示:
[globust@gt4-test ~]$ globusrun-ws -submit -batch -f simple2test.xml -o st2.epr
|
在这个例子中,这个作业是在后台运行的。控制权会立即返回,您可以通过提供 job-epr-file 来获得后台作业的状态,如下所示:
[globust@gt4-test ~]$ globusrun-ws -status -job-epr-file st2.epr
Current job state: Done
|
让我们来看一个更加真实的多作业提交系统,它可以用类似的方式提交作业。因为我们要提交多作业,所以将 jobType
指定为 Condor,然后通过 GRAM 和 Condor 来查询其状态。
清单 10. 为多作业指定调度器
[globust@gt4-test ~]$ globusrun-ws -submit -batch -f multi3test.xml -o mt3.epr
Delegating user credentials...Done.
Submitting job...Done.
Job ID: uuid:b701732a-c95f-11d9-870d-0011435a15ac
Termination time: 05/21/2005 18:48 GMT
[globust@gt4-test ~]$ condor_q
Submitter: gt4-test.tacc.utexas.edu : <129.114.50.64:54109>
: gt4-test.tacc.utexas.edu
ID OWNER SUBMITTED RUN_TIME ST PRI SIZE CMD
62.0 globust 5/24 11:07 0+00:00:04 R 0 0.0 sh_loop 1100
63.0 globust 5/24 11:07 0+00:00:00 R 0 0.0 sh_loop 1200
2 jobs; 0 idle, 2 running, 0 held
[globust@gt4-test ~]$ globusrun-ws -status -job-epr-file mt3.epr
Current job state: Pending
|
清单 11 给出了用于清单 10 中的多作业提交的作业描述文件。所指定的可执行文件 sh_loop
是 Condor 发行版中提供的一个示例程序,它会循环一段指定的时间。之所以选择这个例子是因为它非常简单,而且可以指定作业的持续时间,这让我们可以使用 Condor 和 GRAM 工具来展示查询作业的状态。
清单 11. 清单 10 中作业所使用的作业描述符
[globust@gt4-test ~]$ cat multi3test.xml
<?xml version="1.0" encoding="UTF-8"?>
<multiJob xmlns:gram="http://www.globus.org/namespaces/2004/10/gram/job"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
<factoryEndpoint>
<wsa:Address>
https://gt4-test.tacc.utexas.edu:8443/wsrf/services/ManagedJ
obFactoryService
</wsa:Address>
<wsa:ReferenceProperties>
<gram:ResourceID>Multi</gram:ResourceID>
</wsa:ReferenceProperties>
</factoryEndpoint>
<directory>${GLOBUS_LOCATION}</directory>
<count>1</count>
<job>
<factoryEndpoint>
<wsa:Address>https://gt4-test.tacc.utexas.edu:8443/wsrf/serv
ices/ManagedJobFactoryService</wsa:Address>
<wsa:ReferenceProperties>
<gram:ResourceID>Condor</gram:ResourceID>
</wsa:ReferenceProperties>
</factoryEndpoint>
<executable>/home/mausolf/sh_loop</executable>
<argument>1100</argument>
<stdout>${GLOBUS_USER_HOME}/stdoutM3.p1</stdout>
<stderr>${GLOBUS_USER_HOME}/stderrM3.p1</stderr>
<count>1</count>
</job>
<job>
<factoryEndpoint>
<wsa:Address>https://gt4-test.tacc.utexas.edu:8443/wsrf/serv
ices/ManagedJobFactoryService</wsa:Address>
<wsa:ReferenceProperties>
<gram:ResourceID>Condor</gram:ResourceID>
</wsa:ReferenceProperties>
</factoryEndpoint>
<executable>/home/mausolf/sh_loop</executable>
<argument>1200</argument>
<stdout>${GLOBUS_USER_HOME}/stdoutM2.p2</stdout>
<stderr>${GLOBUS_USER_HOME}/stderrM2.p2</stderr>
<count>1</count>
</job>
</multiJob>
|
|
|
结束语
本文对 Globus Toolkit 4.0 进行了简要的介绍,并详细介绍了 GRAM 和支持服务的内容。文中还包括几个网格作业提交的例子,用来提供通过 GRAM 来提交作业和监视作业的经验。在更复杂和实际的环境中,GRAM 还需要作出一个明智的决定,来确定将作业提交到哪一个资源和调度器上。这些信息可以通过 MDS(Monitoring and Discovery Service)获得。