星环-使用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();
}
}
`