热线电话
  • 010-88558925010-88558943
  • 010-88558955010-88558948
CMIC专家更多

潘建伟院士:我国在量

7月6日,中国科协副主席、中国科学技术大...更多>>

用友何强:中国软件产

编者按:进入AI时代,中国软件产业的价值...更多>>

中国市场情报中心 > 文章 > 产业投资
使用Java CoG工具箱进行网格作业提交(1)

发布时间:2004-03-17 15:13:37

来源:IBM DW

作者:Vladimir Silva

【打印】 【进入博客】 【推荐给朋友】
   网格(grid)是使得软件应用程序能够把分布在各个地方的由各种组织管理的仪器、显示器、计算和信息资源集成起来的环境。网格计算的全部目标就是共享位于不同地方、基于不同体系结构、属于不同管理区域的资源。计算机网格将创建一个强大的计算资源池,这个池能够运行当今研究机构和企业迫切需要的各种科学和工程应用程序。本文的目标是是描述使用 Java CoG 工具箱(Java CoG Kit)向计算机网格提交作业的基本知识。

引言
    当今“事实存在”的网格技术都是基于 Globus 工具箱(Globus Toolkit)的。Globus 工具箱是一个开放体系结构、开放源代码的软件包。它专注于以下几个方面:资源管理、数据管理与访问、应用程序开发环境、信息服务及安全性。
    资源管理专注于为命名与定位远程系统上的计算资源与通信资源以及把这些资源纳入到平行的分布式计算提供统一的、可扩展的机制。
    数据管理专注于处理大量的数据(terabytes 或 petabytes)。下一代应用程序可能还需要访问分布式数据应用程序,如协作环境、支持网格的 RDBMS 系统等等。
    网格信息服务要求在分布式计算环境中实现高性能的执行,这不仅要精心选择和配置计算机、网络和其他资源,而且还要精心选择和配置应用程序使用的协议和算法。
    网格安全性建立动态创建的大量对象之间的安全关系,同时也建立一系列管理区域(每个管理区域都有其自己的安全性策略)之间的安全关系。

作业提交术语
1.什么是作业?
    在 Globus 术语中,作业是将要在远程资源(机器)中运行的二进制可执行文件或命令。要运行作业,远程服务器必须安装有 Globus 工具箱。这个远程服务器也被称为“联系人(contact)”或“看门人(gatekeeper)”。目前,对于所有主流类型的 UNIX 和 Linux,都有针对它们的工具箱实现。“/bin/ls”就是作业字符串的一个示例,它会产生一个当前工作目录的列表(“/bin/ls”与 windows 中的“dir”命令相似)。
2.作业提交方式
    当一个作业被提交到远程看门人(服务器)以便执行时,它可以以两种不同的方式运行:批处理(batch)方式和非批处理(non-batch)方式。当一个作业以批处理方式运行时,远程提交调用将立即返回一个作业标识(job-id)字符串。作业标识采用以下格式:https://server.com:39374/15621/1021382777/。稍后可以使用标准的 Globus 工具箱命令通过这个作业标识来获取调用的输出。在非批处理作业提交方式中,客户机将等待远程看门人一路跟随执行过程并返回输出。批处理方式提交对于要占用很长时间的作业(如进程密集的计算)很有用。
3.资源规范语言(Resource Specification Language,RSL)
    RSL 是一门用来描述资源的公共交换语言。Globus 资源管理(Globus Resource Management)体系结构的各个组件对 RSL 字符串进行处理以便与系统中的其他组件合作执行它们的管理功能。“& (executable = /bin/ls)(directory=/bin)(arguments=-l)”就是 RSL 字符串的一个示例。这个 RSL 字符串会产生一个长长的、类似 UNIX 系统中的当前工作目录列表。

安全性基础结构
    Globus 工具箱使用网格安全性基础结构(Grid Security Infrastructure,GSI)在开放网络上启用安全认证和通信。GSI 为网格提供了许多有用的服务,包括相互认证和单点登录。
    GSI 是以公钥加密、X.509 证书和安全套接字层(Secure Socket Layer,SSL)通信协议为基础的。为了支持单点登录和委托(delegation),已经对这些标准进行了扩展。GSI 的 Globus 工具箱实现符合“通用安全性服务应用程序编程接口(Generic Security Service API,GSS-API)”,后者是因特网工程任务组(Internet Engineering Task Force,IETF)力推的用于安全性系统的标准 API。
本文的实现已经设置了一个 guest 证书,以便客户机访问网格资源。然后远程机器的系统管理员就可以控制对资源的访问。假定已经在客户机安装了 Java CoG 工具箱并且已经请求并正确设置了一个用户证书。欲了解有关获得进行认证所需的用户证书的说明,请参阅 Globus 的 Web 站点(请参阅参考资料)。

Java 技术中作业提交的基本知识
最小作业提交 Java 类
    下面的 Java 类实现了一个最小作业提交方法。这些代码需要 Java CoG 工具箱库才能正确编译。(欲了解安装说明,请参阅下面的参考资料列表。)要进行认证,需要用户/主机证书(请参阅参考资料)。
    在开始实现时,我们首先创建一个 Java 类以封装“GRAM 作业”(请参阅清单)。这个类将用于向机器(看门人)以批处理方式或非批处理方式提交作业请求。执行完成时返回输出。
