分享

Hadoop web编程--REST API WebHDFS

问题导读

1.外部的应用程序需要操作HDFS的情况,该如何解决?
2.WebHDFS REST API可以完成什么事情?
3.Httpfs 配置启动,core-site.xml、hdfs-site.xml文件改如何配置?
4.REST API 如何启动httpfs?
5.通过什么命令可以查看hdfs文件的状态?
6.WebHDFS常用操作都包含什么?该如何实现?




1 介绍   
Hadoop提供了一个Java native API来支持对文件系统进行创建,重命名,删除文件或者目录,打开读取或者写文件,设置文件权限等操作。这对于运行在hadoop集群中的应用程序来说是挺棒的,但是,也有许多外部的应用程序需要操作HDFS的情况,怎么办?如果解决这种问题呢?Hortonworks 开发了一些额外的API来支持这些基于标准REST功能的需求。

2 WebHDFS REST API   

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中进行个性化的配置。

3 Httpfs 配置启动   

编辑core-site.xml文件,添加如下内容:
  1.   <property>
  2.     <name>hadoop.proxyuser.#HTTPFSUSER#.hosts</name>
  3.     <value>*</value>
  4.   </property>
  5.   <property>
  6.     <name>hadoop.proxyuser.#HTTPFSUSER#.groups</name>
  7.     <value>*</value>
  8.   </property>
  9. ….
复制代码




值得注意的是,#HTTPFSUSER#指的是用户名,即linux启动httpfs的用户。


编辑hdfs-site.xml文件,添加下列属性配置。
  1. <property>
  2.           <name>dfs.webhdfs.enabled</name>
  3.            <value>true</value>
  4. </property>
  5. <property>
  6. <name>dfs.permissions</name>
  7. <value>false</value>
  8. </property>
复制代码



    另外,想知道更多的有关HDFS端口信息,请参考Cloudera blog.
    启动httpfs,执行如下命令:

  1. httpfs.sh start  
复制代码

4 验证
一切配置好了之后,测试一下是否配置成功是非常有必要的。有这样一种情况,我们需要知道hdfs 目录下tmp的文件状态。按照这样的需求,我们可以编写这样的命令:
命令行下

  1. curl –i http://hadoop-master:14000/webhdfs/v1/tmp?user.name=app&op=GETFILESTATUS  
  2. HTTP/1.1 200 OK  
  3. Server:Apache-Coyote/1.1  
  4. Set-Cookie:hadoop.auth="u=app&p=app&t=simple&e=1393293979907&s=9YBXB7GM3oiIOYgflAjlq3GIpxc=";Version=1; Path=/  
  5. Content-Type:application/json  
  6. Transfer-Encoding:chunked  
  7. Date: Mon, 24Feb 2014 16:06:20 GMT  
  8.    
  9. {"FileStatus":{"pathSuffix":"","type":"DIRECTORY","length":0,"owner":"app","group":"supergroup","permission":"720","accessTime":0,"modificationTime":1391352186043,"blockSize":0,"replication":0}}  
复制代码

浏览器中:

  1. http://hadoop-master:14000/webhdfs/v1/tmp?user.name=app&op=GETFILESTATUS  
复制代码
返回信息:
  1. {"FileStatus":{"pathSuffix":"","type":"DIRECTORY","length":0,"owner":"app","group":"supergroup","permission":"720","accessTime":0,"modificationTime":1391352186043,"blockSize":0,"replication":0}}  
复制代码




5介绍几种常用的WebHDFS操作


5.1 创建
     创建一个目录/tmp/webhdfs。


  1. curl-i -X PUT"http://hadoop-master:14000/webhdfs/v1/tmp/webhdfs?user.name=app&op=MKDIRS"  
  2. HTTP/1.1 200 OK  
  3. Server: Apache-Coyote/1.1  
  4. Set-Cookie:hadoop.auth="u=app&p=app&t=simple&e=1393356198808&s=74NhnIdH7WceKqgTW7UJ1ia9h10=";Version=1; Path=/  
  5. Content-Type: application/json  
  6. Transfer-Encoding: chunked  
  7. Date: Tue, 25 Feb 2014 09:23:23 GMT
复制代码

达到相似的功能,Hadoop 命令:
  1. hdfs dfs -mkdir /tmp/webhdfs
复制代码


创建一个文件

