级别: 中级 Martin Brown, 开发人员兼作家, 独立咨询顾问
2007 年 11 月 22 日 将开源工具用于网格应用程序的开发,这将带来更多的可能性。首先将实现快速的开发过程,尤其是当利用诸如 Perl 或 Python 之类的脚本语言以及诸如 Apache 之类的开发环境的时候更是如此。本文提供了大量对您有帮助的例子。本文还研究了使用开源技术开发网格应用程序的优缺点。
开源组件
开源社区包括并支持大量可轻松用于网格环境的工具和产品。开源工具涵盖了从操作系统(例如 Linux® 和 BSD)到 C/C++ 开发环境(例如 GNU CC)等各种软件和技术领域。您还可以使用较为简单的脚本编制语言,例如 Perl,以及组件、工具包和开发环境,例如 Apache 的 Web 服务工具包和 Eclipse 集成开发环境(IDE)。
可以单独或组合使用这些组件,通过本地解决方案,或者利用标准的网格解决方案(包括网格部署环境中常用的 WS-* 组 Web 服务,例如 Globus)来构建网格解决方案。
使用开源组件的常见优点是易于访问、开发和部署。由于软件是免费提供的,因此可以使用、部署和尝试不同的解决方案,直到发现适合的解决方案。
有时候,使用开源工具还可以更快地完成任务。这是因为开源工具是由一组人共同开发的,这些人可以编辑和修改初始源代码。因此他们可以发现有问题或耗时较长的组件,并通过修改代码使之更易于使用,或者使之变得更有用。
但是也许最重要的是,对于大多数开源解决方案,您可以免费地使用、编辑和扩展初始代码,使之适合您自己的需求。如果选择的工具不能提供所需的信息,通常可以对它进行扩展,而大多数商业工具不支持这样的扩展,或者,还可以修改初始源代码,以获得想要的功能。
大多数情况下,可以利用原有解决方案的灵活性来满足需求。首先我们来看看最常见的解决方案所提供的功能和灵活性:开源脚本编制语言。
使用脚本编制语言
在开源模型中,可以利用的一个关键的领域就是脚本编制语言。诸如 Perl、PHP、Python 和 Ruby 之类的语言都提供了丰富的功能,通过它们可以快速、轻松地开发可用于分布式环境的应用程序。
在使用脚本编制语言时,由于不需要遵循常规的编写/编译/链接/执行步骤,因此,与传统的 C/C++ 应用程序相比,应用程序的开发通常要快得多。而且,所有脚本编制语言都提供了库和用于连接到不同 Web 服务技术(例如 SOAP 和 XML-RPC)的扩展,这意味着可以非常快速地开发与已有基础设施交互的解决方案,或者可以创建全新的 Web 服务以支持网格服务。
Web 服务通常是大多数现代 Web 解决方案的一部分。Web 服务具有很多的优点,例如易于部署、灵活性和兼容性。例如,可以使用 Perl 编写如下所示的脚本来开发一个 Web 服务客户机。
清单 1. 使用 Perl 开发 Web 服务客户机
#!/usr/bin/perl
use warnings;
use strict;
use SOAP::Lite;
print SOAP::Lite
-> uri('http://snode1:32080/')
-> proxy('http://snode1:32080/?session=store')
-> submit_image($image)
-> result;
print "\n";
|
这个例子源自一个用 Perl 编写的、实现一个照片存储系统的网格解决方案(见 参考资料),在这个例子中,我们使用 SOAP::Lite 模块构建一个 SOAP 客户机。在这里,我们在网格节点 snode1 的 32080 端口上访问 Web 服务,并将图片提交到系统中。
通过使用 Perl 的内部 hash 类型,可以简化网格中各个服务器的配置,如下所示。
清单 2. 使用 Perl 的内部 hash 类型
$node = {
'name' => 'linux-grid-1',
'type' => 'snode',
'remote => 'snode1',
'gridid' => '43729810-09399528-817022102',
'grid' => 'image-grid-1',
'nodeid' => '57175600-10287415-53438102',
'distributorid' => '',
'distributor' => '',
'verification-id' => '',
};
|
当提交照片到网格中时,使用各个节点生成的信息来跟踪它们的当前可用存储,选择一个节点,并(使用 Perl Dumper)将信息串行化到一个可被存储到数据库中的结构。
信息在网格上的分发是这样处理的:首先获得当前未解决的请求的列表,并处理提供者(网格节点)列表,然后使用 SOAP 接口将最终的工作单元分发到目标节点。而在节点中搜索已有的项则几乎是一个相反的过程:将搜索提交到每个已知的节点,并收集响应。
清单 3 显示了一个不同的例子,这一次是一个完全用 Python 编写的计算网格。对于这个解决方案,我们不仅使用 Web 服务,还利用了 Python 语言作为脚本编制语言的灵活性。
对于大多数计算网格,需要做的是开发一个可以执行计算并返回结果的应用程序。通过使用 Python,可以分发将执行计算的 Python 脚本。我们并不局限于独立应用程序所提供的功能,而是可以以分布式的方式处理任何 Python 脚本。
网格功能的核心是 Web 服务,这一次我们使用 XML-RPC,它是一种更轻量级的、易于实现的服务。下面是主提供者(网格节点)Python 模块。
清单 3. 用 Python 编写的计算网格
import time,sys
sys.path.append('..')
import DWGrid
from xmlrpclib import Server
gridspec = DWGrid.DWGrid()
provider = DWGrid.DWGridProvider(gridspec,'sulaco','192.168.0.101')
provider.register_component()
distributor = Server(gridspec.distributor)
def get_workunits():
global provider,gridspec
items = distributor.getworkunits(5)
counter = 0
for item in items:
gridspec.workunitqueue.add(item,'queue',item['_workunitid'])
counter = counter+1
return counter
def run_calculation(item):
workunit = provider.grid.workunitqueue.get(item,'queue')
distributor.log_status(provider.name,1)
gridspec.workunitqueue.move(workunit['_workunitid'],'queue','active')
modulename = workunit['calctype']
try:
exec 'import calculate_' + modulename + ' as calculate'
except:
(result,moduledata) = distributor.get_service_byname(modulename,'module')
if (result == 0):
modulefile = open('calculate_%s.py' % modulename,'w')
modulefile.write(moduledata)
modulefile.close()
try:
exec 'import calculate_' + modulename + ' as calculate'
except:
gridspec.workunitqueue.move(workunit['_workunitid'],'active','queue')
print "Error, module recovered from server does not load"
sys.exit(1)
else:
print "Error, module %s from server doesnt exist" % (modulename)
gridspec.workunitqueue.move(workunit['_workunitid'],'active','queue')
sys.exit(1)
distributor.log_event('log',provider.name,
'Starting Processing Workunit ID %s' % (item))
calcfunc = calculate.DWGridComputational()
result = calcfunc.execute(workunit['args'])
distributor.log_event('log',provider.name,'Finished Processing
Workunit ID %s' % (item))
workunit['result'] = result
gridspec.workunitqueue.move(workunit['_workunitid'],'active','complete')
gridspec.resultqueue.add(workunit,'queue',workunit['_workunitid'])
def put_results(items):
for resultid in items:
workunit = gridspec.resultqueue.get(resultid,'queue')
gridspec.resultqueue.move(resultid,'queue','active')
try:
distributor.putresult(workunit)
except:
gridspec.resultqueue.move(resultid,'active','queue')
return
gridspec.resultqueue.move(resultid,'active','complete')
while 1:
# first thing we need to do is check if there is anything
# in our queue that needs calculating
items = provider.grid.workunitqueue.list('queue')
if len(items) > 0:
run_calculation(items[0])
else:
count = get_workunits()
if count == 0:
distributor.log_status(provider.name,0)
time.sleep(60)
continue
items = provider.grid.resultqueue.list('queue')
if len(items) > 0:
put_results(items)
|
虽然这看上去有些令人生畏,但是可以看看执行网格组件的核心元素:
-
get_workunits() 与分发节点联系,并获得未解决工作单元列表。
-
run_calculation() 提取计算所需的 Python 模块,将该模块保存到一个可执行文件中,装载准备执行嵌入式计算方法的文件,然后执行它,将计算结果添加到提供者的内部队列中。
-
put_results() 获得完整的结果,并将它们提交给分发节点。
为了演示使用这种 Python 或其它开源解决方案的开发有多快,整个基于 Python 的网格解决方案只有 300 行多一点的代码,同时拥有足够的灵活性来处理各种不同的执行模块和结果,包括注册、分发和数据收集单元。
开源库和环境
前面已经讲到,开源工具的优点使我们可以编辑和修改初始代码,以适合自己的需求,但是这通常是不必要的。需要的工具和功能通常已经存在了,这不是因为它们已经被构建在初始解决方案中,而是因为解决方案通常更灵活、更易于扩展。
在查看目前可用的一些主要环境之前,不应该忽视很多脚本编制语言提供的基本库和扩展。Python 和
PHP 附带了很多现成的标准模块和功能。此外,还有很多第三方的扩展。Perl 提供了众所周知的 Comprehensive Perl Archive Network(CPAN)模块库。
有些构建在开源技术之上的环境将很多不同组件的功能组合到一个系统中,这个系统可用于开发和部署不同类型的应用程序。虽然这里提到的所有开源环境并不都是专门用于开发网格解决方案的,但是其中大多数都可以加以调整、修改或者用作开发基于网格的解决方案的基础。
LAMP 及派生物
最初的 LAMP 环境是指用于创建 Web 站点的 Linux 操作系统、Apache HTTP 服务器、MySQL 数据库和 PHP 工具集的组合。随着时间的推移,LAMP 形成了很多的派生物和变体。例如,“P” 还常用于指基于 Perl 和 Python 的环境,或者将 “P” 换成 “R”,即 LAMR,表示 Ruby 或 Ruby on Rails 解决方案,或者将 “P” 换成 “J”,表示 Java™/JSP 环境。
“L” 可换成 Windows®(WAMP),进而又导致 WIMP
(Windows 和 IIS)、SAMP(Solaris)、MAMP(Mac OS X)甚至 BAMP(BSD)的出现。MySQL 也可换成 PostgreSQL(LAPP)。一些商业环境和应用程序也加入进来,例如首字母缩写 WASP(Windows、Apache、SQL Server 和 PHP)和 OPAL (Oracle)。
LAMP 组合是为 Web 站点的开发和部署而设计的,它将一些最好的组件组合起来使用。 虽然这些工具不是为网格开发而设计的,但是将这些工具组合在一起可以使基于网格的解决方案的开发和部署变得非常容易。
在网格部署当中,可以利用各个工具处理典型网格解决方案中的不同部分:
- Apache 是强大的 HTTP 服务平台,它为不同的应用程序和脚本提供一个可伸缩的环境,并且可用于提供安全性和跟踪功能。
- MySQL、PostgreSQL 和 Apache Derby 都是非常高效的关系数据库解决方案。在典型的网格解决方案中,它们可用于提供集中的存储和资源供应。
- Perl、Python、PHP、Ruby 等为快速开发应用程序提供了一个适当的脚本编制环境,它们可以调用大量强大的库和提供特定功能的扩展,例如 Web 服务或安全性。
除了加快开发过程外,使用 LAMP 或派生的解决方案还可以使部署过程变得容易、快捷。大多数 Linux
发行版都附带了 LAMP 工具包标准。因此,构建一个使用 LAMP 环境的网格就变得非常简单,只需安装和设置各个基于 Linux 的网格节点,并将网格应用程序脚本部署到节点上。
Apache 的 Java 工具包
虽然严格地来讲 Java 本身并不是开源的,但很多开源工具包和库都构建在 Java 技术的基础上,以提供核心功能(例如 Web serving 和 Web 服务),以及生成一些特定于网格的工具包。其中关键的工具包是来自 Apache Software Foundation 的工具包。
Apache 产生了一套可在构建网格环境时使用的工具:
- Apache Tomcat 是基于 Java 的 Web-serving 环境,可用于共享用于 Java 应用程序的基本文件和基于 Web 的解决方案,例如 JSP 和 Java servlets。
Tomcat 常被作为用于 Apache Java 工具包中很多其它工具的基本服务环境,这些工具本身也基于相同的 JSP/servlet 技术。
- Axis 是 SOAP Web 服务解决方案的一个实现,而 Axis2 则是它的一个改进版,后者不仅支持 SOAP,还支持其它一些解决方案,例如
Representational State Transfer(REST)。Axis2 工具包包括很多关键的 Web 服务实现,例如 WS-Reliable Messaging、WS-Coordination、
WS-Security 和 WS-Addressing,在现代基于 Web 服务的网格环境中,所有这些都是关键的一部分。
- Apache Muse 是 WS-ResourceFramework、WS-BaseNotification 和 WS-DistributedManagement 标准的一个实现,也是很多基于 Web 服务的网格环境的关键元素。Muse 和 Axis/Axis2 都依赖于 Tomcat 的 Web-serving 环境来提供核心的 HTTP 协议。
通过将很多这样的服务组合起来,并使用各种基于 Web 服务的解决方案所提供的功能,可以很容易地构建基于 Web 服务的网格解决方案。请参阅 参考资料,其中提供了一系列使用不同 Apache 工具包构建网格解决方案的教程、文章和解决方案。
上述所有解决方案都是开源的,但是它们都处在 Apache Software Foundation 的强有力的控制和指导之下,
Apache Software Foundation 的开发人员和架构师致力于确保各个项目都符合他们的目标和关注点。
ActiveGrid
ActiveGrid 系统并不像字面意思那样指一个特定于网格的开发和部署环境。它也不是真正开源的。实际上,ActiveGrid 是使用 LAMP 工具包开发应用程序的一种环境,它可以利用网格式技术进行高度分布式的企业应用程序的开发。
该系统依赖于两个组件:用于设计和开发应用程序的 ActiveGrid Application Builder 和可用于部署应用程序的 ActiveGrid Application Server。
其关注的焦点是开发全面的、利用网格环境的应用程序,而不是提供较小的、可伸缩组件来开发小型独立应用程序。
结束语
我们了解了使用开源技术开发网格解决方案的优点和缺点。通过本文中的示例和信息应该可以看到这种开发的简单性和速度。通过将脚本编制语言提供的快速开发环境与很多开源库和其它解决方案相结合,可以非常快速、轻松地创建基于网格的解决方案。
本文细述的 Perl 和 Python 解决方案都来自一些关于开发网格解决方案的较大的系列(见 参考资料)。
参考资料 学习
获得产品和技术
-
下载
IBM 产品评估版,获得来自 DB2、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
-
使用 IBM 试用软件 改进您的下一个开发项目,可通过下载或 DVD 获得。
讨论
关于作者  | 
|  | Martin Brown 成为职业作家已有八年多的时间。他所撰写的书籍和文章涵盖了各种各样的主题。他擅长的领域包括许多开发语言和平台(Perl、Python、Java、JavaScript、Basic、Pascal, Modula-2、C、C++、Rebol、Gawk、Shellscript、Windows、Solaris、Linux、BeOS、Mac OS/X 等等)以及 Web 编程、系统管理与集成。Martin 是 ServerWatch.com、LinuxToday.com 和 IBM developerWorks 的定期撰稿人,还为 Computerworld、The Apple Blog 和其他站点定期编写博客,同时还是 Microsoft 的主题专家(SME)。您可以通过他的网站 http://www.mcslp.com 与他联系。 |
对本文的评价
|