清单 1. 一个对作业提交进行封装的 Java 类

package globus.services;

import org.globus.security.*;
import org.globus.gram.*;
import org.globus.io.gass.server.*;
import org.globus.util.deactivator.Deactivator;

/**
 * Java CoG Job submission class
 */
public class GridJob implements GramJobListener, JobOutputListener
{
private GassServer m_gassServer; // GASS Server: required to get job output
private String m_gassURL = null;   // URL of the GASS server
private GramJob m_job = null;        // GRAM JOB to be executed
private String m_jobOutput = "";     // job output as string
private boolean m_batch = false;     // Submission modes:
             batch=do not wait for output
                                      //      non-batch=wait for output.
private String m_remoteHost = null;  // host where job will run
private GlobusProxy m_proxy = null; 
 // Globus proxy used for authentication against gatekeeper

// Job output variables:
// Used for non-batch mode jobs to receive output from 
// gatekeeper through the GASS server
     
private JobOutputStream m_stdoutStream = null;
private JobOutputStream m_stderrStream = null;
private String m_jobid = null;  // Globus job id on the form: 
https://server.com:39374/15621/1021382777/

public GridJob(String Contact, boolean batch) {
m_remoteHost = Contact;  // remote host
m_batch = batch;         // submission mode
 }

    请注意所实现的接口:GramJobListener 和 JobOutputListener。如果我们的类要等待作业状态,那么便需要 GramJobListener 接口。作业状态可以是 PENDING、ACTIVE、DONE、FAILED、SUSPENDED 或 UNSUBMITTED 中的某一个。实际的作业输出通知需要 JobOutputListener 接口。
    这个类的构造函数接受两个自变量:一个是用来运行作业的“联系人(Contact)”或远程主机,另一个是代表提交方式的布尔值(true=batch、false=non-batch)。batch 意味着“不等待输出”。在这种方式中,GRAM 请求将立即返回一个唯一的作业标识,稍后可以通过这个作业标识检索输出。批处理方式对于需要长时间完成的作业(即需要占用几个小时或者甚至几天时间的作业)很有用。如果请求只需占用很短的时间(几秒或者几分钟),那请将 batch 标志设置为 false(即 non-batch)。
侦听作业输出
    Globus 使用 GASS(Globus Access to Second Storage,Globus 对次级存储器的访问)服务来侦听输出。如果需要在客户机和服务器之间来回传送这个输出,可以使用下面清单 2中的代码。
清单 2. 启动 GASS 服务器以传送输出

/**
 * Start the Globus GASS Server. Used to get the output from the server
 * back to the client.
 */
  private boolean startGassServer(GlobusProxy proxy) {
  if (m_gassServer != null) return true;
  try {
      m_gassServer = new GassServer(proxy, 0);
      m_gassURL = m_gassServer.getURL();
  } catch(Exception e) {
      System.err.println("gass server failed to start!");
      e.printStackTrace();
      return false;
  }
  m_gassServer.registerDefaultDeactivator();
  return true;
 }
 
 /**
 * Init job out listeners for non-batch mode jobs.
 */
 private void initJobOutListeners() throws Exception {
  if ( m_stdoutStream != null ) return;
  // job output vars
  m_stdoutStream = new JobOutputStream(this);
  m_stderrStream = new JobOutputStream(this);
  m_jobid = String.valueOf(System.currentTimeMillis());

  // register output listeners
  m_gassServer.registerJobOutputStream("err-" + m_jobid, m_stderrStream);
  m_gassServer.registerJobOutputStream("out-" + m_jobid, m_stdoutStream);
  return;
  }

    GASS 服务器必须在发送 GRAM 请求之前启动。initJobOutListeners 方法用于注册 stdout/stderr 流以便可以从 GRAM 协议接收输出。为了做到这一点,需要通过使用 System.currentTimeMillis() 生成一个标识值,然后使用这个值向 GASS 服务器注册 stdout/stderr 流。

   关于作者:Vladimir Silva 于 1969 年生于厄瓜多尔的奎多。他于 1994 年获得 Polytechnic Institute of the Army 的系统分析师学位。同年,他作为一名交换学生(注:交换学生即由大学间互派的做学习交流的学生)来到美国,在 Middle Tennessee State University 从事计算机科学工作。毕业后,他加入了 IBM“Web-Ahead”技术智囊团。他的兴趣包括网格计算、神经网络和人工智能。他还拥有许多 IT 证书,包括 OCP、MCSD 和 MCP。您可以通过 silva@us.ibm.com 与 Vladimir 联系

(责任编辑:宋宏伟)

相关报道
  • --

联系我们:8610-8855 8955 zhouhl@staff.ccidnet.com

广告发布: 8610-88558925

方案、案例展示: 8610-88558925

Copyright 2000-2011 CCIDnet.All rights reserved.

京ICP000080号 网站-3