一、HttpFS的简介
在项目中使用到 HDFS
作为存储,为了在不同的环境下都可以使用 HDFS
上的数据,我们使用采用了 HttpFS
服务,这样不需要部署 Hadoop
的环境,就可以访问到了,无论是 Windows
还是 Linux
。为什么不用 WebHDFS
呢?因为这个我们的集群 NameNode
是 HA
的,所以在访问文件前,需要确认 Active
的 NameNode
,而且比较不爽的事,如果客户端的机器 /etc/hosts
中需要配置所有的 Datanodes
机器信息。
后来找到的解决方案是使用 HttpFS
,它本质上是一个代理,是 java jetty web
程序,直接运行在可以在 Hadoop
集群上,可以感知 NameNode HA
的配置,本质上是对 WebHDFS
进行了一次封装,但使用它的时候不用担心本机是否配置好所有的 DataNode IP
主机名映射。
二、HttpFS的安装
- 如果使用
HDP
之类的大数据平台,有现成的rpm
包,直接使用下面得命令安装即可
yum install -y hadoop-httpfs
- 若是使用
CDH
,它默认就已经包含了HttpFS
服务,直接可以使用。
配置:主要配置一下httpfs启动用户的代理
<property>
<name>hadoop.proxyuser.#HTTPFSUSER#.hosts</name>
<value>httpfs-host.foo.com</value>
</property>
<property>
<name>hadoop.proxyuser.#HTTPFSUSER#.groups</name>
<value>*</value>
</property>
替换 #HTTPFSUSER#
为启动 HttpFS 服务的用户名即可(我的集群是使用 root
启动的 Hadoop
集群,这儿就换成 root
)。
注意:core-site.xml里面的添加的配置必须在namenode的节点进行配置,在datanode配置是不起作用的
HDP安装HttpFS服务踩坑指南
三、启动注意事项
第一步:必须要重新启动 Hadoop
集群
start-dfs.sh
第二步:httpfs
启动命令(CDH
版本的在 /hadoop/sbin
目录,HDP
版本的在 /hadoop-httpfs/sbin
目录):
sbin/httpfs.sh start
四、常用的命令
1、查看目录信息(查看/tmp目录)
curl -i "http://192.168.10.20:14000/webhdfs/v1/tmp?op=GETFILESTATUS&user.name=root"
返回结果:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1604056301367&s=vUJ/wDXktvXbrOeC9FxPFt1ea8c="; Path=/; HttpOnly
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 30 Oct 2020 01:11:41 GMT
{
"FileStatus":{
"pathSuffix":"",
"type":"DIRECTORY",
"length":0,
"owner":"root",
"group":"supergroup",
"permission":"770",
"accessTime":0,
"modificationTime":1602967570741,
"blockSize":0,
"replication":0
}
}
2、查看目录下的文件信息,不会递归(查看/tmp目录下的文件,不会列出子目录所包含的)
curl -i "http://192.168.10.20:14000/webhdfs/v1/tmp?op=LISTSTATUS&user.name=root"
返回结果:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1604057646044&s=ZLo8GPlaTuSc9diZyhmUcrUUDEU="; Path=/; HttpOnly
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 30 Oct 2020 01:34:06 GMT
{
"FileStatuses":{
"FileStatus":[
{
"pathSuffix":"hadoop-yarn",
"type":"DIRECTORY",
"length":0,
"owner":"root",
"group":"supergroup",
"permission":"770",
"accessTime":0,
"modificationTime":1568803432349,
"blockSize":0,
"replication":0
},
{
"pathSuffix":"hive",
"type":"DIRECTORY",
"length":0,
"owner":"root",
"group":"supergroup",
"permission":"733",
"accessTime":0,
"modificationTime":1602965215913,
"blockSize":0,
"replication":0
},
{
"pathSuffix":"jars",
"type":"DIRECTORY",
"length":0,
"owner":"root",
"group":"supergroup",
"permission":"755",
"accessTime":0,
"modificationTime":1569322824112,
"blockSize":0,
"replication":0
},
{
"pathSuffix":"student.txt",
"type":"FILE",
"length":525,
"owner":"root",
"group":"supergroup",
"permission":"644",
"accessTime":1604019748697,
"modificationTime":1602967570735,
"blockSize":134217728,
"replication":1
}
]
}
}
3、新建目录(在/user目录下,新建/abc目录)
curl -i -X PUT "http://192.168.10.20:14000/webhdfs/v1/user/abc?op=MKDIRS&user.name=root"
或者
curl -L -X PUT "http://192.168.10.20:14000/webhdfs/v1/user/abc?op=MKDIRS&user.name=root"
返回结果:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1604055928849&s=ZH5KpFfxyqKFyCW3XyElZN+rIMM="; Path=/; HttpOnly
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 30 Oct 2020 01:05:29 GMT
{"boolean":true}
4、修改文件/文件夹名(在/user目录下,修改/abc目录为/abcdef)
curl -i -X PUT "http://192.168.10.20:14000/webhdfs/v1/user/abc?op=RENAME&user.name=root&destination=/user/abcdef"
返回结果:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1604059219171&s=Nv2Dr0pz7JTi35NqDc/yz86adhg="; Path=/; HttpOnly
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 30 Oct 2020 02:00:19 GMT
{"boolean":true}
5、查看文件内容(查看/tmp目录下的student.txt文件)
curl -i "http://192.168.10.20:14000/webhdfs/v1/tmp/student.txt?op=open&user.name=root"
或者
curl -i -L PUT "http://192.168.10.20:14000/webhdfs/v1/tmp/student.txt?op=open&user.name=root"
返回结果:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1604056735562&s=g+jF+wttTwv8nmDggJKxOboZvW8="; Path=/; HttpOnly
Content-Type: application/octet-stream
Content-Length: 525
Date: Fri, 30 Oct 2020 01:18:55 GMT
95002,刘晨,女,19,IS
95017,王风娟,女,18,IS
95018,王一,女,19,IS
95013,冯伟,男,21,CS
注意:这条指令中的的路径如果包含中文路径,执行curl命令的时候会报400错误。下载文件也会下载失败
6、下载HDFS文件到本地(下载/tmp目录下的student.txt文件,下载后文件名为download.txt)
curl -L -o download.txt "http://192.168.10.20:14000/webhdfs/v1/tmp/student.txt?op=OPEN&user.name=root"
返回结果:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 525 100 525 0 0 14247 0 --:--:-- --:--:-- --:--:-- 14583
说明:如果本地有该文件(download.txt
)将会覆盖已存在的文件
7、上传本地文件(查看/tmp目录下的student.txt文件)(可以覆盖文件)
curl -X PUT -T /root/anaconda-ks.cfg "http://192.168.10.20:14000/webhdfs/v1/tmp/test.txt?op=CREATE&data=true&user.name=root" -H Content-Type:application/octet-stream
返回结果:
无任何返回结果
注意:这条指令默认开启了写入覆盖模式,当该目录下已经存在此文件,则会覆盖
若要防止文件覆盖,则需要添加参数 overwrite=false
curl -X PUT -T /root/anaconda-ks.cfg "http://192.168.10.20:14000/webhdfs/v1/tmp/test.txt?op=CREATE&data=true&overwrite=false&user.name=root" -H Content-Type:application/octet-stream
再次上传同名的文件,报如下的错误
{
"RemoteException": {
"message": "\/tmp\/test.txt for client 192.168.10.20 already exists",
"exception": "FileAlreadyExistsException",
"javaClassName": "org.apache.hadoop.fs.FileAlreadyExistsException"
}
}
8、删除文件/文件夹(删除/tmp目录下的abc文件夹)
curl -i -X DELETE "http://192.168.10.20:14000/webhdfs/v1/user/abc?op=DELETE&user.name=root"
或者
curl -L -X DELETE "http://192.168.10.20:14000/webhdfs/v1/user/abc?op=DELETE&user.name=root"
返回结果:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: hadoop.auth="u=root&p=root&t=simple-dt&e=1604058717208&s=1YJLjUGRD28PVkJku2gYYnZqHtk="; Path=/; HttpOnly
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 30 Oct 2020 01:51:57 GMT
{"boolean":true}
注意:这条指令删除文件,不会走垃圾回收站
9、内容摘要,统计该目录下所包含的目录以及文件的数量,会递归(查看/tmp目录)
curl -i "http://192.168.10.20:14000/webhdfs/v1/tmp?op=GETCONTENTSUMMARY&user.name=root"
返回结果:
{
"ContentSummary": {
"directoryCount": 38,
"fileCount": 7039,
"length": 600788558,
"quota": -1,
"spaceConsumed": 600797216,
"spaceQuota": -1
}
}
10、重命名(重命名/tmp目录)
curl -L -X PUT "http://192.168.10.20:14000/webhdfs/v1/tmp/test.txt?op=RENAME&user.name=root&destination=/tmp/new_test.txt"
或者
curl -i -X PUT "http://192.168.10.20:14000/webhdfs/v1/tmp/test.txt?op=RENAME&user.name=root&destination=/tmp/new_test.txt"
返回结果:
{"boolean":true}
11、修改文件权限(修改/tmp目录)
curl -X PUT "http://192.168.10.20:14000/webhdfs/v1/tmp/new_test.txt?op=SETPERMISSION&user.name=root&permission=641"
无任何返回结果
五、WebHDFS的使用详解
WebHDFS的使用详解