[zz]网格编程FAQ[/zz]

【原文写于6 December 2005,

 

from http://www.chinagrid.net/dvnews/show.aspx?id=646&cid=18

网格编程FAQ
[日期:2005-2-16] 来源: 作者: [字体:大 中 小]

网格编程FAQ

支青(zhq)整理

网格适合哪一类编程?
若客户的请求是一个比较独立的任务,可以利用 Globus Toolkit 3自带的MMJFS服务或使用自定义的网格服务完成。Globus Toolkit 3对并行程序的支持不如Globus Toolkit 2。使用Globus Toolkit 2可以实现进程级的并行计算,类似于MPI。若客户的请求能分成大粒度的子任务,而且子任务之间的联系不是很频繁,那么使用Globus Toolkit 3可以实现任务级的并行。

使用Globus Toolkit 3编程时,程序及相关文件的路径组织结构是怎样的?
在Globus Toolkit 3的安装目录{gt3}下,建自己的目录,例如test目录。在test目录下建src目录,用于存放java源程序文件。在test目录下建三个文件,文件名分别为build.properties,build.xml和test-config.wsdd。在build.properties文件中用 ogsa.root指明Globus Toolkit 3的安装目录。在本例子中,ogsa.root=../。编译和运行都可以在test目录中进行。编译时,会在test目录下自动建build目录及其子目录,用于存放编译好的class文件及相关文件。

使用Globus Toolkit 3编程的大致流程是怎样的?
(1)定义接口文件
定义网格服务接口是网格服务开发的第一步。在定义服务接口之前,必须先明确服务的功能,接口文件中应当提供哪些方法、这些方法应当有哪些参数,然后才能以此为基础定义服务接口。
(2)生成WSDL文件
运行ant generateWSDL,生成接口文件所对应的WSDL文件。WSDL描述了网格服务,是网格服务开发的关键,以下的开发都是以该文件为基础的。
(3)生成存根文件
服务端和客户端获得WSDL文件后,都必须运行ant stubs命令,生成存根文件。
(4)服务端实现网格服务
(5)服务端编译打包各文件
服务端实现服务后,必须编译存根文件和服务端的实现文件。运行ant compile命令,编译各文件。
(6)服务端部署发布服务
以上工作完成后就可以运行ant deploy命令将服务部署到网格环境之中了。
(7)测试服务

修改程序并编译通过之后,重新启动服务运行并没有什么改变,好像没有修改过程序一样。这是为什么?
Globus Toolkit 3运行时用的是lib目录下jar压缩包中的class文件。发布服务时,ant工具会把该服务的class文件打包成jar压缩包并放入lib目录。修改程序并编译通过之后,还要使用ant deploy命令发布该服务。重新启动服务容器就可以运行修改后的程序了。

如何使用Globus Toolkit 2的API编程?
要使用Globus Toolkit 2的API,必须在源代码中引入所需的头文件。比如需要用到globus_io模块的话,就使用以下代码:#include “globus_io.h”。在Makefile文件中加入以下代码:include definitions。definitions是文件名,该文件可以用以下命令生成:globus-makefile-header globus_io –flavor=gcc32dbg > definitions。

为什么编译时常报错:java.lang.NoClassDefFoundError?
在编译之前,需要在Globus Toolkit 3的安装目录下先运行setenv.sh(Linux环境)或setenv.bat(Windows环境)设置classpath环境变量。然后再进行编译。

如何在Windows环境下创建网格服务实例?
Windows 下的Globus Toolkit 3没有ogsi-create-service命令。在Windows或Linux下都可以用 org.globus.ogsa.client.CreateService来创建网格服务实例,不过先要运行setenv.bat或setenv.sh 设置classpath环境变量。其实Linux下的Globus Toolkit 3的ogsi-create-service命令本质也是用org.globus.ogsa.client.CreateService实现其功能的。

如何使各结点上的网格服务注册到注册中心?
每个网格服务在默认状态下是注册到本节点的ContainerRegistry中,也可以注册到其他远程节点的VORegistry中。需要在服务的WSDD文件中加以说明,加入以下一行:。注册中心的服务容器始终开启着。其他网格结点在开启服务容器时,该结点上的服务就能注册到注册中心了。

A机器上用VORegistry注册了B机器上的网格服务,客户端是否可以在不知道B机器IP的情况下通过A机器调用B机器上的服务?
可以实现。B机器上的网格服务的网格服务句柄(GSH)中包含了B机器的IP及该服务在B机器上的具体位置。当B机器上某一个网格服务的GSH注册到A机器的VORegistry中时,客户通过访问A机器的VORegistry服务可以获取B机器上该服务的位置,从而进行调用。

