用GridFTP传送文件
来源:IMB 时间:2007-10-29 13:44:00
计算网格为那些强大的新型探索工具提供了基础设施,这些基础设施包括桌面计算、智能设备、协作和分布式计算。Globus 项目(Globus Project)目前致力于定义和开发具有下列能力的持续数据网格:
安全健壮的高性能数据传输机制。
用于创建和操作大型数据集副本的工具集。
维护数据集副本目录的机制。
GridFTP 协议及其系列工具源自于意识到这样一个问题,即网格环境需要一种快捷、安全、有效而且可靠的传输机制。计算网格是如此的庞大和分散,以致于需要一种健壮的传输机制。GridFTP 因其支持下列功能而满足了这些需求:
并行数据传输:使用多个 TCP 流比使用单个 TCP 流提高了带宽。并行数据传输由 FTP 命令扩展和数据通道扩展提供支持。
网格安全性基础设施(Grid Security Infrastructure, GSI)和 Kerberos 认证支持:由用户控制各种数据完整性和机密性级别的设置。这种功能为传送文件提供了健壮且灵活的认证、完整性和机密性机制。
数据传输的第三方控制:支持为大型分布式社区管理大型数据集。它使第三方能够对存储服务器之间的传送进行控制。
分块数据传输:能够将数据分割放置在多个服务器上,从而提高聚集带宽。GridFTP 是通过定义在网格论坛(Grid Forum)草案中的扩展来支持分块数据传输的。
部分文件传送:与标准 FTP 要求应用程序传送整个文件不同,新型 FTP 命令支持传送文件的某些区域。
可靠的数据传输:故障恢复方法可以处理瞬态网络故障和服务器故障,同时可以重新启动失败的传送。
手工控制 TCP 缓冲区大小:支持获取最大 TCP/IP 带宽。
集成检测(instrumentation):支持返回重新启动和性能标记。
连接到 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 文件。
将旧代理转换成 GSSCredential
为了通过 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.internet.ibm.com GridFTP Server 1.5 GSSAPI type Globus/GSI wu-2.6.2 (gcc32dbg, 1032298778-28) ready 。
故障诊断技巧
编写这些代码过程中所碰到的大多数问题都与处理旧代理及将它们转换成 GSSCredential 有关。仔细检查该类的构造函数,确保理解了该转换过程。还要确保运行了 Globus Toolkit 和 GridFTP 服务器的正确版本。较旧的版本不支持 GSSAPI。
结束语
GridFTP 是一种安全可靠的高性能数据传输协议,针对高带宽广域网对其进行了优化。GridFTP 协议基于 FTP 这一流行的因特网文件传送协议。这个 Java 类可以帮助您理解:GridFTP 是如何从远程服务器进行基本传送的,还向您显示了 Globus Toolkit 2.2 的安全性功能。