用GridFTP傳送文件 |
發布時間: 2012/8/14 11:06:11 |
計算網格為那些強大的新型探索工具提供了基礎設施,這些基礎設施包括桌面計算、智能設備、協作和分布式計算。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.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 的安全性功能。 本文出自:億恩科技【www.sunshares.net】 |