本文主要介绍了如何使用java的api来对HDFS进行操作。


(1)URL方式访问Hadoop中的文件

①为了方便修改本机C盘的windows/system32/drivers/etc下的hosts文件

Hadoop初学指南(4)--使用java操作HDFS_java

前一个为虚拟机的ip地址,后一个为虚拟机的主机名

②打开eclipse,新建一个Java工程,在src下建立一个hdfs的文件夹

Hadoop初学指南(4)--使用java操作HDFS_HDFS_02

③导入hadoop-1.1.2源码包中主目录以及lib目录中的jar包

④新建一个java类,这里命令为App1

Hadoop初学指南(4)--使用java操作HDFS_hadoop_03

⑤开始编程

代码如下:

package hdfs;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
public class App1 {
    static final String PATH="hdfs://myhadoop:9000/hello";
                                                                                                                                                                                                                                                                                                                                                                                                           
    public static void main(String[] args) throws Exception{
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
        URL url = new URL(PATH);
        InputStream in =url.openStream();
        IOUtils.copyBytes(in, System.out, 1024, true);
                                                                                                                                                                                                                                                                                                                                                                                                               
    }
}

这里IOUtils中的四个参数分别表示输入流,输出流,缓存大小以及在传输结束后是否关闭流。

代码写完后执行即可看到HDFS中/hello的内容:

Hadoop初学指南(4)--使用java操作HDFS_java_04

这是直接用shell查看/hello的内容:

Hadoop初学指南(4)--使用java操作HDFS_hadoop_05

内容完全一致。


(2)利用hadoop自身的api进行操作

如果涉及到上传,创建,删除等操作,那么URL的方式就显得力不从心了,这时就需要用到hadoop自身提供的api进行操作。


在操作之前需要建立一个跟HDFS连接的FileSystem:

static final String PATH="hdfs://myhadoop:9000/";
FileSystem fileSystem = FileSystem.get(new URI(PATH),new Configuration());

创建完这个FileSystem之后,就可以用这个FileSystem进行操作

①创建文件夹

代码如下:

fileSystem.mkdirs(new Path("/d1"));

Hadoop初学指南(4)--使用java操作HDFS_FileSystem_06

可以看见/d1文件夹已经创建好了。

②删除文件夹

代码如下:

fileSystem.delete(new Path("/d1"),true);

这里要注意一下第二个参数,如果第一个参数为目录,那么此时必须为true;如果第一个参数为文件,那么true和false都可以。

③上传文件

代码如下:

FSDataOutputStream out = fileSystem.create(new Path("/d1/hello"));
FileInputStream in = new FileInputStream("H:/readme.txt");
IOUtils.copyBytes(in, out, 1024,true);

上传完成之后,查看/d1下的hello内容如下:

Hadoop初学指南(4)--使用java操作HDFS_FileSystem_07


④下载文件

FSDataInputStream in1 = fileSystem.open(new Path("/d1/hello"));
IOUtils.copyBytes(in1, System.out, 1024,true);

这里的out可以指定到本地硬盘,这里演示就直接输出到控制台了:

Hadoop初学指南(4)--使用java操作HDFS_hadoop_08

⑤浏览文件夹

代码如下:

FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
for (FileStatus fileStatus : listStatus) {
        String isDir=fileStatus.isDir()?"文件夹":"文件";
        String permission = fileStatus.getPermission().toString();
        short replication = fileStatus.getReplication();//副本数
        long len = fileStatus.getLen();
        String path = fileStatus.getPath().toString();
        System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
}

这里的permission表示权限,replication表示副本数,len表示长度,path表示路径,结果如下:

Hadoop初学指南(4)--使用java操作HDFS_FileSystem_09

当然,可以看到,这里不支持递归查询。