Hadoop提供了两种Web方式访问HDFS,分别是:WebHDFS和HttpFS。
WebHDFS
WebHDFS提供了访问HDFS的RESTful接口,是内置组件,并且默认开启,运行于NameNode和DataNode中,对HDFS文件的读写,将会重定向到文件所在的DataNode,并且会完全利用HDFS的带宽。;
WebHDFS访问时,首先访问NameNode获知文件所在的DataNode地址,然后重定向到目标DataNode获取文件内容;
WebHDFS默认端口是50070和50075;
WebHDFS使得集群外的客户端可以不安装Hadoop和Java环境就可以对HDFS进行访问,并且不限制编程语言;
默认的URL格式: webhdfs://<HOST>:<HTTP_PORT>/<PATH>
HTTP URL格式: http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=...
WebHDFS提供的操作列表功能清单:
HTTP GET
• OPEN (see FileSystem.open)
• GETFILESTATUS (see FileSystem.getFileStatus)
• LISTSTATUS (see FileSystem.listStatus)
• GETCONTENTSUMMARY (see FileSystem.getContentSummary)
• GETFILECHECKSUM (see FileSystem.getFileChecksum)
• GETHOMEDIRECTORY (see FileSystem.getHomeDirectory)
• GETDELEGATIONTOKEN (see FileSystem.getDelegationToken)
HTTP PUT
• CREATE (see FileSystem.create)
• MKDIRS (see FileSystem.mkdirs)
• RENAME (see FileSystem.rename)
• SETREPLICATION (see FileSystem.setReplication)
• SETOWNER (see FileSystem.setOwner)
• SETPERMISSION (see FileSystem.setPermission)
• SETTIMES (see FileSystem.setTimes)
• RENEWDELEGATIONTOKEN (see DistributedFileSystem.renewDelegationToken)
• CANCELDELEGATIONTOKEN (see DistributedFileSystem.cancelDelegationToken)
HTTP POST
• APPEND (see FileSystem.append)
实例1
如下:http://127.0.0.1:50070/webhdfs/v1/test?op=LISTSTATUS
类似:hadoop fs -ls /test
实例2
上传文件,需要两次请求,第一次请求会返回第二次请求的URL,通过第二次的URL上传文件。 这两次请求都是PUT请求。
1、http://127.0.0.1:50070/webhdfs/v1/test/test2.txt?op=CREATE&overwrite=true&replication=2&noredirect=true
返回信息:
{
"Location": "http://LAPTOP-CEJI62RD:9864/webhdfs/v1/test/test2.txt?op=CREATE&namenoderpcaddress=localhost:9000&createflag=&createparent=true&overwrite=true&replication=2"
}
如下图(postman请求)
2、http://LAPTOP-CEJI62RD:9864/webhdfs/v1/test/test2.txt?op=CREATE&namenoderpcaddress=localhost:9000&createflag=&createparent=true&overwrite=true&replication=2
第二次请求需要在请求的body中指定上传的文件,返回上传文件的数量,返回状态201表示上传成功, 如下图(postman请求)
HttpFS
HttpFS是独立于HDFS的一个服务(Java Web应用程序),通过内置的Jetty服务器对外提供服务。本质上是一个代理服务。客户端对HDFS文件的读写,将会通过HttpFS进行中转,然后由HttpFS去跟HDFS集群交互,它能限制带宽占用。HttpFS的使用需要手动配置安装,它的默认端口14000。
HttpFS 可用于访问防火墙后面的群集上的 HDFS 中的数据(HttpFS 服务器充当网关,并且是唯一允许通过防火墙进入群集的系统)。
HttpFS 具有内置安全功能,支持 Hadoop 伪身份验证和 HTTP SPNEGO Kerberos 和其他可插入身份验证机制。它还提供 Hadoop 代理用户支持。
HttpFS的配置
配置文件:hdfs-site.xml(或core-site.xml), 添加下面内容:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
注:两个参数名称中的root代表的是启动hdfs服务的OS用户,应以实际的用户名称代替。 表示root用户可以在任意host主机节点上代表任意group组的用户。
HttpFS的启动
hdfs --daemon start httpfs
进程名称为: HttpFSServerWebServer
HttpFS的默认服务
Name | Description |
/conf | Display configuration properties |
/jmx | Java JMX management interface |
/logLevel | Get or set log level per class |
/logs | Display log files |
/stacks | Display JVM stacks |
/static/index.html | The static home page |
如果要访问/conf, /jmx, /logLevel, /logs, 或 /stacks,需要在httpfs-site.xml中配置如下内容:
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
<description>Is service-level authorization enabled?</description>
</property>
<property>
<name>hadoop.security.instrumentation.requires.admin</name>
<value>true</value>
<description>
Indicates if administrator ACLs are required to access
instrumentation servlets (JMX, METRICS, CONF, STACKS).
</description>
</property>
<property>
<name>httpfs.http.administrators</name>
<value></value>
<description>ACL for the admins, this configuration is used to control
who can access the default servlets for HttpFS server. The value
should be a comma separated list of users and groups. The user list
comes first and is separated by a space followed by the group list,
e.g. "user1,user2 group1,group2". Both users and groups are optional,
so "user1", " group1", "", "user1 group1", "user1,user2 group1,group2"
are all valid (note the leading space in " group1"). '*' grants access
to all users and groups, e.g. '*', '* ' and ' *' are all valid.
</description>
</property>
实例(使用curl命令):
0、 http://httpfs-host:14000/static/index.html
浏览器打开HttpFS的服务首页
1、 $ curl 'http://httpfs-host:14000/webhdfs/v1/user/foo/README.txt?op=OPEN&user.name=foo'
返回HDFS中/user/foo/README.txt文件的内容。
2、 $ curl 'http://httpfs-host:14000/webhdfs/v1/user/foo?op=LISTSTATUS&user.name=foo'
returns the contents of the HDFS /user/foo directory in JSON format.
返回JSON格式化数据的HDFS中/user/foo目录下的内容。
3、 $ curl 'http://httpfs-host:14000/webhdfs/v1/user/foo?op=GETTRASHROOT&user.name=foo'
返回“/user/foo/.Trash”路径,如果/是加密区域,则返回“/.Trash/foo”路径。
4、 $ curl -X POST 'http://httpfs-host:14000/webhdfs/v1/user/foo/bar?op=MKDIRS&user.name=foo'
创建HDFS目录:/user/foo/bar。
注: HttpFS访问时可以指定用户身份,使用参数:user.name (避免HTTP ERROR 401错误)