首先,hadoop的WebHDFS支持通過REST API用http的方式訪問HDFS。
通過REST API能完成很多,如上傳下載,查看文件,創建目錄等操作. 本地的hadoop版本是hadoop2.0,裝上了httpfs,端口是14000. 這里以上傳文件(原文是Create and Write to a File)為例。
上傳文件分為兩步,
第一步先提交一個不自動重定向的,不發送文件數據的put請求 如,我要上傳文件test.txt到user目錄。執行以下命令:
curl -i -X PUT "http://10.20.18.1:14000/webhdfs/v1/user/test.txt?user.name=hdfs&op=CREATE"
[&overwrite=<true|false>][&blocksize=<LONG>][&replication=<SHORT>] [&permission=<OCTAL>][&buffersize=<INT>]"
//后面是可選參數其中overwrite是是否覆蓋,默認為false,但是官方文檔上說true是個Valid Values(暈)
//可以看出塊大小,副本數,文件權限都是可以設置的。 執行之后會得到一些返回,如下:
HTTP/1.1 307 Temporary Redirect Server: Apache-Coyote/1.1 Set-Cookie: hadoop.auth="u=hdfs&p=hdfs&t=simple&e=1345220043113&s=ikU/wiUsFtaTHrkPQmaya5PHjkQ="; Version=1; Path=/ Location: http://10.20.18.1:14000/webhdfs/v1/user/test.txt?op=CREATE&user.name=hdfs&data=true Content-Type: application/json Content-Length: 0 Date: Fri, 17 Aug 2012 06:14:03 GMT
//注意到返回值是307
記下headers中的Set-Cookie和Location的內容。
例如,我把Set-Cookie的內容寫到cookie.txt中,把Location寫到url.txt中。
第二步:上傳文件test.txt:
記下headers中的Set-Cookie和Location的內容。
例如,我把Set-Cookie的內容寫到cookie.txt中,把Location寫到url.txt中。
第二步:上傳文件test.txt:
curl -i -X PUT -T test.txt -b cookie.txt --header "Content-Type: application/octet-stream" "`cat url.txt`"
這時就可以在hdfs上看到你上傳的文件了。
當然,在命令行中完成hadoop-httpfsde restAPI調用肯定不是httpfs的本意。
這里用XMLHttpResquest來上傳文件。作為例子。完整代碼請查看附件。
這里用XMLHttpResquest來上傳文件。作為例子。完整代碼請查看附件。
在/usr/lib/hadoop-httpfs/webapps/ROOT下創建abc.html,這樣可以通過httpfs的端口訪問了
-
this.xhr.open( p.method, p.url, true);
-
this.xhr.setRequestHeader("Content-Type","application/octet-stream");//設置Content-Type屬性
-
this.xhr.onreadystatechange = function() {
-
if( this.xhr.readyState != 4 ) { return; }
-
}.bind( this );
-
this.xhr.send( null );//發送文件,這里使用空,null
這里的this.xhr是個XMLHttpResquest對象。在this.xhr.send( null );之前,XMLHttpResquest
已經完成了cookie和location的重定向(注意上面出現了的307,xmlhttpresqust在send的時候會對307返回值的請求重定向)。
本文出自 “稀飯吃了不頂餓” 博客,請務必保留此出處http://chcearth.blog.51cto.com/2179839/965704