以下载为例,HDFS的java客户端编写主要分为下面4个步骤
1. 通过抽象类FileSystem的get静态方法获取文件系统hdfs的实例
2. 使用fs的open方法,打开hdfs文件系统的输入流
3. 打开本地输出流
4. 使用IOUtils的copy方法将hdfs的输入流拷贝到本地文件系统的输出流
在开始写之前,需要先引入HDFS的依赖包,包括hdfs和commons,可以通过maven去引入。
需要注意的是,若不做配置,默认拿到的是本地文件系统的实例,可以通过如下两种方法配置
1. conf.set(name,value)
2. 将hadoop的配置文件拷贝到项目的classpath下
具体代码如下;
Confguration conf = new Confguration();
FileSystem fs = FileSystem.get(conf);
Path src = new Path("hdfs://hostname:9000/filename")
FSDataInputStream is = fs.open(src);
FileOutputStream os = new FileOutputStream("/path-to-save");
IOUtils.copy(is,os);
当然,也可以不用这样写,因为HDFS的API已经封装的很好了,可以直接调用:
fs.copyToLocalFile(src, dst);
如果是在windows下编写的话,可能会遇到权限问题,原因是当前用户无权限操作,可以这样解决:
1. 添加虚拟机运行参数 -DHADOOP_USER_NAME=hadoop
2. 在获取fs实例时,选择重载的get(URI,conf,User)方法