✨[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS

举报
Maynor学长 发表于 2022/02/25 17:00:12 2022/02/25
【摘要】 目前博客Hadoop文章大都停留在Hadoop2.x阶段,本系列将对2.x没有的新特性进行补充更新,一键三连加关注,下次不迷路!

在这里插入图片描述

前言

目前博客Hadoop文章大都停留在Hadoop2.x阶段,本系列将对2.x没有的新特性进行补充更新,一键三连加关注,下次不迷路!

🍑需求:

如果我们想要在没有安装HDFS客户端的机器上操作该如何呢?譬如以下场景:
在这里插入图片描述

接下来,我们将学习几种基于HTTP协议的客户端,HTTP是跨平台的,它不要求客户端上必须安装Hadoop,就可以直接操作HDFS。

🍑WebHDFS概述及操作

🐒 简介

WebHDFS其实是HDFS提供的HTTP RESTFul API接口,并且它是独立于Hadoop的版本的,它支持HDFS的完整FileSystem / FileContext接口。它可以让客户端发送http请求的方式来操作HDFS,而无需安装Hadoop。

在我们经常使用的HDFS Web UI,它就是基于webhdfs来操作HDFS的。
在这里插入图片描述

🐒关于RESTful

🚲REST

在这里插入图片描述

REST(表现层状态转换,英语:Representational State Transfer)是Roy Thomas Fielding博士于2000年在博士论文中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。
REST是基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。符合或兼容于这种架构风格(简称为 REST 或 RESTful)的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化。
因此REST提供了在互联网络的计算系统之间,彼此资源可交互使用的协作性质(interoperability)。相对于其它种类的网络服务,例如SOAP服务,则是以本身所定义的操作集,来访问网络上的资源。
目前在三种主流的Web服务实现方案中,因为REST模式与复杂的SOAP和XML-RPC相比更加简洁,越来越多的Web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务运行图书查询;雅虎提供的Web服务也是REST风格的。
需要注意的是,REST是设计风格而不是标准。REST通常基于HTTP、URI、XML以及HTML这些现有的广泛流行的协议和标准。
资源是由URI来指定。
对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
通过操作资源的表现形式来操作资源。
资源的表现形式则是XML或者HTML,取决于读者是机器还是人、是消费Web服务的客户软件还是Web浏览器。当然也可以是任何其他的格式,例如JSON。

🚲 RESTFul API

在这里插入图片描述

符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:
直观简短的资源地址:URI,比如:http://example.com/resources
传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML等
对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。
资源 GET PUT POST DELETE
一组资源的URI,比如
https://example.com/resources 列出URI,以及该资源组中每个资源的详细信息。 使用给定的一组资源替换当前整组资源。 在本组资源中创建/追加一个新的资源。该操作往往返回新资源的URL。 删除整组资源。
单个资源的URI,比如https://example.com/resources/142 获取指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等) 替换/创建指定的资源。并将其追加到相应的资源组中。 把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 删除指定的元素。
PUT和DELETE方法是幂等方法
GET方法是安全方法(不会对服务器端有修改,因此当然也是幂等的)
在这里插入图片描述

🚲 PUT请求类型和POST请求类型的区别

PUT和POST均可用于创建或者更新某个资源(例如:添加一个用户、添加一个文件),用哪种请求方式取决我们自己。
我们主要使用是否需要有幂等性来判断到底用PUT、还是POST。PUT是幂等的,也就是将一个对象进行两次PUT操作,是不会起作用的。而如果使用POST,会同时收到两个请求。

🐒 HDFS HTTP RESTFUL API

HDFS HTTP RESTFUL API它支持以下操作:

🚲 HTTP GET

OPEN (等同于FileSystem.open)
GETFILESTATUS (等同于FileSystem.getFileStatus)
LISTSTATUS (等同于FileSystem.listStatus)
LISTSTATUS_BATCH (等同于FileSystem.listStatusIterator)
GETCONTENTSUMMARY (等同于FileSystem.getContentSummary)
GETQUOTAUSAGE (等同于FileSystem.getQuotaUsage)
GETFILECHECKSUM (等同于FileSystem.getFileChecksum)
GETHOMEDIRECTORY (等同于FileSystem.getHomeDirectory)
GETDELEGATIONTOKEN (等同于FileSystem.getDelegationToken)
GETTRASHROOT (等同于FileSystem.getTrashRoot)
GETXATTRS (等同于FileSystem.getXAttr)
GETXATTRS (等同于FileSystem.getXAttrs)
GETXATTRS (等同于FileSystem.getXAttrs)
LISTXATTRS (等同于FileSystem.listXAttrs)
CHECKACCESS (等同于FileSystem.access)
GETALLSTORAGEPOLICY (等同于FileSystem.getAllStoragePolicies)
GETSTORAGEPOLICY (等同于FileSystem.getStoragePolicy)
GETSNAPSHOTDIFF
GETSNAPSHOTTABLEDIRECTORYLIST
GETECPOLICY (等同于HDFSErasureCoding.getErasureCodingPolicy)
GETFILEBLOCKLOCATIONS (等同于FileSystem.getFileBlockLocations)

🚲 HTTP PUT

CREATE (等同于FileSystem.create)
MKDIRS (等同于FileSystem.mkdirs)
CREATESYMLINK (等同于FileContext.createSymlink)
RENAME (等同于FileSystem.rename)
SETREPLICATION (等同于FileSystem.setReplication)
SETOWNER (等同于FileSystem.setOwner)
SETPERMISSION (等同于FileSystem.setPermission)
SETTIMES (等同于FileSystem.setTimes)
RENEWDELEGATIONTOKEN (等同于DelegationTokenAuthenticator.renewDelegationToken)
CANCELDELEGATIONTOKEN (等同于DelegationTokenAuthenticator.cancelDelegationToken)
CREATESNAPSHOT (等同于FileSystem.createSnapshot)
RENAMESNAPSHOT (等同于FileSystem.renameSnapshot)
SETXATTR (等同于FileSystem.setXAttr)
REMOVEXATTR (等同于FileSystem.removeXAttr)
SETSTORAGEPOLICY (等同于FileSystem.setStoragePolicy)
ENABLEECPOLICY (等同于HDFSErasureCoding.enablePolicy)
DISABLEECPOLICY (等同于HDFSErasureCoding.disablePolicy)
SETECPOLICY (等同于HDFSErasureCoding.setErasureCodingPolicy)

🚲 HTTP POST

APPEND (等同于FileSystem.append)
CONCAT (等同于FileSystem.concat)
TRUNCATE (等同于FileSystem.truncate)
UNSETSTORAGEPOLICY (等同于FileSystem.unsetStoragePolicy)
UNSETECPOLICY (等同于HDFSErasureCoding.unsetErasureCodingPolicy)
1.1.3.4 HTTP DELETE
DELETE (等同于FileSystem.delete)
DELETESNAPSHOT (等同于FileSystem.deleteSnapshot)

🐒文件系统URL和HTTP URL

WebHDFS的文件系统schema是webhdfs://。WebHDFS文件系统URI具有以下格式。

webhdfs://<HOST>:<HTTP_PORT>/<PATH>

上面的WebHDFS URI对应于下面的HDFS URI。

hdfs://<HOST>:<RPC_PORT>/<PATH>

在RESTAPI中,在路径中插入前缀“/webhdfs/v1”,并在末尾追加一个查询。因此,对应的HTTPURL具有以下格式。

http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=…

安装Postman进行测试:
请求URL:http://node1.itcast.cn:9870/webhdfs/v1/?op=LISTSTATUS
该操作表示要查看根目录下的所有文件以及目录,相当于 hdfs dfs -ls /
在这里插入图片描述

我们可以在Postman中看到,HDFS给我们返回了以下信息:

{
    "FileStatuses": {
        "FileStatus": [
            {
                "accessTime": 0,
                "blockSize": 0,
                "childrenNum": 2,
                "fileId": 16698,
                "group": "supergroup",
                "length": 0,
                "modificationTime": 1601513468046,
                "owner": "root",
                "pathSuffix": "data",
                "permission": "755",
                "replication": 0,
                "storagePolicy": 0,
                "type": "DIRECTORY"
            },
            {
                "accessTime": 0,
                "blockSize": 0,
                "childrenNum": 2,
                "fileId": 16386,
                "group": "supergroup",
                "length": 0,
                "modificationTime": 1600886915849,
                "owner": "root",
                "pathSuffix": "mr-history",
                "permission": "770",
                "replication": 0,
                "storagePolicy": 0,
                "type": "DIRECTORY"
            },
            ...
        ]
    }
}

🐒 使用WebHDFS创建并写入到一个文件

🚲 创建文件

提交HTTP PUT请求,而不会自动跟随重定向,也不会发送文件数据。

curl -i -X PUT “http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=CREATE
[&overwrite=<true |false>][&blocksize=<LONG>][&replication=<SHORT>]
[&permission=<OCTAL>][&buffersize=<INT>][&noredirect=<true|false>]”

通常,请求被重定向到要写入文件数据的DataNode。

HTTP/1.1 307 TEMPORARY_REDIRECT
Location: http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>?op=CREATE…
Content-Length: 0

如果不希望自动重定向,则可以设置noredirected标志。

HTTP/1.1 200 OK
Content-Type: application/json
{“Location”:“http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>?op=CREATE…”}

示例:
在/data/hdfs-test目录中创建一个名字为webhdfs_api.txt文件,并写入内容。
使用postman创建一个请求,设置请求方式为PUT,请求url为:

http://node1.itcast.cn:9870/webhdfs/v1/data/hdfs-test/webhdfs_api.txt?op=CREATE&overwrite=true&replication=2&noredirect=true

HTTP会响应一个用于上传数据的URL链接:

{
“Location”: “http://node1.itcast.cn:9864/webhdfs/v1/data/hdfs-test/webhdfs_api.txt?op=CREATE&namenoderpcaddress=node1.itcast.cn:9820&createflag=&createparent=true&overwrite=true&replication=2
}

🚲 写入数据

使用Location标头中的URL提交另一个HTTP PUT请求(如果指定了noredirect,则返回返回的响应),并写入要写入的文件数据。
curl -i -X PUT -T <LOCAL_FILE> “http://<DATANODE>:<PORT>/webhdfs/v1/<PATH>?op=CREATE…”
客户端接收到一个201创建的响应,该响应的内容长度为零,位置头中文件的WebHDFS URI为:
HTTP/1.1 201 Created
Location: webhdfs://<HOST>:<PORT>/<PATH>
Content-Length: 0

示例:
使用postman基于之前返回的http响应,上传文件。
在这里插入图片描述

我们打开WebUI,发现文件已经上传成功。
在这里插入图片描述

更多操作请参考:
https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Cro
ss-Site_Request_Forgery_Prevention

后记

📢博客主页:https://manor.blog.csdn.net
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 manor 原创,首发于 CSDN博客🙉
📢Hadoop系列文章会每天更新!✨

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。