计算网格为那些强大的新型探索工具提供了基础设施,这些基础设施包括桌面计算、智能设备、协作和分布式计算。Globus 项目(Globus Project)目前致力于定义和开发具有下列能力的持续数据网格:
GridFTP 协议及其系列工具源自于意识到这样一个问题,即网格环境需要一种快捷、安全、有效而且可靠的传输机制。计算网格是如此的庞大和分散,以致于需要一种健壮的传输机制。GridFTP 因其支持下列功能而满足了这些需求:
清单 1中的 Java 类实现了一个到本地文件系统的基本 GridFTP 传送。
Globus Toolkit 使用标准 log4j 包( http://jakarta.apache.org/log4j/docs/)通过定义一个静态记录器来显示日志消息:
private static Logger logger = Logger.getLogger(MyGridFTP.class.getName());
类构造函数获取主机名和端口作为参数,并使用网格安全性基础设施(GSI)凭证对服务器进行认证。
注:该类只能与 Globus Toolkit 2.2 一起使用,而不能与 2.0 一起使用。Globus Toolkit 版本 2.0 和 2.2 之间的 GSI 有重大的变化。
确保使用了正确的 Java CoG Kit 版本下面对 Java CoG Kit 0.9.13 到当前版本 Java CoG Kit 1.1a 之间的主要 GSI 变化进行了汇总:
不赞成使用的包 | 取而代之的包或方法 |
org.globus.security | org.ietf.jgss |
org.globus.io.ftp | org.globus.ftp |
org.globus.mds.MDS | 使用 JNDI(和 LDAP 提供程序)或直接使用 Netscape 目录 SDK(Netscape Directory SDK)来访问 MDS。 |
org.globus.gsi.GlobusCredential
类基本上已经取代了 org.globus.security.GlobusProxy
类的功能。然而,Globus 还是建议(如果可能的话) 不要使用 org.globus.gsi.GlobusCredential
类,因为它代表特定于某个安全性协议的公钥基础设施(Public Key Infrastructures, PKI)凭证。相反,Globus 建议尽可能多地使用一般安全性服务(Generic Security Service, GSS)抽象。要了解更多信息,请通过 http://www-unix.globus.org/cog/distribution/1.1/compatibility.html访问 Java 分发下的 compatibility.html 文件。
为了通过 GridFTP 服务器的认证,必须将旧代理 GSI_2_PROXY
转换成 GSSCredential。 清单 2中的代码片段显示了该如何进行这一转换。
要开始从远程主机传送文件,您可以使用 清单 3 中的代码。
接口 DataSink
对于写进入的数据非常有用。请实现该接口以提供自己的数据存储方式。
注:代码必须是线程安全的。使用并行传送方式时,几个流可能会试图写到该接口。
传送多个文件传送多个文件要求客户机将传送方式设置为:对于侦听方,设置为被动方式;对于发送方,设置为主动方式。使用多个 get
调用还不够,因为数据通道在每次传送后都自动关闭。对于每个 get
调用,都由客户端接收数据(被动),而由远程主机发送数据(主动)。
在每次调用 get
之前,请发出下面这行代码:
client.setLocalPassive();client.setActive();
在进行每次 put
操作之前,都需要逆转主被动方式。请发出下面这行代码:
client.setLocalActive();client.setPassive();
。
要了解更多信息,请通过 http://www-unix.globus.org/cog/jftp/guide.html 阅读 GridFTP 客户机程序员指南(GridFTP client programmer guide)。
并行传送乍一看,GridFTP 给您的感觉可能是:您可以让 FTP 客户机以 Kazza/Morpheus 样式从多个服务器传送多个文件。实际上,并行在 GridFTP 中仅仅是指将打开多个流从同一个服务器传送某个文件。
对于涉及双方的传送,除非您有多处理器机器,否则 GridFTP 只会增加开销。下面这段内容引自 GridFTP 客户机 — 程序员指南(GridFTP client - programmer guide):
对于涉及双方的传送而言,选择并行性时应该谨慎。使用多个流的优点很大程度上与低级 TCP 过程有关,同时也与 TCP 窗口大小有关。使用双倍的并行流并不一定会使性能提高一倍。实际上,从某种角度来看,性能反而会下降。ftp 包的当前实现在单独的线程中处理每条数据路径,因此,除非您的机器有多个 CPU,否则增加并行性只会增加计算开销( http://www-unix.globus.org/cog/jftp/guide.html)。
并行传送需要使用扩展方式。而且,传送类型必须为映像,而数据接收器/源必须支持随机数据访问且必须是线程安全的。多个线程可能会向其中写入数据。 清单 4 显示了实现并行 get
调用的方法。
要测试远程文件传送,请使用 清单 5中的代码。
log4j 工具对于调试和监控 FTP 传送都非常有用:
Logger.getRoot().setLevel(Level.INFO);
Logger.getRoot().setLevel(Level.DEBUG);
以 INFO
级别执行该类将得到 清单 6 中的样本输出。
在上面的样本输出中,有用的信息包括 GridFTP 服务器的版本。在该特例中,那些有用信息是 dhcp126.adtech.inte.net.ibm.com GridFTP Server 1.5 GSSAPI type Globus/GSI wu-2.6.2 (gclearcase/" target="_blank" >cc32dbg, 1032298778-28) ready
。
编写这些代码过程中所碰到的大多数问题都与处理旧代理及将它们转换成 GSSCredential 有关。仔细检查该类的构造函数,确保理解了该转换过程。还要确保运行了 Globus Toolkit 和 GridFTP 服务器的正确版本。较旧的版本不支持 GSSAPI。
结束语GridFTP 是一种安全可靠的高性能数据传输协议,针对高带宽广域网对其进行了优化。GridFTP 协议基于 FTP 这一流行的因特网文件传送协议。这个 Java 类可以帮助您理解:GridFTP 是如何从远程服务器进行基本传送的,还向您显示了 Globus Toolkit 2.2 的安全性功能。
(责任编辑:城尘)