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

1,842 阅读7分钟

在这里插入图片描述

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

前言

目前博客Hadoop文章大都停留在Hadoop2.x阶段,本系列将依据黑马程序员大数据Hadoop3.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,比如:example.com/resources 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML等 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。 资源 GET PUT POST DELETE 一组资源的URI,比如 example.com/resources 列出URI,以及该资源组中每个资源的详细信息。 使用给定的一组资源替换当前整组资源。 在本组资源中创建/追加一个新的资源。该操作往往返回新资源的URL。 删除整组资源。 单个资源的URI,比如example.com/resources/1… 获取指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如: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://:<HTTP_PORT>/

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

hdfs://:<RPC_PORT>/

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

http://:<HTTP_PORT>/webhdfs/v1/?op=...

安装Postman进行测试: 请求URL:node1.itcast.cn:9870/webhdfs/v1/… 该操作表示要查看根目录下的所有文件以及目录,相当于 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://:/webhdfs/v1/?op=CREATE [&overwrite=<true |false>][&blocksize=][&replication=] [&permission=][&buffersize=][&noredirect=<true|false>]"

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

HTTP/1.1 307 TEMPORARY_REDIRECT Location: http://:/webhdfs/v1/?op=CREATE... Content-Length: 0

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

HTTP/1.1 200 OK Content-Type: application/json {"Location":"http://:/webhdfs/v1/?op=CREATE..."}

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

node1.itcast.cn:9870/webhdfs/v1/…

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

{ "Location": "node1.itcast.cn:9864/webhdfs/v1/…" }

🚲 写入数据

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

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

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

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

后记

📢博客主页:manor.blog.csdn.net

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

📢本文由 manor 原创,首发于 CSDN博客🙉

📢Hadoop系列文章会每天更新!✨