鉴于 Hadoop 官网上对 restful 风格的操作指令没有实际的例子,在自己踩坑之后,将常用命令总结如下:

1、检查目录状态 Check directory status

  • 命令:
curl -i "http://localhost:50070/webhdfs/v1/tmp?user.name=istvan&op=GETFILESTATUS"

#或者(去掉引号也可以)
curl -i http://localhost:50070/webhdfs/v1/tmp?user.name=istvan&op=GETFILESTATUS
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp

在HDFS中需要查看的目录路径

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 200 OK
Content-Type: application/json
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370210454798&s=zKjRgOMQ1Q3NB1kXqHJ6GPa6TlY=";Path=/
Transfer-Encoding: chunked
Server: Jetty(6.1.26)

{"FileStatus":{"accessTime":0,"blockSize":0,"group":"supergroup","length":0,"modificationTime":1370174432465,"owner":"istvan","pathSuffix":"","permission":"755","replication":0,"type":"DIRECTORY"}}
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -ls /
Warning: $HADOOP_HOME is deprecated.

Found 1 items
drwxr-xr-x - istvan supergroup 0 2020-05-02 13:00 /tmp

2、创建一个文件夹/目录 Create a directory

  • 命令:
curl -i -X PUT "http://localhost:50070/webhdfs/v1/tmp/webhdfs?user.name=istvan&op=MKDIRS"

#或者(去掉引号也可以)
curl -i -X PUT http://localhost:50070/webhdfs/v1/tmp/webhdfs?user.name=istvan&op=MKDIRS
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp/webhdfs

在HDFS中实际需要创建的绝对路径

/webhdfs

在HDFS中实际需要创建的文件夹名称

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 200 OK
Content-Type: application/json
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370210530831&s=YGwbkw0xRVpEAgbZpX7wlo56RMI=";Path=/
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -ls /tmp
Warning: $HADOOP_HOME is deprecated.

Found 2 items
drwxr-xr-x   - istvan supergroup          0 2020-05-02-02 12:17 /tmp/hadoop-istvan
drwxr-xr-x   - istvan supergroup          0 2020-05-02-02 13:02 /tmp/webhdfs

3、创建/上传一个文件 Create a file

创建文件分为两步进行,第一步运行之后,在命令行会返回 namenode 的信息。然后我们根据返回的信息,重定向并针对适当的 datanode 执行 WebHDFS API。注意:这儿的 datanodeIP 地址可能会发生改变

  • 命令:
  • Step 1:
curl -i -X PUT "http://localhost:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?user.name=istvan&op=CREATE"

#或者(去掉引号也可以)
curl -i -X PUT http://localhost:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?user.name=istvan&op=CREATE
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp/webhdfs/webhdfs-test.txt

在HDFS中上传之后的目录路径

/webhdfs-test.txt

本地的文件 webhdfs-test.txt 需要上传到 HDFS中,这个路径可以是相对路径。即就在执行命令的本级目录中的文件

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 307 TEMPORARY_REDIRECT
Content-Type: application/octet-stream
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370210936666&s=BLAIjTpNwurdsgvFxNL3Zf4bzpg=";Path=/
Location: http://istvan-pc:50075/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=CREATE&user.name=istvan&namenoderpcaddress=istvan-pc:8020&createparent=true&overwrite=false
Content-Length: 0
Server: Jetty(6.1.26)
  • Step 2:
  • 注意: 此时的 IP 地址应该是 step1 返回的 Location 中的 IP ,以及后面的参数,一定要一致
curl -i -T webhdfs-test.txt "http://istvan-pc:50075/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=CREATE&user.name=istvan&namenoderpcaddress=istvan-pc:8020&createparent=true&overwrite=false&overwrite=false"

#或者(去掉引号也可以)
curl -i -T webhdfs-test.txt http://istvan-pc:50075/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=CREATE&user.name=istvan&overwrite=false
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

istvan-pc

step1中Location返回的IP

/tmp/webhdfs/webhdfs-test.txt

在HDFS中上传之后的目录路径

/webhdfs-test.txt

本地的文件 webhdfs-test.txt 需要上传到 HDFS中,这个路径可以是相对路径。即就在执行命令的本级目录中的文件

&namenoderpcaddress=istvan-pc:8020&createparent=true&overwrite=false&overwrite=false

step1 返回的 Location 信息

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 100 Continue