怎样获得一个服务容器中现有的服务?
服务容器(Container)中各服务的信息是保存在ContainerRegistryService的ServiceData中的。生成 ContainerRegistryService的一个实例后,就可以访问其ServiceData,也就可以获得该Container现有的 Service。ServiceData是使用链表实现的,对其访问不难操作。

调用网格服务时,报错socket timeout,如何解决?
在客户调用网格服务时,可以使用setTimeout方法重新设置超时时间。
以EchoString为例:
EchoStringServiceLocator echoStringLocator = new EchoStringServiceLocator();
OGSIServiceGridLocator gridLocator = new OGSIServiceGridLocator();
HandleType handle = new HandleType(sGSH);
this.gridService = gridLocator.getGridServicePort(handle);
URL url = gridLocator.getEndpoint();
this.echoString = echoStringLocator.getEchoStringService(url);
((Stub)(this.echoString)).setTimeout(0); /* 此处将timeout设为无穷大 */
该例子的完整源代码请见http://www.gridhome.com/cgi-bin/lb5000/topic.cgi?forum=10&topic=16&show=0。

启动服务容器时常出现timeout问题,如何解决?
修改org.globus.ogsa.server.ServiceContainer.java程序,在main函数的开头加入以下语句: System.setProperty(”org.globus.ogsa.client.timeout”,”< 时间>“);将时间参数调大,可避免常出现timeout问题。编译成功后,重新打包成ogsa.jar替换{gt3}/lib/目录下原来的ogsa.jar。还有一种方法,启动服务器的时候使用以下命令java -Dorg.globus.ogsa.client.timeout=< 时间> org.globus.ogsa.server.ServiceContainer。

如何实现Globus Toolkit 3的客户端图形化编程?
客户端使用网格服务其实就是运行网格服务客户端程序,在Globus Toolkit 3中该客户端程序是java程序。在客户端进行图形化编程时,需要将网格服务客户端程序引入到图形程序中。以EchoString为例,在图形程序中加入 import EchoStringClient.java,生成EchoStringClient的类对象后就可以调用EchoString网格服务了。

自建网格服务注册中心应注意哪些问题?
网格服务注册中心用于管理各个网格服务,需要记录各服务的工厂位置。此外,注册中心本身的地址是对外公布的。服务结点将网格服务的工厂位置注册到注册中心。客户端最初并不知道自己所需的服务是由哪些服务结点提供,更不知道服务结点的位置,所以需要查询网格服务注册中心。通过查询注册中心获得所需服务的工厂位置后,就可以创建服务实例,调用网格服务。注册中心的信息必须是实时更新的。当服务结点加入网格环境时,注册中心必须添加其提供的服务;当服务结点退出网格环境时,注册中心必须删除其提供的服务。注册中心还要提供对服务的查询、更新功能,并能处理多个客户的并发请求。

使用Globus Toolkit的GRAM提交客户作业后,如何使Globus Toolkit使用特定的资源调度器对客户作业进行调度?
Globus Toolkit支持的调度器有pbs、condor和lsf,{gt3}/lib/perl/Globus/GRAM/JobManager目录下不同的 Perl脚本支持相应的调度器。若没有安装任何调度器,则该目录下只有fork.pm文件。Perl脚本需要手工编写,然后进行安装。Globus网站上有关于Perl脚本编写的详细信息,http://www-unix.globus.org/api/c-globus- 2.2/globus_gram_job_manager/html/
globus_gram_job_manager_interface_tutorial.html。

目前网格服务提得越来越多,而大规模的高性能并行计算似乎提得很少。如何实现网格环境中的高性能并行计算?
Globus Toolkit 2对高性能并行计算支持较好,可以用它做集群的并行计算。将Globus Toolkit 2的并行程序封装成的网格服务,通过Globus Toolkit 3在网格中发布此服务。提供该服务的网格结点应既装Globus Toolkit 3又装Globus Toolkit 2。通过运行Globus Toolkit 2的并行程序,提供网格服务。除了封装Globus Toolkit 2的并行程序成为网格服务之外,还可以封装MPI的并行程序。

