亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
1111
2025-03-31
3.4? Hadoop文件系統
Hadoop有一個抽象的文件系統概念,HDFS只是其中的一個實現。Java抽象類 org.apache.hadoop.fs.FileSystem定義了Hadoop 中一個文件系統的客戶端接口,并且該抽象類有幾個具體實現,其中和Hadoop緊密相關的見表3-1。
表3-1.??Hadoop文件系統
文件系統
URI方案
Java實現(都在org.apache.
hadoop包中)
描述
Local
file
fs.LocalFileSystem
使用客戶端校驗和的本地磁盤文件系統。使用RawLocalFileSystem表示無校驗和的本地磁盤文件系統。詳情參見5.1.2節
HDFS
hdfs
hdfs.DistributedFileSystem
Hadoop 的分布式文件系統。將HDFS設計成與MapReduce結合使用,可以實現高性能
文件系統
URI方案
Java實現(都在org.apache.
hadoop包中)
描述
WebHDFS
Webhdfs
Hdfs.web.WebHdfsFileSystem
基于HTTP的文件系統,提供對HDFS的認證讀/寫訪問。詳情參見3.4節相關內容
Secure WebHDFS
swebhdfs
hdfs.web.SWebHdfsFileSystem
WebHDFS的HTTPS版本
HAR
har
fs.HarFileSystem
一個構建在其他文件系統之上用于文件存檔的文件系統。Hadoop存檔文件系統通常用于將HDFS中的多個文件打包成一個存檔文件,以減少namenode內存的使用。使用hadoop的achive命令來創建HAR 文件
View
viewfs
viewfs.ViewFileSystem
針對其他Hadoop文件系統的客戶端掛載表。通常用于為聯邦namenode創建掛載點,詳情參見3.2.4節
FTP
ftp
fs.ftp.FTPFileSystem
由FTP 服務器支持的文件系統
S3
S3a
fs.s3a.S3AFileSystem
由Amazon S3 支持的文件系統。替代老版本的s3n(S3 原生)實現
Azure
wasb
fs.azure.NativeAzure
FileSystem
由Microsoft ? Azure支持的文件系統
Swift
swift
fs.swift.snative.
SwiftNativeFileSystem
由OpenStack ? Swift支持的文件系統
Hadoop 對文件系統提供了許多接口,它一般使用URI 方案來選取合適的文件系統實例進行交互。舉例來說,我們在前一小節中遇到的文件系統命令行解釋器可以操作所有的Hadoop 文件系統命令。要想列出本地文件系統根目錄下的文件,可以輸入以下命令:
% hadoop fs -ls file:///
盡管運行的MapReduce程序可以訪問任何文件系統(有時也很方便),但在處理大數據集時,建議你還是選擇一個有數據本地優化的分布式文件系統,如HDFS(參見2.4節)。
接口
Hadoop是用Java寫的,通過Java API可以調用大部分Hadoop文件系統的交互操作。例如,文件系統的命令解釋器就是一個Java 應用,它使用Java 的FileSystem類來提供文件系統操作。其他一些文件系統接口也將在本小節中做簡單介紹。這些接口通常與HDFS一同使用,因為Hadoop中的其他文件系統一般都有訪問基本文件系統的工具(對于FTP,有FTP客戶端;對于S3,有S3工具,等等),但它們大多數都能用于任何Hadoop 文件系統。
Hadoop以Java API的形式提供文件系統訪問接口,非Java開發的應用訪問HDFS會很不方便。由WebHDFS協議提供的HTTP REST API則使得其他語言開發的應用能夠更方便地與HDFS交互。注意,HTTP接口比原生的Java客戶端要慢,所以不到萬不得已,盡量不要用它來傳輸特大數據。
通過HTTP來訪問HDFS有兩種方法:直接訪問,HDFS守護進程直接服務于來自客戶端的HTTP請求;通過代理(一個或多個)訪問,客戶端通常使用DistributedFileSystem API訪問HDFS。這兩種方法如圖3-1所示。兩者都使用了WebHDFS協議。
圖3-1. 通過HTTP直接訪問HDFS或者通過多個HDFS代理訪問HDFS
在第一種情況中,namenode和datanode內嵌的web服務器作為WebHDFS的端節點運行。(由于dfs.webhdfs.enabled被設置為true,WebHDFS默認是啟用狀態。)文件元數據操作由namenode管理,文件讀(寫)操作首先被發往namenode,由namenode發送一個HTTP重定向至某個客戶端,指示以流方式傳輸文件數據的目的或源datanode。
第二種方法依靠一個或者多個獨立代理服務器通過HTTP訪問HDFS。(由于代理服務是無狀態的,因此可以運行在標準的負載均衡器之后。)所有到集群的網絡通信都需要經過代理,因此客戶端從來不直接訪問namenode或datanode。使用代理服務器后可以使用更嚴格的防火墻策略和帶寬限制策略。通常情況下都通過代理服務器,實現在不同數據中心中部署的Hadoop集群之間的數據傳輸,或從外部網絡訪問云端運行的Hadoop集群。
HttpFS 代理提供和WebHDFS相同的HTTP(和HTTPS)接口, 這樣客戶端能夠通過webhdfs(swebhdfs) URI訪問這兩類接口。HttpFS 代理的啟動獨立于namenode和datanode的守護進程,使用httpfs.sh腳本,默認在一個不同的端口上監聽(端口號14000)。
Hadoop提供了一個名為libhdfs的C語言庫,該語言庫是Java FileSystem接口類的一個鏡像(它被寫成訪問HDFS的C語言庫,但其實它可以訪問任何一個Hadoop文件系統)。它使用Java原生接口(JNI, Java Native Interface)調用Java 文件系統客戶端。同樣還有一個libwebhdfs庫,該庫使用了前述章節描述的WebHDFS接口。
這個C語言API 與Java的API非常相似,但它的開發滯后于Java API,因此目前一些新的特性可能還不支持。可以在Apache Hapdoop二進制壓縮發行包的include目錄中找到頭文件hdfs.h。
Apache Hapdoop二進制壓縮包自帶預先編譯好的libhdfs二進制編碼,支持64位Linux。但對于其他平臺,需要按照源代碼樹頂層的BUILDING.txt指南自行編譯。
使用Hadoop的NFSv3網關將HDFS掛載為本地客戶端的文件系統是可行的。然后你可以使用Unix實用程序(如ls和cat) 與該文件系統交互,上傳文件,通過任意一種編程語言調用POSIX 庫來訪問文件系統。由于HDFS僅能以追加模式寫文件,因此可以往文件末尾添加數據,但不能隨機修改文件。
關于如何配置和運行NFS網關,以及如何從客戶端連接網關,可以參考Hadoop相關文檔資料。
用戶空間文件系統(FUSE, Filesystem in Userspace,)允許將用戶空間實現的文件系統作為Unix文件系統進行集成。通過使用Hadoop的Fuse-DFS功能模塊,HDFS(或任何一個Hadoop 文件系統)均可以作為一個標準的本地文件系統進行掛載。Fuse-DFS是用C語言實現的,使用libhdfs作為訪問HDFS的接口。在寫操作時,Hadoop NFS網關對于掛載HDFS來說是更健壯的解決方案,相比Fuse-DFS而言應優先選擇。
大數據 Hadoop
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。