最近有一個需求,要求使用httpfs讀取數據,一開始看到httpfs這個詞,第一感覺是不是多了個f,是不是https,后來百度一下,其實不然。
httpfs其實是使用http協議訪問hdfs文件系統:
HttpFS是一台提供REST HTTP網關的服務器,該網關支持所有HDFS文件系統操作(讀取和寫入)。並且可以與webhdfs REST HTTP API 互操作。
HttpFS可用於在運行不同版本Hadoop的群集之間傳輸數據(克服RPC版本問題),例如使用Hadoop DistCP。
HttpFS可用於訪問防火牆后面的群集上的HDFS中的數據(HttpFS服務器充當網關,並且是唯一允許將防火牆穿過群集進入群集的系統)。
HttpFS可用於使用HTTP實用程序(例如curl和wget)和來自Java以外的其他語言的HTTP庫Perl來訪問HDFS中的數據。
所述webhdfs客戶文件系統實現可以用於使用Hadoop的文件系統命令(訪問HttpFS hadoop的FS)行工具使用Hadoop的文件系統的Java API的Java應用程序,以及。
HttpFS具有內置的安全性,支持Hadoop偽身份驗證和HTTP SPNEGO Kerberos以及其他可插入身份驗證機制。它還提供了Hadoop代理用戶支持。
詳情可參考:https://hadoop.apache.org/docs/stable/hadoop-hdfs-httpfs/index.html
服務器啟動:
在hadoop3.1.2版本中已經將httpfs集成好了,我們只需要配置httpfs相關配置,啟動后就能使用httpfs訪問hdfs文件服務器
具體步驟:
配置HttpFS
默認情況下,HttpFS假定Hadoop配置文件(core-site.xml和hdfs-site.xml)位於HttpFS配置目錄中。
如果不是這種情況,則將httpfs.hadoop.config.dir屬性添加到httpfs-site.xml文件,該屬性設置為Hadoop配置目錄的位置。
1.在core-site.xml中添加如下配置
<property> <name>hadoop.proxyuser.root.hosts</name> <value>s128</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
,其中紅色標注的地方為代理用戶身份運行HttpFS服務器的Unix用戶,
hadoop.proxyuser.root.hosts我這里指定了具體的一台NameNode機器,如果指定其他hosts,可能會出現異常:
{"RemoteException":{"message":"Unauthorized connection for super-user: root from IP 192.168.3.128","exception":"RemoteException","javaClassName":"org.apache.hadoop.ipc.RemoteException"}}
重新啟動Hadoop
您需要重新啟動Hadoop才能使proxyuser配置生效。
啟動/停止HttpFS
要啟動/停止HttpFS,請使用hdfs --daemon start | stop httpfs。例如:
hdfs --daemon start httpfs
測試HttpFS是否正常
http://s128:14000/webhdfs/v1?op=gethomedirectory&user.name=root
返回結果:
{"Path":"\/user\/root"}
表示HttpFS服務啟動正常了
HTTPFS使用
http://${host}:14000/webhdfs/v1/${path}?op=${operator}&user.name=${user}
其中${host}為hadoop中啟動的httpfs服務的host
${path}為要操作的路徑,可以是目錄也可以是文件
${operator}為操作類型,常見的如下:
HTTP GET
OPEN (see FileSystem.open)
GETFILESTATUS (see FileSystem.getFileStatus)
LISTSTATUS (see FileSystem.listStatus)
GETCONTENTSUMMARY (see FileSystem.getContentSummary)
GETFILECHECKSUM (see FileSystem.getFileChecksum)
GETHOMEDIRECTORY (see FileSystem.getHomeDirectory)
GETDELEGATIONTOKEN (see FileSystem.getDelegationToken)
HTTP PUT
CREATE (see FileSystem.create)
MKDIRS (see FileSystem.mkdirs)
RENAME (see FileSystem.rename)
SETREPLICATION (see FileSystem.setReplication)
SETOWNER (see FileSystem.setOwner)
SETPERMISSION (see FileSystem.setPermission)
SETTIMES (see FileSystem.setTimes)
RENEWDELEGATIONTOKEN (see DistributedFileSystem.renewDelegationToken)
CANCELDELEGATIONTOKEN (see DistributedFileSystem.cancelDelegationToken)
HTTP POST
APPEND (see FileSystem.append)
HTTP DELETE
DELETE (see FileSystem.delete)
${user}為httpfs啟動用戶名
列舉某個文件夾下的文件:列舉/wbd_test下的文件
http://s128:14000/webhdfs/v1/wbd_test?op=LISTSTATUS&user.name=root
返回結果:
{
"FileStatuses":{
"FileStatus":[
{
"pathSuffix":"snapshot_lzo_e302a790db684d05b084db87c6379008.txt",
"type":"FILE",
"length":2546994,
"owner":"root",
"group":"supergroup",
"permission":"644",
"accessTime":1571972356950,
"modificationTime":1571972365701,
"blockSize":134217728,
"replication":2
}
]
}
}