HTTP/1.1 201 Created
Content-Type: application/octet-stream
Location: webhdfs://0.0.0.0:50070/tmp/webhdfs/webhdfs-test.txt
Content-Length: 0
Server: Jetty(6.1.26)
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -ls /tmp/webhdfs
Warning: $HADOOP_HOME is deprecated.

Found 1 items
-rw-r--r--   1 istvan supergroup         20 2020-05-02-02 13:09 /tmp/webhdfs/webhdfs-test.txt
  • 若在 step2 中没有按照 step1 返回的 Location 中信息输入,则会报错:
HTTP/1.1 100 Continue

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 162
Connection: close

{"RemoteException":{"exception":"IllegalArgumentException","javaClassName":"java.lang.IllegalArgumentException","message":"Failed to parse \"null\" to Boolean."}}

因为:WebHDFS 没有使用默认值,必须手动指定

4、查看一个文件内容(不下载) Open and read a file

  • 命令:
curl -i -L "http://localhost:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=OPEN&user.name=istvan"

#或者(去掉引号)
curl -i -L http://localhost:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=OPEN&user.name=istvan
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp/webhdfs/webhdfs-test.txt

在HDFS中需要查看的文件的绝对路径

/webhdfs-test.txt

在HDFS中需要查看的文件名

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 307 TEMPORARY_REDIRECT
Content-Type: application/octet-stream
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370211032526&s=suBorvpvTUs6z/sw5n5PiZWsUnU=";Path=/
Location: http://istvan-pc:50075/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=OPEN&user.name=istvan&offset=0
Content-Length: 0
Server: Jetty(6.1.26)

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 20
Server: Jetty(6.1.26)

Hadoop WebHDFS test
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -cat /tmp/webhdfs/webhdfs-test.txt
Warning: $HADOOP_HOME is deprecated.

Hadoop WebHDFS test

5、下载一个文件 Download a file

  • 命令:
curl -L -o download.txt "http://localhost:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=OPEN&user.name=istvan"

#或者(去掉引号)
curl -L -o download.txt http://localhost:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=OPEN&user.name=istvan
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

download.txt

下载到本地(当前目录下)的文件的名称。即将HDFS中的webhdfs-test.txt下载之后,改名为 download.txt

/tmp/webhdfs/webhdfs-test.txt

在HDFS中需要查看的文件的绝对路径

/webhdfs-test.txt

在HDFS中需要查看的文件名

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
%Total   %Received   % Xferd   Average Speed     Time     Time    Time Current
                                 Dload  Upload     Total    Spent   Left Speed
  0  30    0     30    0     0    1270       0 --:--:-- --:--:-- --:--:-- 1270
  • 在命令行从看看本地效果:
ll

drwxr-xr-x   - istvan supergroup          0 2020-05-02 13:09 download.txt

6、修改文件(夹)名字 Rename a directory or a file

  • 命令:
#必须加引号
curl -i -X PUT "http://localhost:50070/webhdfs/v1/tmp/webhdfs?op=RENAME&user.name=istvan&destination=/tmp/webhdfs-new"
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp/webhdfs

在HDFS中需要修改的文件(夹)的绝对路径

/webhdfs

在HDFS中需要修改的文件(夹)名称

/tmp/webhdfs-new

在HDFS中修改后的文件(夹)的绝对路径

/webhdfs-new

在HDFS中修改后的文件(夹)名称

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 200 OK
Content-Type: application/json
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370211103159&s=Gq/EBWZTBaoMk0tkGoodV+gU6jc=";Path=/
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -ls /tmp
Warning: $HADOOP_HOME is deprecated.

Found 2 items
drwxr-xr-x   - istvan supergroup          0 2020-05-02 12:17 /tmp/hadoop-istvan
drwxr-xr-x   - istvan supergroup          0 2020-05-02 13:09 /tmp/webhdfs-new

7、删除文件(夹) Delete a directory or a file

  • 如果目录不存在,则此情况将导致异常,因为无法删除不存在的目录。
  • 如果目录不为空,则此情况将也会导致异常,因为无法删除非空目录。
  • 命令:
curl -i -X DELETE "http://localhost:50070/webhdfs/v1/tmp/webhdfs-new/webhdfs-test.txt?op=DELETE&user.name=istvan"