如何将客户作业提交给Globus,并且对作业进行管理?
Globus Toolkit 2的GRAM用于管理结点的资源,为客户提交、管理作业提供了相应的API。较为常用的API及相应功能如下:
int globus_gram_client_job_request(char *resource_manager_contact, char *description, const int job_state_mask, const char *callback_contact, char **job_contact) 提交作业,description参数是客户用RSL对作业的描述;
int globus_gram_client_job_status(char *job_contact, int *job_status, int *failure_code) 获取作业状态,通过job_status参数返回状态值;
int globus_gram_client_job_cancel(char *job_contact) 取消作业,该函数所需的参数job_contact在提交作业时获得。
以下是使用GRAM API运行客户作业的一个具体的例子:
#include “globus_common.h”
#include “globus_gram_client.h”
#include “globus_gram_myjob.h”
#include “globus_io.h”
#include “stdio.h”
int main( int argc, char *argv[])
{
int rc,i,job_status,failure_code;
char resource_manager_contact[10]=”D5″; /*作业在D5机器上运行*/
/*RSL对作业的描述*/
char description[100] = ” &(executable=/”/bin/date/”)(stdout=/home/globus/temp) “;
int job_state_mask = 0;
char callback_contact[100];
char *job_contact[10];
for(i=0;i<10;i++)
{job_contact[i] = globus_libc_malloc(50);}
rc = globus_module_activate(GLOBUS_GRAM_CLIENT_MODULE);

/*提交作业*/
rc = globus_gram_client_job_request(resource_manager_contact,description,job_state_mask,
callback_contact,job_contact );
globus_libc_printf(”job_contact = %s/n”,job_contact[0]);

do{
/*获得作业当前状态*/
rc = globus_gram_client_job_status( job_contact[0], &job_status, &failure_code ); globus_libc_printf(”job_status = %d/n” , job_status);
}while(job_status!=GLOBUS_GRAM_PROTOCOL_JOB_STATE_DONE);
rc = globus_gram_client_job_contact_free( job_contact[0] );/*回收资源*/
rc = globus_module_deactivate(GLOBUS_GRAM_CLIENT_MODULE);
return 0;
}

如何编译Globus Toolkit 2的应用程序?
Globus Toolkit 2 API的应用程序由于涉及到大量的库文件,通常采用make命令进行编译,需要手工编写Makefile文件。以下是一个通用的Makefile文件的内容,其中PROGRAMNAME要填写实际的应用程序名。
#Modify this file by set PROGRAMNAME to your program name
RM = /bin/rm
PROGRAMNAME = < 程序名>
include makefile_header
$(PROGRAMNAME):
$(GLOBUS_CC) $(GLOBUS_CFLAGS) $(GLOBUS_INCLUDES) -c $(PROGRAMNAME).c
$(GLOBUS_LD) -o $(PROGRAMNAME) $(PROGRAMNAME).o $(GLOBUS_LDFLAGS) $(GLOBUS_PKG_LIBS) $(GLOBUS_LIBS)
clean:
$(RM) -rf *.o $(PROGRAMNAME)
#end
Makefile 文件中引入了makefile_header文件,该文件是使用globus-makefile-header命令生成的,详见“如何使用Globus Toolkit 2的API编程?”。makefile_header文件用于定义变量和指定Globus库文件。如Makefile文件中所用的 GLOBUS_LIBS、GLOBUS_INCLUDES等变量均在makefile_header文件中定义。建议将源程序文件、 makefile_header文件和Makefile文件放在同一个目录下。在该目录下运行make命令即可生成目标文件和可执行文件,运行make clean命令可删除生成目标文件和可执行文件。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
社会的进步导致人们对于学习的追求永不止境,那么追求农业信息化的方式也从单一的田地教程变成了多样化的学习方式。多样化的学习方式不仅仅是需要人们智慧的依靠,还需要能够通过软件的加持进行信息化的价值体现。软件和系统的产生,从表面上来看是方便了某一行业和某一行业的用户,其实是从本质上来说是提高了社会的进步。就拿我们常见的出行而言,滴滴出行看似是为了打车和出行的人方便,但其实通过另外一种程度上来说,可以通过软件应用的调度和发展来为社会、城市出行的发展做出巨大的贡献。我们国家从最早的中国制造业演变到现在的“智造”,就是因为有软件信息系统的价值,能够将一些智慧的因素加入到制造的过程当中,而这一点就是软件系统来改变生产和现实的需求。在计算机时代日益发展的今天,计算机网络正快速融入这个社会的每一个领域。农业的发展是社会当中一种必有可少的方式。果树在种植和培养是直接影响果农及果商的发展,但在果树的资源管理方面还是有着很大的不同,所以信息多样化的果树管理方式很重要。在传统的果树资源管理上还有着很大的约束,为此开发和设计JSP杏种质资源管理系统,该系统内容丰富多彩,用户可以在线进行果杏树的资源查询等。本文还是使用JSP的方式来进行管理的,但在系统建设过程当中也考虑了许许多多信息安全的保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值