前言
目前博客Hadoop文章大都停留在Hadoop2.x阶段,本系列将依据黑马程序员大数据Hadoop3.x全套教程,对2.x没有的新特性进行补充更新,一键三连加关注,下次不迷路!
历史文章
[hadoop3.x系列]HDFS REST HTTP API的使用(一)WebHDFS
[hadoop3.x系列]HDFS REST HTTP API的使用(二)HttpFS
[hadoop3.x系列]Hadoop常用文件存储格式及BigData File Viewer工具的使用(三)
✨[hadoop3.x]新一代的存储格式Apache Arrow(四)
🍑需求:
如果我们想要在没有安装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://:/
上面的WebHDFS URI对应于下面的HDFS URI。
hdfs://:/
在RESTAPI中,在路径中插入前缀“/webhdfs/v1”,并在末尾追加一个查询。因此,对应的HTTPURL具有以下格式。
http://:/webhdfs/v1/ ?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://:/webhdfs/v1/ ?op=CREATE
[&overwrite=][&blocksize=][&replication=]
[&permission=][&buffersize=][&noredirect=]”
通常,请求被重定向到要写入文件数据的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为:
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 “http://:/webhdfs/v1/ ?op=CREATE…”
客户端接收到一个201创建的响应,该响应的内容长度为零,位置头中文件的WebHDFS URI为:
HTTP/1.1 201 Created
Location: webhdfs://:/
Content-Length: 0
示例:
使用postman基于之前返回的http响应,上传文件。
我们打开WebUI,发现文件已经上传成功。
更多操作请参考: