<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集群的設置和管理員的配置。

2.REST API請求方式

支持 FileSystem URIs 和 HTTP URLs

  1. FileSystem scheme 是”webhdfs://”,格式如下:
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>

例如,要訪問根目錄中名為 “example.txt” 的文件,則相應的URL可能如下所示:

http://<namenode>:<port>/webhdfs/v1/example.txt?op=OPEN&user.name=<username>

在上面的示例中,<op>是操作參數,user.name是指定訪問文件的用戶的查詢參數。請注意,實際的URL和查詢參數將根據具體操作和需求而有所不同。

3.REST API具體使用

3.1 文件增刪改查

  1. 查看指定目錄的狀態
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.nameop

-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"

3.2 文件權限管理

權限管理上,一般操作比較多的就是文件的ACL條目設置,具體的一些相關操作總結如下:

WebHDFS REST API 操作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"
  1. http://ds-bigdata-001:9870WebHDFS服務的地址和端口。
  2. /webhdfs/v1/mobtttt:要修改ACL權限的目錄路徑。
  3. user.name=hdfs:指定代理用戶為hdfs
  4. op=MODIFYACLENTRIES:指定操作為修改ACL權限。
  5. aclspec=user:test555:rwx,user:test6666:rw-,group:mob:r-x:指定ACL權限規范,其中包含要修改的ACL條目。
    1. user:test555:rwx:用戶test555具有讀、寫和執行權限。
    2. user:test6666:rw-:用戶test6666具有讀和寫權限,但無執行權限。
    3. 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:"
  1. op=REMOVEACLENTRIES:指定操作為刪除ACL權限。
  2. aclspec=user:test6666:,group:mob::指定ACL權限規范,其中包含要刪除的ACL條目。
    1. user:test6666::刪除用戶test6666的ACL條目。
    2. 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 一般可以配合自動化腳本等場景來使用。

4.示例分享

在有些場景下,我們可能只需要ACL相關的設置功能,此時可以修改源碼或者自定義一個新的接口去實現。下面是一個僅供參考的示例demo。

4.1 自定義接口(python+hdfs shell)

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'

本文章轉載微信公眾號@滌生大數據

上一篇:

萬字講透REST API資源建模

下一篇:

通過Flask框架創建靈活的、可擴展的Web Restful API服務
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費