參考
- Hadoop權威指南 第3章中3.4節
背景
要寫一個操作HDFS的web后台(文件CRUD),雖然可以直接使用HDFS提供的FileSystem
類然后通過get
方法獲取到一個DistributedFileSystem
(假設提供的文件url的模式是hdfs://
開頭)的實例來操作HDFS,但是這種方法有個限制就是調用方必須能和HDFS集群中的所有主機通信。然后這個要求有時並不能滿足,比如HDFS集群部署在一個內部隔離網絡中,而WEB服務器部署在另外一個網絡中,雖然namenode做了NAT可以被外部網絡訪問,但如前所述這是不夠的。
WebHDFS
WebHDFS提供了訪問HDFS的RESTful接口,在自己安裝的Hadoop 2.6中是默認啟動的。它和Web管理界面同在namenode的50070端口下,比如可以通過如下地址來列出HDFS根目錄的文件:
http://10.214.208.138:50070/webhdfs/v1/?op=LISTSTATUS
{"FileStatuses":{"FileStatus":[
{"accessTime":0,"blockSize":0,"childrenNum":1,"fileId":16389,"group":"supergroup","length":0,"modificationTime":1438583475410,"owner":"ubuntu","pathSuffix":"user","permission":"755","replication":0,"storagePolicy":0,"type":"DIRECTORY"},
{"accessTime":0,"blockSize":0,"childrenNum":0,"fileId":16387,"group":"supergroup","length":0,"modificationTime":1438583448451,"owner":"ubuntu","pathSuffix":"users","permission":"755","replication":0,"storagePolicy":0,"type":"DIRECTORY"},
{"accessTime":0,"blockSize":0,"childrenNum":0,"fileId":16391,"group":"supergroup","length":0,"modificationTime":1438584555313,"owner":"ubuntu","pathSuffix":"yellowbook","permission":"755","replication":0,"storagePolicy":0,"type":"DIRECTORY"}
]}}
通過將HDFS文件路徑的模式部分換成webhdfs可以獲得WebHdfsFileSystem
,但是使用它還是需要跟集群不同機器進行交互的。
HttpFS
HttpFS本質上是一個代理服務,它部署在能夠完全訪問HDFS集群的網絡內,對於文件CURD的操作全部提交給HttpFS服務,然后由它去更HDFS集群交互,所以客戶端不需要能夠訪問所有HDFS主機。HttpFS服務提供的操作接口是HTTP協議的RESTful接口,但是官方沒有提供現成的Java客戶端。HttpFS服務默認沒有啟動,可以使用在hadoop-2.6.0/sbin
中提供的httpfs.sh
腳本來啟動。HttpFS相關的文件在hadoop-2.6.0/share/hadoop/httpfs
目錄下。