创建一个文件需要两个步骤:第一步是在namenode运行命令,第二步根据第一步提供的location参数执行PUT操作。

  1. curl -i -X PUT"http://hadoop-master:50070/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?user.name=app&op=CREATE"  
  2. HTTP/1.1 307 TEMPORARY_REDIRECT  
  3. Cache-Control: no-cache  
  4. Expires: Thu, 01-Jan-1970 00:00:00 GMT  
  5. Date: Wed, 26 Feb 2014 14:35:29 GMT  
  6. Pragma: no-cache  
  7. Date: Wed, 26 Feb 2014 14:35:29 GMT  
  8. Pragma: no-cache  
  9. Set-Cookie:hadoop.auth="u=app&p=app&t=simple&e=1393461329238&s=as2cO3rRtvj8psr0jAhMk6YBHRY=";Path=/  
  10. Location:http://machine-2:50075/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=CREATE&user.name=app&namenoderpcaddress=hadoop-master:9000&overwrite=false  
  11. Content-Type: application/octet-stream  
  12. Content-Length: 0  
  13. Server: Jetty(6.1.26
复制代码

发送数据到指定文件中:
  1. curl -i -X PUT -T webhdfs-test.txt"http://machine-2:50075/webhdfs/v1/tmp/webhdfs/webhdfs-test.txt?op=CREATE&user.name=app&namenoderpcaddress=hadoop-master:9000&overwrite=false"  
  2. HTTP/1.1 100 Continue  
  3.    
  4. HTTP/1.1 201 Created  
  5. Cache-Control: no-cache  
  6. Expires: Wed, 26 Feb 2014 14:37:51 GMT  
  7. Date: Wed, 26 Feb 2014 14:37:51 GMT  
  8. Pragma: no-cache  
  9. Expires: Wed, 26 Feb 2014 14:37:51 GMT  
  10. Date: Wed, 26 Feb 2014 14:37:51 GMT  
  11. Pragma: no-cache  
  12. Location:webhdfs://0.0.0.0:50070/tmp/webhdfs/webhdfs-test.txt  
  13. Content-Type: application/octet-stream  
  14. Content-Length: 0  
  15. Server: Jetty(6.1.26)
复制代码



5.2 读取文件
    读取/input文件信息,使用-L参数。
  1. [app@hadoop-master ~]$ curl -i -L"http://hadoop-master:14000/webhdfs/v1/input?op=OPEN&user.name=app"  
  2. HTTP/1.1 200 OK  
  3. Server: Apache-Coyote/1.1  
  4. Set-Cookie:hadoop.auth="u=app&p=app&t=simple&e=1393420279602&s=dSnnx9oOwgGwVV/Q/ZmFyRjbtFU=";Version=1; Path=/  
  5. Content-Type: application/octet-stream  
  6. Content-Length: 1358  
  7. Date: Wed, 26 Feb 2014 03:11:19 GMT  
  8. Apache HBase [1] is an open-source,distributed, versioned, column-oriented  
  9. store modeled after Google' Bigtable: ADistributed Storage System for  
  10. Structured Data by Chang et al.[2]  Just as Bigtable leverages the distributed  
  11. data storage provided by the Google FileSystem, HBase provides Bigtable-like  
  12. capabilities on top of Apache Hadoop[3].  
  13.    
  14. To get started using HBase, the fulldocumentation for this release can be  
  15. found under the doc/ directory thataccompanies this README.  Using abrowser,  
  16. open the docs/index.html to view theproject home page (or browse to [1]).  
  17. The hbase 'book' at docs/book.html has a'quick start' section and is where you  
  18. should being your exploration of thehbase project.  
  19.    
  20. The latest HBase can be downloaded froman Apache Mirror [4].  
  21.    
  22. The source code can be found at [5]  
  23.    
  24. The HBase issue tracker is at [6]  
  25.    
  26. Apache HBase is made available under theApache License, version 2.0 [7]  
  27.    
  28. The HBase mailing lists and archives arelisted here [8].  
  29.    
  30. 1. http://hbase.apache.org  
  31. 2.http://labs.google.com/papers/bigtable.html  
  32. 3. http://hadoop.apache.org  
  33. 4.http://www.apache.org/dyn/closer.cgi/hbase/  
  34. 5.http://hbase.apache.org/docs/current/source-repository.html  
  35. 6.http://hbase.apache.org/docs/current/issue-tracking.html  
  36. 7.http://hbase.apache.org/docs/current/license.html  
  37. 8. http://hbase.apache.org/docs/current/mail-lists.html
复制代码



5.3 重命名目录
   需要修改op的值和添加destination参数,实例如下所示:
  1. [app@hadoop-master~]$ curl -i -X PUT  
  2. "http://hadoop-master:14000/webhdfs/v1/tmp/webhdfs?op=RENAME&user.name=app&destination=/tmp/webhdfs-new"  
  3. [app@hadoop-master~]$ curl -i -X PUT  
  4. "http://hadoop-master:14000/webhdfs/v1/tmp/webhdfs?op=RENAME&user.name=app&destination=/tmp/webhdfs-new"  
  5. HTTP/1.1 200 OK  
  6. Server:Apache-Coyote/1.1  
  7. Set-Cookie: hadoop.auth="u=app&p=app&t=simple&e=1393420506278&s=Oz9HEzxuYvP8kfAY4SWH6h+Gb50=";Version=1; Path=/  
  8. Content-Type:application/json  
  9. Transfer-Encoding:chunked  
  10. Date: Wed, 26 Feb2014 03:15:06 GMT  
  11.    
  12. {"boolean":true}
复制代码

验证是否正确地执行,输入下列命令:
  1. [app@hadoop-master~]$ hdfs dfs -ls /tmp  
  2. Found 5 items  
  3. drwx------   - app supergroup          0 2014-01-08 08:02 /tmp/hadoop-yarn  
  4. drwxr-xr-x   - app supergroup          0 2014-02-02 09:43 /tmp/hdfs_out  
  5. drwxr-xr-x   - app supergroup          0 2014-02-20 22:39 /tmp/hive-app  
  6. drwxr-xr-x   - app supergroup          0 2014-02-25 04:25 /tmp/jps  
  7. drwxr-xr-x   - app supergroup          0 2014-02-25 04:23 /tmp/webhdfs-new
复制代码


5.4 删除目录
非空的目录删除的话会抛出异常,只有为空的目录才会被删除。

  1. [app@hadoop-master ~]$ curl -i -X DELETE  
  2. "http://hadoop-master:14000/webhdfs/v1/tmp/webhdfs-new?op=DELETE&user.name=app"  
  3. HTTP/1.1 200 OK  
  4. Server: Apache-Coyote/1.1  
  5. Set-Cookie:hadoop.auth="u=app&p=app&t=simple&e=1393421161052&s=r03LOm2hO91ujcc66wNWyMJnDx4=";Version=1; Path=/  
  6. Content-Type: application/json  
  7. Transfer-Encoding: chunked  
  8. Date: Wed, 26 Feb 2014 03:26:01 GMT  
  9.    
  10. {"boolean":true}
复制代码
核查是否正确地执行


  1. [app@hadoop-master ~]$ hdfs dfs -ls /tmp  
  2. Found 4 items  
  3. drwx------   -app supergroup          0 2014-01-0808:02 /tmp/hadoop-yarn  
  4. drwxr-xr-x   -app supergroup          0 2014-02-0209:43 /tmp/hdfs_out  
  5. drwxr-xr-x   -app supergroup          0 2014-02-2022:39 /tmp/hive-app  
  6. drwxr-xr-x   -app supergroup          0 2014-02-2504:25 /tmp/jps
复制代码


总结   

WebDFS提供了一个简单、标准的方式来执行Hadoop 文件系统操作,这个客户端不必运行在Hadoop集群本身中。WebHDFS最主要的特性是让客户端通过预定义端口直接地链接namenode 和 datanode。这样的话,规避了好多HDFS proxy的代理层以及预先配置Tomcat的绑定。WebHDFD API是可互相交换的,这样让客户端不需要去打开防火墙端口。

两种常见的异常:
1. HTTP/1.1 405 HTTP method PUT is not supported by this URL
   修改hdfs-site.xml文件的权限属性。
  1. <property>  
  2. <name>dfs.permissions</name>  
  3. <value>false</value>  
  4. </property>  
复制代码


2 {"RemoteException":{"exception":"AccessControlException","javaClassName":"org.apache.hadoop.security.AccessControlException","message":"Permission denied: user=dr.who, access=WRITE, inode=\"/qzhang\":Administrator:supergroup:drwxr-xr-x\n\tat
   问题2与问题1是一个问题,解决方案同上。






#################################################
http://blog.csdn.net/john_f_lau/article/details/20007299

已有(14)人评论

跳转到指定楼层
yuanjinjun87 发表于 2014-8-19 10:32:14
楼主辛苦了!谢谢分享!
回复

使用道具 举报

hb1984 发表于 2014-8-19 10:50:02
谢谢楼主分享。            
回复

使用道具 举报

ainubis 发表于 2015-3-29 03:01:31
O(∩_∩)O谢谢分享
回复

使用道具 举报

非鱼 发表于 2015-4-14 00:44:16
回复

使用道具 举报

xyxdu 发表于 2015-5-13 18:21:19
httpfs.sh是和hadoop的命令在一起吗,我找到的地方和安装的地方不一样,我hadoop集群式ambri装的。
回复

使用道具 举报

xyxdu 发表于 2015-5-13 18:23:14
加了kerberos认证的配置试过吗,我这怎么都起不来啊。哎。

点评

kerberos最好看官方资料,中文资料很少  发表于 2015-5-13 18:25
回复

使用道具 举报

yuwenge 发表于 2015-5-13 18:23:54
xyxdu 发表于 2015-5-13 18:21
httpfs.sh是和hadoop的命令在一起吗,我找到的地方和安装的地方不一样,我hadoop集群式ambri装的。

启动之后直接用浏览器操作
1.jpg
回复

使用道具 举报

xyxdu 发表于 2015-5-13 19:18:12
yuwenge 发表于 2015-5-13 18:23
启动之后直接用浏览器操作

现在是webhdfs起不来
回复

使用道具 举报

yuwenge 发表于 2015-5-13 19:20:23
xyxdu 发表于 2015-5-13 19:18
现在是webhdfs起不来

看看日志,排排错
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条