基于JavaAPI对远程hdfs的操作

基于JavaAPI对hdfs的操作

通过Java API来访问HDFS,首先介绍HDFS中的文件操作主要涉及的几个类。

·Configuration类:该类的对象封装了客户端或者服务器的配置。

·FileSystem类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs=FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。

·FSDataInputStream和FSDataOutputStream:这两个类是HDFS中的输入/输出流,分别通过FileSystem的open方法和create方法获得。

接下来通过实例介绍如何利用Java API进行文件夹的创建、文件列表显示、文件上传和文件下载操作,为了使读者对实例具有完整性的理解,我们把主函数也列了出来。实例代码如下:

//需要的包
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class HdfsDemo1 {
    public static void main(String[] args) {
        createFolder();//文件的创建
        uploadFile();//文件上传
        downloadFile();//文件下载
        listFile(new Path("/");//递归显示文件夹
    }
}

1.创建文件夹

如果想要将文件放入不同的文件夹中,则可以有针对性地动态创建文件夹。关于文件夹的创建比较简单。代码如下:

//1.创建文件夹
    public static void createFolder()  {
        //定义一个配置对象
        Configuration conf = new Configuration();
        try {
            //通过配置信息得到文件系统的对象
            FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.11:9000"),conf,"root");
            //在指定的路径下创建文件夹

            Path path = new Path("/javaAddFolder1");
            System.out.println(fs.mkdirs(path));
            fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2.递归显示文件

    //2.递归显示文件
    public static void listFile(Path path){
        //定义个配置对象
        Configuration conf = new Configuration();

        try {
            //通过配置信息得到文件系统的对象
            FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.11:9000"), conf, "root");
            //传入路径,表示显示某个路径下的文件夹列表
            //将给定路径下所有的文件元数据放到一个FileStatus的数组
            //FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等
            FileStatus[] fileStatuses = fs.listStatus(path);

            for (int i= 0 ; i<fileStatuses.length;i++){
                FileStatus fileStatus = fileStatuses[i];
                //首先检测当前是否是文件夹,如果是则进行递归
                if(fileStatus.isDirectory()){
                    System.out.println("当前路径是: "+fileStatus.getPath());
                    listFile(fileStatus.getPath());
                } else {
                    System.out.println("当前路径是:"+fileStatus.getPath());
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

3.文件上传

 //3.文件上传
    public static void uploadFile(){
        //定义个配置对象
        Configuration conf = new Configuration();

        try {
            //通过配置信息得到文件系统的对象
            FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.11:9000"), conf, "root");

            //定义文件的路径和上传的路径
            Path src = new Path("D://kmeans_data.txt");
            Path dest = new Path("/");

            //从本地上传到文件服务器上
            fs.copyFromLocalFile(src,dest);
            fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.文件下载

 //4.文件下载
    public static void downloadFile(){
        //定义配置对象
        Configuration conf = new Configuration();

        try {
            //通过配置文件加载文件系统对象
            FileSystem fs = FileSystem.get(new URI("hdfs://192.168.10.11:9000"), conf, "root");

            //定义下文文件的路径和本地下载路径
            Path src = new Path("/kmeans_data.txt");
            Path dest = new Path("F://");

            //下载文件到本地
            fs.copyToLocalFile(src,dest);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
author@nohert
原文地址:https://www.cnblogs.com/gzgBlog/p/13715348.html