首页 > 代码库 > HDFS API操作实践

HDFS API操作实践

本文提供几个简单的实例,来说明如何使用hadoop的java API针对HDFS进行文件上传、创建、重命名、删除操作

本文地址:http://www.cnblogs.com/archimedes/p/hdfs-api-operations.html,转载请注明源地址。

1.上传本地文件到HDFS

通过FileSystem.copyFromLocalFile(Path src, Path dst)可将本地文件上传到HDFS指定的位置上,其中src和dst均为文件的完整路径

在《hadoop实战--搭建开发环境及编写Hello World》一文中的myHelloWorld项目下新建一个文件CopyFile.java,添加代码:

import java.util.*;import java.io.IOException;import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.*;import org.apache.hadoop.fs.FileStatus;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class CopyFile {    public static void main(String[] args) throws Exception {         Configuration conf = new Configuration();         FileSystem hdfs = FileSystem.get(conf);                  Path src =new Path("/home/wu/copy.txt");  //完整路径         Path dst =new Path("hdfs://localhost:9000/user/wu/in/");         hdfs.copyFromLocalFile(src, dst);         System.out.println("Upload to" + conf.get("fs.default.name"));                 FileStatus files[] = hdfs.listStatus(dst);         for(FileStatus file : files) {             System.out.println(file.getPath());         }    }}

copy.txt为自己新建的一个测试文件,关于dst路径,可以双击in文件中的test1.txt,就会出现完整路径名(hdfs://localhost:9000/user/wu/in)

注意:main后面加上throws Exception,否则会报错

运行结果可以在控制台和文件夹中验证,控制台显示:

Upload tohdfs://localhost:9000/
hdfs://localhost:9000/user/wu/in/copy.txt
hdfs://localhost:9000/user/wu/in/test1.txt
hdfs://localhost:9000/user/wu/in/test2.txt

刷新项目,可以看到in文件下夹多了一个copy.txt文件

2.创建HDFS文件 

通过FileSystem.creat(Path f)可在HDFS上创建文件,其中f为文件的完整路径。

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class CreateFile {    public static void main(String[] args) throws Exception{        Configuration conf = new Configuration();        byte[] buff = "hello world, hello wu!".getBytes();        FileSystem hdfs = FileSystem.get(conf);        Path dfs = new Path("hdfs://localhost:9000/user/wu/in/copy.txt");        FSDataOutputStream outputStream = hdfs.create(dfs);        outputStream.write(buff,0, buff.length);    }}

双击查看in文件夹中的copy.txt文件,内容如预期所示:

3.重命名HDFS文件

通过FileSystem.rename(Path src, Path dst)可为指定的HDFS文件重命名,其中src和dst均为文件的完整路径。

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class RenameFile {    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        Configuration conf = new Configuration();        FileSystem hdfs = FileSystem.get(conf);        Path frPath = new Path("hdfs://localhost:9000/user/wu/in/copy.txt");        Path toPath = new Path("hdfs://localhost:9000/user/wu/in/RenameFile.txt");        boolean isRenameFile = hdfs.rename(frPath, toPath);    }}

运行后的结果如下图:

4.删除HDFS上的文件

通过FileSystem.delete(Path f,Boolean recursive)可删除指定的HDFS文件,其中f为需要删除文件的完整路径,recursive用来确定是否进行递归删除。

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class RenameFile {    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        Configuration conf = new Configuration();        FileSystem hdfs = FileSystem.get(conf);        Path delpath = new Path("hdfs://localhost:9000/user/wu/in/RenameFile.txt");                boolean isDeleted = hdfs.delete(delpath, false);        System.out.println("delete?" + isDeleted);    }}

运行后的结果如下图:

5.查看HDFS文件的最后修改时间

通过FileStatus.getModificationTime()可以查看指定HDFS文件的修改时间。

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.FileStatus;import org.apache.hadoop.fs.Path;public class GetLTime {    public static void main(String[] args) throws Exception{        // TODO Auto-generated method stub        Configuration conf = new Configuration();        FileSystem hdfs = FileSystem.get(conf);        Path fpath = new Path("hdfs://localhost:9000/user/wu/in/hdfstest.txt");        FileStatus fileStatus = hdfs.getFileStatus(fpath);        long modificationTime = fileStatus.getModificationTime();        System.out.println("Modification time is " + modificationTime);    }}

运行结果如下:

Modification time is 1418719100449

6.查看某个HDFS文件是否存在

通过FileSystem.exists(Path f)可查看指定HDFS文件是否存在,其中f为文件的完整路径。

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.FileStatus;import org.apache.hadoop.fs.Path;public class CheckFile {    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        Configuration conf = new Configuration();        FileSystem hdfs = FileSystem.get(conf);        Path findfile = new Path("hdfs://localhost:9000/user/wu/in/hdfstest.txt");        boolean isExists = hdfs.exists(findfile);        System.out.println("is exists? " + isExists);    }}

运行结果如下:

is exists? true

7.查看某个文件的HDFS集群位置

通过FileSystem.getFileBlockLocation(FileStatus file,long start,long len)可查找指定文件在HDFS集群上的位置,其中file为文件的完整路径,start和len来标识查找文件的路径。

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.BlockLocation;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.FileStatus;import org.apache.hadoop.fs.Path;public class FileLoc {    public static void main(String[] args) throws Exception{        // TODO Auto-generated method stub        Configuration conf = new Configuration();        FileSystem hdfs = FileSystem.get(conf);        Path fpath = new Path("hdfs://localhost:9000/user/wu/in");        FileStatus filestatus = hdfs.getFileStatus(fpath);        BlockLocation[] blkLocations = hdfs.getFileBlockLocations(filestatus, 0, filestatus.getLen());        int blockLen = blkLocations.length;        System.out.println(blockLen);        for(int i = 0; i < blockLen; i++) {            String[] hosts = blkLocations[i].getHosts();            System.out.println("block " + i + "location:" + hosts[i]);        }    }}

参考资料

《实战Hadop:开启通向云计算的捷径.刘鹏》

HDFS API操作实践