Hadoop WebHDFS设置和使用

WebHdfs

Web HDFS是HortonWorks开发的,然后捐给了Apache,是HDFS的REST API。WebHDFS是一个内置HDFS的REST API。 它不需要任何进一步的安装,但提供的文件访问支持较简单,如果集群未做HA,那么是优先选择,其中默认50070是http服务的端口。

安装

WebHDFS服务内置在HDFS中,不需额外安装、启动。

配置

需要在hdfs-site.xml打开WebHDFS开关,此开关默认打开。

1
2
3
4
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>

使用

连接NameNode的50070端口进行文件操作。
下面介绍一下常用操作
首先设置url和header,需要使用到Python的request库

1
2
host = 'http://host:50070/webhdfs/v1'
headers = {'Content-Type': 'application/json'}

在REST API中,前缀/webhdfs/v1插入到路径中(官方规定),并在结尾处追加查询。因此,相应的HTTP URL具有以下格式
http://:/webhdfs/v1/?op=…

查看文件状态

1
2
3
def status_file():
r = requests.get(host + '/mycode?op=GETFILESTATUS', headers=headers)
print(r.json())

查看文件夹描述

1
2
3
def summary_directory():
r = requests.get(host + '/result/iris.text?op=GETCONTENTSUMMARY', headers=headers)
print(r.json())

列出文件夹下的文件

1
2
3
def list_file():
r = requests.get(host + '/result/iris.text?op=LISTSTATUS', headers=headers)
print(r.json())

读取hdfs上的文件

1
2
3
4
5
6
7
8
9
10
def open_read_file(path):
r = requests.get(host + '/'+path+'/?op=OPEN', headers=headers)
print(r)
f = open("part_file", "wb")
s = ""
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
s += str(chunk)
print(s)

读取文件的操作WebHdfs是将文件下载下来之后在本地进行查看的

创建文件夹

1
2
3
def make_directory():
r = requests.put(host + '/test?op=MKDIRS&user.name=spark', headers=headers)
print(r.json())

该方法为put方法,注意设置user.name参数,不然会报权限不够的错误

删除文件夹或文件

1
2
3
def delete_file_directory(path):
r = requests.delete(host + '/'+path+'?op=DELETE&user.name=spark', headers=headers)
print(r.json())

此方法为delete方法

创建并写入文件

1
2
3
4
5
6
def create_write_file():
files = {'file': open('test.txt', 'rb')}
r = requests.put(host + '/filetest3?op=CREATE&user.name=spark', headers=headers, files=files)
print(r.headers['location'])
print(r.text)
print(r.content)

该方法为put方法,注意设置user.name参数,不然会报权限不够的错误,r.headers[‘location’]返回文件存储在hdfs上的位置

更多详细操作参见官方文档

还有另一种方法通过web api访问hdfs,具体怎样使用我还没试,在这里也记录一下,以便日后测试使用

HttpFS(Hadoop HDFS over HTTP)

HttpFS是Cloudera开发的,也捐给了Apache。HttpFS是HDFS一个独立的服务,若使用需要手动安装(CDH中安装HDFS时将HttpFS勾选上即可)。提供的文件访问支持较好,如果集群做了HA,那么HttpFS Server将不是它的瓶颈,性能更好!是http服务的优先选择。默认提供服务的端口是14000.

安装

Hadoop自带,不需要额外安装。默认服务未启动,需要手工启动。

配置

httpfs-site.xml
有配置文件httpfs-site.xml,此配置文件一般保存默认即可,无需修改。

hdfs-site.xml

需要增加如下配置,其他两个参数名称中的root代表的是启动hdfs服务的OS用户,应以实际的用户名称代替。

1
2
3
4
5
6
7
8
<property>  
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>

启动

1
2
sbin/httpfs.sh start
sbin/httpfs.sh stop

启动后,默认监听14000端口

使用

详细使用参考官方文档

两者比较

然两者都是HDFS的REST API,但稍有差异,具体差异为当client请求某文件时,WebHDFS会将其重定向到该资源所在的datanode,而HttpFs相等于一个“网关”,所有的数据先传输到该httpfs server,再由该httpfs server传输到client。

选择

一般来说两个都可以使用,而且差别不大。但若集群配置了HA,那就最好使用HttpFS了,因为namenode的地址一直在变化,我们是不可能也随时修改脚本里的请求地址的,故在这种情况下直接写HttpFS Server的地址好了。

打赏

请我喝杯咖啡吧~

支付宝
微信