星環-使用httpFS接口操作說明.doc
1.httpFS簡介
httpfs是cloudera公司提供的一個hadoop hdfs的一個http接口,通過WebHDFS REST API 可以對hdfs進行讀寫等訪問。
與WebHDFS的區別是不需要客戶端可以訪問hadoop集羣的每一個節點,通過httpfs可以訪問放置在防火牆後面的hadoop集羣
httpfs是一個Web應用,部署在內嵌的tomcat中
HttpFS可以用於在不同的Hadoop版本間傳輸數據(避免了RPC版本問題),例如使用Hadoop DistCP。
HttpFS可以通過HTTP工具(比如curl和wget)和各種編程語言的HTTP包(不侷限Java)來訪問數據。
webhdfs 客戶端文件系統實現可以使用HDFS文件系統命令行命令(如hadoop dfs)以及使用HDFS Java API來訪問HttpFS。HttpFS內置安全特性支持Hadoop僞身份驗證和HTTP SPNEGO Kerberos 和其他插件式(pluggable )驗證機制。它還提供了Hadoop代理用戶的支持。
Hdfs2.7.2版本的介紹官網地址:
http://hadoop.apache.org/docs/r2.7.2/
2.CURL訪問
用curl命令訪問,url的格式爲:http://httpfs-host:14000/webhdfs/v1/
這是固定格式,/webhdfs/v1/相當於hdfs的根目錄/
14000是默認端口
示例如下:
curl -X GET 'http://10.85.252.1:30142/webhdfs/v1/tmp/xujing/data?op=open&
guardian_access_token=CMjaaNFrKDATxzowF1mY-880TDCA.TDH'
查看HDFS中/tmp/xujing/data文件的內容。
10.85.252.1:30142,hdfs安裝在容器裏,容器裏的端口是14000,這裏ip和端口是svc映射出來的物理機ip和端口。外部訪問要用物理機的地址。
op=open,op指operation,有多種不同的操作,open指打開文件,mkdir指新建目錄,大小寫都可以,具體支持的操作見下表,自已網上查下每個操作是什麼意思。
guardian_access_token,安全認證,access token在guardian中獲取。
Operation支持的操作:
OPEN(HTTP_GET), GETFILESTATUS(HTTP_GET), LISTSTATUS(HTTP_GET),
GETHOMEDIRECTORY(HTTP_GET), GETCONTENTSUMMARY(HTTP_GET),
GETFILECHECKSUM(HTTP_GET), GETFILEBLOCKLOCATIONS(HTTP_GET),
INSTRUMENTATION(HTTP_GET), GETACLSTATUS(HTTP_GET),
APPEND(HTTP_POST), CONCAT(HTTP_POST), TRUNCATE(HTTP_POST),
CREATE(HTTP_PUT), MKDIRS(HTTP_PUT), RENAME(HTTP_PUT), SETOWNER(HTTP_PUT),
SETPERMISSION(HTTP_PUT), SETREPLICATION(HTTP_PUT), SETTIMES(HTTP_PUT),
MODIFYACLENTRIES(HTTP_PUT), REMOVEACLENTRIES(HTTP_PUT),
REMOVEDEFAULTACL(HTTP_PUT), REMOVEACL(HTTP_PUT), SETACL(HTTP_PUT),
DELETE(HTTP_DELETE), SETXATTR(HTTP_PUT), GETXATTRS(HTTP_GET),
REMOVEXATTR(HTTP_PUT), LISTXATTRS(HTTP_GET);
3.java api訪問
3.java api訪問
主要使用commons-httpclient.jar。
這裏以org.apache.commons.httpclient的api爲例說明,代碼如下:
1.相關jar直接到apache網站下載hadoop包解壓後獲得即可。
2.我這裏只用了hadoop-2.7.7\share\hadoop\common\lib下的所有包(commons-httpclient.jar也在這裏個lib裏面)。
3.編譯java程序我用的是jdk1.7
上傳示例:
把文件上傳到hdfs /tmp目錄下,上傳的本地文件是mydata,上傳到hdfs上的文件名是aaa(hdfs上要指定一個文件名)。
上傳時url中的op參數爲CREATE,因爲上傳相當於在hdfs上創建文件。
注意url中的data=TRUE參數,上傳文件一定要加這個參數。
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PutMethod;
public class UpLoad{
public static void main(String[] args) {
String url = "http://10.85.252.1:30142/webhdfs/v1/tmp/ccc?op=CREATE&data=TRUE&guardian_access_token=CMjaaNFrKDATxzowF1mY-880TDCA.TDH";
HttpClient client = new HttpClient();
int status = -1;
PutMethod method = new PutMethod(url);
method.setRequestHeader("Content-Type","application/octet-stream");
try {
// 設置上傳文件
File targetFile = new File("mydata");
FileInputStream in =new FileInputStream(targetFile);
method.setRequestBody(in);
status = client.executeMethod(method);
System.out.println(status);
} catch (Exception e) {
e.printStackTrace();
}
method.releaseConnection();
}
}
下載示例:
把hdfs /tmp目錄下的aaa文件下載到本地,本地文件名爲mydata12。
url中的op參數爲open
沒有data=TRUE參數
``
import java.io.File;
import java.io.FileOutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
public class DownLoad {
public static void main(String[] args) {
String url = "http://10.85.252.1:30142/webhdfs/v1/tmp/aaa?op=open&guardian_access_token=CMjaaNFrKDATxzowF1mY-880TDCA.TDH";
HttpClient client = new HttpClient();
int status = -1;
GetMethod method = new GetMethod(url);
try {
// 設置下載文件
File file = new File("mydata12");
status = client.executeMethod(method);
byte[] getData= method.getResponseBody();
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if(fos!=null){
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
method.releaseConnection();
}
}
`