Hadoop提供了一个Java native API来支持对文件系统进行创建,重命名,删除文件或者目录,打开读取或者写文件,设置文件权限等操作。这对于运行在hadoop集群中的应用程序来说是挺棒的,但是,也有许多外部的应用程序需要操作HDFS的情况,怎么办?如果解决这种问题呢?Hortonworks 开发了一些额外的API来支持这些基于标准REST功能的需求。
WebHDFS观念是基于HTTP操作,比如GET、PUT、POST和DELETE。像OPEN、GETFILESTATUS、LISTSTATUS的操作是使用HTTP GET,其它的像CREAT、MKDIRS、RENAME、SETPERMISSION是依赖于HTTP PUT类型。APPEND操作时基于HTTP POST类型,然而,DELETE是使用HTTP DELETE。
认证方式可以使用基于user.name参数或者如果安全机制开启了就依赖于Kerberos。标准的URL格式如下所示:
http://host:port/webhdfs/v1/?op=operation&user.name=username
默认的启动对口是14000,你可以在httpfs-env.sh 中配置端口的值。所有与httpfs有关的环境参数变量,你可以再httpfs-env.sh中进行个性化的配置。
编辑core-site.xml文件,添加如下内容:
…
<property>
<name>hadoop.proxyuser.#HTTPFSUSER#.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.#HTTPFSUSER#.groups</name>
<value>*</value>
</property>
….
值得注意的是,#HTTPFSUSER#指的是用户名,即linux启动httpfs的用户。
编辑hdfs-site.xml文件,添加下列属性配置。
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
另外,想知道更多的有关HDFS端口信息,请参考Cloudera blog.
启动httpfs,执行如下命令:
httpfs.sh start
一切配置好了之后,测试一下是否配置成功是非常有必要的。有这样一种情况,我们需要知道hdfs 目录下tmp的文件状态。按照这样的需求,我们可以编写这样的命令:
命令行下
curl –i http://hadoop-master:14000/webhdfs/v1/tmp?user.name=app&op=GETFILESTATUS HTTP/1.1 200 OK Server:Apache-Coyote/1.1 Set-Cookie:hadoop.auth="u=app&p=app&t=simple&e=1393293979907&s=9YBXB7GM3oiIOYgflAjlq3GIpxc=";Version=1; Path=/ Content-Type:application/json Transfer-Encoding:chunked Date: Mon, 24Feb 2014 16:06:20 GMT {"FileStatus":{"pathSuffix":"","type":"DIRECTORY","length":0,"owner":"app","group":"supergroup","permission":"720","accessTime":0,"modificationTime":1391352186043,"blockSize":0,"replication":0}}
浏览器中:
http://hadoop-master:14000/webhdfs/v1/tmp?user.name=app&op=GETFILESTATUS
返回信息:
{"FileStatus":{"pathSuffix":"","type":"DIRECTORY","length":0,"owner":"app","group":"supergroup","permission":"720","accessTime":0,"modificationTime":1391352186043,"blockSize":0,"replication":0}}
后续,请等待…