美文网首页
HDFS的JAVA api操作——学习总结

HDFS的JAVA api操作——学习总结

作者: 夜希辰 | 来源:发表于2020-09-14 00:09 被阅读0次

    目录
    一、简单JAVA知识
    二、HDFS的JAVA api操作
    三、我的学习代码
    四、我的问题

    一、简单JAVA知识

    因为自己JAVA知识不咋滴,所以先总结一下HDFS的api操作中涉及的JAVA知识。先看个2个JAVA函数。



    对于我来说主要为四点

    1、程序入口方法public static void main(String[] args)
    2、如何定义JAVA中的方法访问修饰符 返回值类型 方法名(参数列表)
      public void show(){//无参无返回值的方法
            System.out.printlin("hello world");
    }
    
    3、调用方法。先创建类的对象,然后通过 对象名.方法名()
    HelloWorld hello = new HelloWorld();//创建类的对象
    hello.sort(scores);// 对象名.方法名(),调用方法
    
    4、Java的异常处理抛出以及自定义异常

    异常处理里面有抛出异常,以及自定义异常。在IDEA或者eclipsec中都可以自动补全JAVA语法,然后我对这部分语法还不熟悉,多写多写代码,后面在复习,先把问题记录在这。

    try-catch 以及try-catch-finally处理异常
    try{
    //一些会抛出异常的方法
    }catch(exception e){
    //处理该异常的代码块
    }
    如果try抛出异常将会发生什么勒?
    终止执行,
    程序的控制权将被移交给catch块中的异常处理程序
    
    

    二、HDFS的JAVA api操作

    HDFS的JAVA api操作中,主要包括创建文件夹、上传、下载文件、修改文件名。如果学习就该该部分即可。

    //导入包
    import org.apache.commons.io.IOUtils;
    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.conf.Configuration;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    public class Hdfs {
    
    //----------------------------------------------------------------------------------
    
    //一、JAVA入口
        public static void main(String[] args) throws Exception{
            //静态方法要调用非静态方法,需要通过对象访问非静态方法
            Hdfs Hdfs = new Hdfs();
            Hdfs.getFileSytem1();
            Hdfs.getFilesySystme2();
            Hdfs.listFiles();
    //        Hdfs.mkdirs(); //测试成功
    //        Hdfs.uploadFile();//测试成功
        //   Hdfs.downFile();//下载文件成功了
       //     Hdfs.downloadFile();
        }
    
    //----------------------------------------------------------------------------------
    
     //二、创建文件夹
        public void mkdirs() throws URISyntaxException, IOException, InterruptedException {
            //1.获取FileSystem实例
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "root");
            //2.创建文件夹
            fileSystem.mkdirs(new Path("/aa/bb/cc"));//在什么路径下创建文件
            //3.关闭Filesystem
            fileSystem.close();
        }
    
    //--------------------------------------------------------------------------------------
    
    //三、上传文件
        public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
            //1.获取实例,获取HDFS抽象封装对象
            //异常当你给别人写方法就可以抛异常,当你用别人的方法异常就要处理
            //当用方法处理业务逻辑的时候异常全部都要处理
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "bigdata");
            //2.上传文件,用这个对象操作文件系统
            fileSystem.copyFromLocalFile(new Path("F://test0913.txt"),new Path("/file"));
            //copyFromLocalFile两个参数源文件,目标文件地址
            //3.关闭实例,关闭文件系统
            fileSystem.close();
            //用完之后一定要关,因为HDFS不支持并发写入。开着别人就写不了
        }
    
    //----------------------------------------------------------------------------------
    
     //三、文件下载:使用copyToLocalFile
        public void downloadFile() throws URISyntaxException, IOException {
            //1.获取FileSystem
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration());//alt+enter抛出异常
            //2.调用方法,实现文件的下载
            //注意设置false和true两个参数,否则在IDEA中直接运行报错:(null)entry in command string:null chmod 0644
            fileSystem.copyToLocalFile(false,new Path("/wc.txt"),new Path("D://test2_down.txt"),true);
    
            //3.关闭filesystem
            fileSystem.close();
        }  
    
    //----------------------------------------------------------------------------------
    
     //四、文件重命名
        public void rename() throws IOException, URISyntaxException, InterruptedException {
            //1.创建实例
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"),new Configuration(),"bigdata");
            //2.用方法,实现文件重命名
            fileSystem.rename(new Path("wcc.txt"),new Path("wc.txt"));
            //3.关闭实例,关闭文件系统
            fileSystem.close();
        }
    
    }
    
    

    上面代码执行是成功的,如图

    三、我的学习代码

    大家如果学习的话,不用看该部分内容。因为我记得笔记比较乱。

    import org.apache.commons.io.IOUtils;
    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.conf.Configuration;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    public class Hdfs {
      /*  public static void main(String[] args) {
            System.out.println("tests");
        }*/
        public static void main(String[] args) throws Exception{
            //静态方法要调用非静态方法,需要通过对象访问非静态方法
            Hdfs Hdfs = new Hdfs();
    //        Hdfs.rename();
            Hdfs.getFileSytem1();
            Hdfs.getFilesySystme2();
    //        Hdfs.listFiles();
    //        Hdfs.mkdirs(); //测试成功
    //        Hdfs.uploadFile();//测试成功
    //       Hdfs.downFile();//下载文件成功了
       //     Hdfs.downloadFile();
        }
        //方式一:获取getFileSystme1
        public void getFileSytem1() throws IOException{
            //1、创建Configuration对象
            Configuration conf = new Configuration();
    
            //2、设置文件系统类型
            conf.set("fs.defaultFS", "hdfs://bigdata02:9000");
    
            //3、获取指定的文件系统
            FileSystem fileSystem = FileSystem.get(conf);
    
            //4、输出测试
            System.out.println(fileSystem);
        }
    
        //方式二:获取getFileSystme2
        public void getFilesySystme2() throws IOException{
            //1.创建configuration对象
            Configuration conf = new Configuration();
    
            //2.设置文件系统类型
            conf.set("fs.defaultFS", "hdfs://bigdata02:9000");
    
            //3.获取指定的文件系统
            FileSystem fileSystem = FileSystem.newInstance(conf);
    
            //4.输出测试
            System.out.println(fileSystem);
        }
        /**
           * 方式三:new URI+get
           * @throws Exception
           */
        public void getFileSystem3() throws Exception{
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:9000"),
                    new Configuration());
            System.out.println("fileSystem:" + fileSystem);
        }
        //文件的遍历
        public void listFiles() throws URISyntaxException, IOException, InterruptedException {
            //1.获取FileSystem实例
            //String str;
            //kFileSystem fileSystem = FileSystem.get(new URI(str:"hdfs://bigdata02:8020"),new Configuration(),user:"bigdata");
            URI uri = new URI("hdfs://bigdata02:9000");
            Configuration conf = new Configuration();
            FileSystem fileSystem = FileSystem.get(uri, conf,"bigdata");
            //Configuration对服务器要求的自定义配置,创建了一个对象fileSystem,要做什么事,就操作对象就行
    
            //2.调用一个方法 listFiles方法
            //fileSystem.listFiles(new Path(pathString:"/"),recursive:true);
            RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
    
            //3.遍历迭代
            while (iterator.hasNext()){
                LocatedFileStatus fileStatus = iterator.next();
                //4.打印输出
                System.out.println(fileStatus.getPath()+"====="+fileStatus.getPath().getName());
            }
        }
    
        //创建文件夹
        public void mkdirs() throws URISyntaxException, IOException, InterruptedException {
            //1.获取FileSystem实例
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "root");
            //2.创建文件夹
            fileSystem.mkdirs(new Path("/aa/bb/cc"));//在什么路径下创建文件
    //3.关键Filesystem
            fileSystem.close();
        }
        //上传文件
        public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
            //1.获取实例,获取HDFS抽象封装对象
            //异常当你给别人写方法就可以抛异常,当你用别人的方法异常就要处理
            //当用方法处理业务逻辑的时候异常全部都要处理
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "bigdata");
            //2.上传文件,用这个对象操作文件系统
            fileSystem.copyFromLocalFile(new Path("F://test0913.txt"),new Path("/file"));
            //copyFromLocalFile两个参数源文件,目标文件地址
            //3.关闭实例,关闭文件系统
            fileSystem.close();
            //用完之后一定要关,因为HDFS不支持并发写入。开着别人就写不了
        }
    
        //下载文件 通过输入输出流得方式下载文件
        public void downFile() throws URISyntaxException, IOException, InterruptedException {
        //1.获取filesystem实例
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "bigdata");
    
            //2.获取HDFS的输入流
            FSDataInputStream inputStream= fileSystem.open(new Path("/wc.txt"));
    
            //3.获取本地路径的输出流
            FileOutputStream outputStream = new FileOutputStream("D://test1_down.txt");
    
            //4.文件的拷贝
            IOUtils.copy(inputStream,outputStream);
            //5.关闭流
            IOUtils.closeQuietly(inputStream);
            IOUtils.closeQuietly(outputStream);
            fileSystem.close();
        }
    
        //文件下载:使用copyToLocalFile
        public void downloadFile() throws URISyntaxException, IOException {
            //1.获取FileSystem
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration());//alt+enter抛出异常
            //2.调用方法,实现文件的下载
            //注意设置false和true两个参数,否则在IDEA中直接运行报错:(null)entry in command string:null chmod 0644
    
            fileSystem.copyToLocalFile(false,new Path("/wc.txt"),new Path("D://test2_down.txt"),true);
    
            //3.关闭filesystem
            fileSystem.close();
    
        }
    
    
    
        //文件下载:使用copyToLocalFile2
        public void downloadFile2(){
            //1.获取FileSystem
            FileSystem fileSystem = null;//alt+enter抛出异常
            try {
                fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration());
            } catch (IOException e) {
                e.printStackTrace();
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            //2.调用方法,实现文件的下载
            //注意设置false和true两个参数,否则在IDEA中直接运行报错:(null)entry in command string:null chmod 0644
    
            try {
                fileSystem.copyToLocalFile(false,new Path("/wc.txt"),new Path("D://test2_down.txt"),true);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //3.关闭filesystem
            try {
                fileSystem.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    }
    
    
    

    四、我的问题

    1、不明白创建实例这一步,及中间的参数怎么看,不知道中间的实现过程。不知道为什么参数里面还可以new(这个是重点)
    太傻勒,给我讲了一遍我还没有学会

      FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"),new Configuration(),"bigdata");
    
    

    2、在调用方法的时候,不知道参数应该怎么传,应该传什么参数。就是在构建fileSystem时,不知道这个实例有哪些常用的方法,方法的参数是什么,以及在哪里看。

    3、感觉自己应该了解下FileSystem包中,中常用的方法(也不知道自己专业术语说正确没有。

    睡觉勒~~

    相关文章

      网友评论

          本文标题:HDFS的JAVA api操作——学习总结

          本文链接:https://www.haomeiwen.com/subject/tomoektx.html