#或者(去掉引号)
curl -i -X DELETE http://localhost:50070/webhdfs/v1/tmp/webhdfs-new/webhdfs-test.txt?op=DELETE&user.name=istvan
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp/webhdfs-new/webhdfs-test.txt

在HDFS中需要删除的文件(夹)的绝对路径

/webhdfs-test.txt

在HDFS中需要删除的文件(夹)名称

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 200 OK
Content-Type: application/json
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370211375617&s=cG6727hbqGkrk/GO4yNRiZw4QxQ=";Path=/
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
  • 若文件夹内不为空(还有其他文件),则会提示以下信息:
HTTP/1.1 403 Forbidden
Content-Type: application/json
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370211266383&s=QFIJMWsy61vygFExl91Sgg5ME/Q=";Path=/
Transfer-Encoding: chunked
Server: Jetty(6.1.26)

{"RemoteException":{"exception":"IOException","javaClassName":"java.io.IOException","message":"/tmp/webhdfs-new is non empty"}}
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -ls /tmp

Found 1 items
drwxr-xr-x   - istvan supergroup          0 2020-05-02 12:17  /tmp/webhdfs-new

8、查看一个文件夹内容 List a directory

  • 如果目录不存在,则此情况将导致异常,因为无法展示不存在的目录内容。
  • 命令:
curl -i "http://localhost:50070/webhdfs/v1/tmp/webhdfs-new?op=LISTSTATUS"

#或者(去掉引号)
curl -i http://localhost:50070/webhdfs/v1/tmp/webhdfs-new?op=LISTSTATUS&user.name=istvan
  • 参数说明:

命令中的示例字段

实际操作时的字段说明

localhost

HDFS的master的IP

/tmp/webhdfs-new

在HDFS中需要查看的文件夹的绝对路径

/webhdfs-test.txt

在HDFS中需要查看的文件夹名称

user.name=istvan&

可以去掉,istvan也可以随意输入字符串

  • 提示信息:
HTTP/1.1 200 OK
Content-Type: application/json
Expires: Thu, 01-Jan-1970 00:00:00 GMT
Set-Cookie: hadoop.auth="u=istvan&p=istvan&t=simple&e=1370211375617&s=cG6727hbqGkrk/GO4yNRiZw4QxQ=";Path=/
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
  • 若文件夹内不为空(还有其他文件),则会提示以下信息:
HTTP/1.1 200 OK
Date: Wed, 20 Apr 2022 11:07:32 GMT
Cache-Control: no-cache
Expires: Wed, 20 Apr 2022 11:07:32 GMT
Date: Wed, 20 Apr 2022 11:07:32 GMT
Pragma: no-cache
X-FRAME-OPTIONS: SAMEORIGIN
Content-Type: application/json
Transfer-Encoding: chunked

{"FileStatuses":{"FileStatus":[
{"accessTime":0,"blockSize":0,"childrenNum":0,"fileId":48219,"group":"hdfs","length":0,"modificationTime":1648803218063,"owner":"admin","pathSuffix":"admin","permission":"755","replication":0,"storagePolicy":0,"type":"DIRECTORY"},
{"accessTime":0,"blockSize":0,"childrenNum":1,"fileId":17271,"group":"hdfs","length":0,"modificationTime":1645586084640,"owner":"hdfs","pathSuffix":"warehouse","permission":"755","replication":0,"storagePolicy":0,"type":"DIRECTORY"}
]}}
  • 在命令行使用 HDFS 的命令查看效果:
bin/hadoop fs -ls /tmp/webhdfs-new

Found 2 items
drwxr-xr-x   - admin  hdfs            0 2022-04-01 16:53 /admin
drwxr-xr-x   - hdfs   hdfs            0 2022-02-23 11:14 /warehouse

美中不足的是,官方没有提供递归查看目录的 API ,仔细查看 LISTSTATUS 返回的结果,就会发现,有一个字段是 childrenNum ,那么它的意思就是,在该 warehouse 目录下,有一个子目录( childrenNum 就是子目录的标识)。我们可以通过这个来判断,该目录下是否还有子目录。

注意:
1、以上命令既可以在 Linux 的命令行执行,也可以在 Windows 的 cmd 中执行。本地都是使用的相对路径,远程使用的是绝对路径。其中 user.name 均可以省略。
2、50070 端口 可以换作 14000,但是必须后面的链接必须加引号