
掌握API建模:基本概念和實踐
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
在CDH中啟用:(默認是開啟的)
注意:
端口配置:
WEBHDFS REST API使用的端口是WebHDFS默認端口,通常為50070(HTTP)或50470(HTTPS)。這些端口可以通過Hadoop配置文件進行自定義設置。在配置文件中,dfs.namenode.http-address
指定了HTTP端口,dfs.namenode.https-address
指定了HTTPS端口。具體的端口配置取決于Hadoop集群的設置和管理員的配置。
webhdfs://<HOST>:<HTTP_PORT>/<PATH>
這個可以和和常用的HDFS的URl對比,格式如下:
hdfs://<HOST>:<RPC_PORT>/<PATH>
兩者之間的區別主要在于通信協議和端口:
2.HTTP?URl格式是:,請求的方式如下
http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=...
在REST API中,完整的路徑中需要插入了前綴”/webhdfs/v1″,并在末尾附加了查詢。因此,完整相應的HTTP URL具有以下格式:
http://<namenode>:<port>/webhdfs/v1/<path>?<query>
<namenode>
是HDFS Namenode的主機名或IP地址。<port>
是Namenode的WebHDFS服務運行的端口號(HTTP默認為50070,HTTPS默認為50470)。<path>
是要進行交互的HDFS文件或目錄的路徑。<query>
是查詢參數,用于指定操作、用戶、權限等。例如,要訪問根目錄中名為 “example.txt” 的文件,則相應的URL可能如下所示:
http://<namenode>:<port>/webhdfs/v1/example.txt?op=OPEN&user.name=<username>
<op>
是操作參數,user.name
是指定訪問文件的用戶的查詢參數。請注意,實際的URL和查詢參數將根據具體操作和需求而有所不同。curl -s "http://ds-bigdata-001:9870/webhdfs/v1/tmp?user.name=aqiang&op=GETFILESTATUS" | jq
這個命令使用curl發送HTTP GET請求到指定的URL。URL是http://ds-bigdata-001:9870/webhdfs/v1/tmp?user.name=aqiang&op=GETFILESTATUS
,
其中包括了查詢參數user.name
和op
。
-s
選項用于禁用curl的進度條顯示。
然后,通過管道將curl的輸出傳遞給jq命令。jq是一個命令行工具,用于處理JSON數據。
運行該命令后,curl會向指定URL發送請求,并獲取到JSON響應。然后,這個JSON響應會被傳遞給jq命令進行處理。jq會對JSON進行解析和格式化,并將格式化后的結果輸出到終端上。
2.創建目錄
curl -i -X PUT "http://ds-bigdata-001:9870/webhdfs/v1/tmp/test_webhdfs_dir?user.name=aqiang&op=MKDIRS"
這里通過api在/tmp目錄下新建一個目錄test_webhdfs_dir。
驗證已經創建成功;
3.讀取文件
curl -L "http://ds-bigdata-001:9870/webhdfs/v1/tmp/test_webhdfs_dir/1.txt?op=OPEN&user.name=aqiang"
這里提前在指定目錄下放一個1.txt的文件。下面成功讀取到文件的內容。
4.刪除文件
curl -i -X DELETE "http://ds-bigdata-001:9870/webhdfs/v1/tmp/test_webhdfs_dir/1.txt?op=DELETE&user.name=aqiang"
權限管理上,一般操作比較多的就是文件的ACL條目設置,具體的一些相關操作總結如下:
## 以curl請求為例:
curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=MODIFYACLENTRIES&aclspec=<ACLSPEC>"
curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=REMOVEACLENTRIES&aclspec=<ACLSPEC>"
curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=REMOVEACL"
curl -i -X PUT "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETACLSTATUS"
ACLSPEC?格式如下:【ACL權限規范中的每個條目都要符合下面格式要求,多個條目之前使用逗號分隔.】
^(default:)?(user|group|mask|other):[[A-Za-z_][A-Za-z0-9._-]]*:([rwx-]{3})?(,(default:)?(user|group|mask|other):[[A-Za-z_][A-Za-z0-9._-]]*:([rwx-]{3})?)*$
(default:)?:可選的前綴,表示默認權限。
(user|group|mask|other):指定條目的類型,可以是用戶、組、掩碼或其他。
[[A-Za-z_][A-Za-z0-9._-]]*:條目的名稱,可以是字母、數字、下劃線、點或破折號組成。
([rwx-]{3})?:可選的權限部分,表示讀、寫和執行權限。
1. 添加(修改)acl;可以修改已有的acl和添加新的acl權限
curl -i -X PUT "http://ds-bigdata-001:9870/webhdfs/v1/mobtttt?user.name=hdfs&op=MODIFYACLENTRIES&aclspec=user:test555:rwx,user:test6666:rw-,group:mob:r-x"
http://ds-bigdata-001:9870
:WebHDFS服務的地址和端口。/webhdfs/v1/mobtttt
:要修改ACL權限的目錄路徑。user.name=hdfs
:指定代理用戶為hdfs
。op=MODIFYACLENTRIES
:指定操作為修改ACL權限。aclspec=user:test555:rwx,user:test6666:rw-,group:mob:r-x
:指定ACL權限規范,其中包含要修改的ACL條目。
user:test555:rwx
:用戶test555
具有讀、寫和執行權限。user:test6666:rw-
:用戶test6666
具有讀和寫權限,但無執行權限。group:mob:r-x
:組mob
的成員具有讀和執行權限,但無寫權限。說明:此條指令是同時添加多條acl條目,多條用逗號隔
2.刪除指定的acl條目
curl -i -X PUT "http://ds-bigdata-001:9870/webhdfs/v1/mobtttt?user.name=hdfs&op=REMOVEACLENTRIES&aclspec=user:test6666:,group:mob:"
op=REMOVEACLENTRIES
:指定操作為刪除ACL權限。aclspec=user:test6666:,group:mob:
:指定ACL權限規范,其中包含要刪除的ACL條目。
user:test6666:
:刪除用戶test6666
的ACL條目。group:mob:
:刪除組mob
的ACL條目。3.刪除所有的acl條目
curl -i -X PUT "http://ds-bigdata-001:9870/webhdfs/v1/mobtttt?user.name=hdfs&op=REMOVEACL"
4.獲取acl條目
curl -i -X get http://ds-bigdata-001:9870/webhdfs/v1/mobtttt?op=GETACLSTATUS
tips:WEBHDFS Rest API 一般可以配合自動化腳本等場景來使用。
在有些場景下,我們可能只需要ACL相關的設置功能,此時可以修改源碼或者自定義一個新的接口去實現。下面是一個僅供參考的示例demo。
from flask import Flask, request
import subprocess
app = Flask(__name__)
@app.route('/hdfs/acl', methods=['POST'])
def set_acl():
path = request.form.get('path')
acl = request.form.get('acl')
try:
command = ['hdfs', 'dfs', '-setfacl', '-R', '-m', acl, path]
subprocess.run(command, check=True)
print(command)
return 'ACL set successfully'
except subprocess.CalledProcessError as e:
return 'Failed to set ACL: ' + str(e), 500
@app.route('/hdfs/acl', methods=['DELETE'])
def remove_acl():
path = request.form.get('path')
try:
command = ['hdfs', 'dfs', '-setfacl', '-R', '-b', path]
subprocess.run(command, check=True)
print(command)
return 'ACL removed successfully'
except subprocess.CalledProcessError as e:
return 'Failed to remove ACL: ' + str(e), 500
@app.route('/hdfs/acl', methods=['GET'])
def get_acl():
path = request.args.get('path')
try:
command = ['hdfs', 'dfs', '-getfacl', '-R', path]
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
print(command)
return result.stdout
except subprocess.CalledProcessError as e:
return 'Failed to get ACL: ' + str(e), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8099)
接口名稱:HDFS ACL 接口
接口描述:該接口用于操作HDFS的ACL,包括設置ACL、刪除ACL和獲取ACL信息。
接口URL:http://xxx:8099/hdfs/acl
接口支持的HTTP方法:
- 設置ACL:POST
- 刪除ACL:DELETE
- 獲取ACL:GET
參數說明:
1. 設置ACL(POST請求):
- 參數名:
- path
:HDFS路徑,表示要設置ACL的文件或目錄的路徑。
- acl
:ACL字符串,表示要設置的ACL規則。ACL規則的格式請參考HDFS ACL規范。
2. 刪除ACL(DELETE請求):
- 參數名:
- path
:HDFS路徑,表示要刪除ACL的文件或目錄的路徑。
3. 獲取ACL(GET請求):
- 參數名:
- path
:HDFS路徑,表示要獲取ACL的文件或目錄的路徑。
響應格式:
- 設置ACL和刪除ACL接口的響應格式為純文本,包含成功或失敗的消息。
- 獲取ACL接口的響應格式為ACL信息的文本形式。
訪問權限:
- 外部用戶需要具有HDFS操作權限,并能夠從訪問該接口的主機訪問到HDFS集群。
說明:在hdfs文件系統的集群的客戶端節點,使用hdfs用戶啟動接口服務。
錯誤處理:
- 當設置ACL、刪除ACL或獲取ACL接口發生錯誤時,會返回適當的錯誤消息和HTTP狀態碼。請根據狀態碼和錯誤消息進行錯誤處理。
# CURl 請求示例:
修改目錄/test ACL
curl -X POST -d "path=/test&acl=user:test:rwx" http://localhost:8099/hdfs/acl
刪除ACL
curl -X DELETE -d "path=/test" http://localhost:8099/hdfs/acl
獲取ACL
curl -X GET 'http://localhost:8099/hdfs/acl?path=/test'
本文章轉載微信公眾號@滌生大數據