zoukankan      html  css  js  c++  java
  • HDFS的类学习和API基本操作

    类学习

    Configuration

    设置HDFS的相关参数。

    conf = new Configuration ();
    conf.set("fs.defaultFS","hdfs://bigdata:9000");
    conf.set("dfs.client.use.datanode.hostname", "true");
    conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
    

    FileSystem

    该类的对象是一个文件系统对象,可以使用一些方法对文件进行操作。一般通过FileSystem的get方法来生成对象。

    有两种方法获得FileSystem对象

    通过get()
    //其中conf是Configuration,服务器配置
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS","hdfs://xxx.xxx.xxx.xxx:9000");
    conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
    FileSystem fs = FileSystem.get(conf);
    
    //也可以通过get(new URI("URI地址"),conf)来精准获得FileSystem
    
    通过newInstance()
    FileSystem fs = FileSystem.newInstance(URI,conf);
    
    FileSystem的功能

    有以下几个功能:

    • mkdirs(Path p),创建目录
    • create(Path p),指定路径创建FSDataOutputStream
    • exists(Path p),判断文件或目录是否存在
    • listStatus(Path p),返回所有文件信息
    • open(Path p),指定路径创建FSDataInputStream

    Path

    文件的存储路径。如果在本地文件系统用File

    //一般用以下方法来生成
    new Path(URI uri)
    new Path(String pathString)
    

    FileStatus

    通过FileSystem的listStatus可以返回FileStatus,表示文件的详细信息。

    FileStatus[] fileStatuses = fs.listStatus(path);
    //可以通过添加PathFilter来过滤部分文件
    FileStatus[] fileStatuses = fsSource.listStatus(inputPath, new PathFilter(""));
    

    有以下API:

    • getLen(),得到文件大小
    • getPath(),得到Path路径
    • getPermission(),获取权限信息
    • isDir(),是否是目录
    • isFile(),是否是文件

    PathFilter

    用来过滤部分文件,通过正则表达式。

    class ImplementsPathFilter implements PathFilter{
        private final String regex;
        public ImplementsPathFilter(String regex) {
            this.regex = regex;
        }
        @Override
        public boolean accept(Path path) {
            return !path.toString().matches(regex);
        }
    }
    

    输入输出流

    FSDataInputStream和FSDataOutputStream

    FileSystem对象的open()方法返回的是FSDataInputStream对象,支持随机访问,可以从流的任意位置读取数据。FileSystem中的create()方法返回了一个FSDataOutputStream对象。

    FSDataInputStram in = fs.open(new Path());
    byte[] data = new byte[1024];
    in.read(data);
    System.out.println(new String(data));
    
    FSDataOutputStram out = fs.create(new Path());
    out.write(data);
    

    read(data)从文件读取数据,并存储到data中。此时保存的是byte类型,需要通过new String转换为String类型,不可通过toString()。
    write()写入数据。

    API操作

    import org.apache.hadoop.fs.*;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.io.*;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    
    public class HDFS_API {
        public static FileSystem fs;
        public static Configuration conf;
    
        public void init() throws Exception {
            //通过这种方式设置客户端身份
            System.setProperty("HADOOP_USER_NAME", "hadoop");
            conf = new Configuration ();
            conf.set("fs.defaultFS","hdfs://bigdata:9000");
            conf.set("dfs.client.use.datanode.hostname", "true");
            conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
            fs = FileSystem.get(conf);
    
            //或者使用下面的方式设置客户端身份
            //fs = FileSystem.get(new URI("hdfs://bigdata:9000"),conf,"hadoop");
        }
        public void close() throws Exception {
            if(fs != null)
                fs.close ();
        }
    
        //遍历path路径下文件及文件信息
        public void listFiles(String path) throws Exception {
            //listStatus可以添加FileFilter类过滤不要的文件
            FileStatus[] files = fs.listStatus (new Path(path));
            for(FileStatus file : files) {
                //文件大小
                System.out.println ( file.getLen () );
                //文件路径
                System.out.println ( file.getPath () );
                //文件权限
                System.out.println ( file.getPermission () );
                //file.isFile()
                //file.isDirectory()
            }
        }
        //创建文件夹
        public void mkDir(String path) throws Exception {
            //第一个参数是路径Path,第二个参数是目录权限管理
            fs.mkdirs ( new Path(path) );
        }
        //删除文件夹
        public void deleteDir(String path) throws Exception {
            fs.delete ( new Path(path), true );
        }
        //下载文件,通过copyTocalFile()和copyFromLocalFile()
        //或者通过FSDataInputStream和FSDataOutputStream
        public void getFileToLocal(String inputPath, String outputPath) throws Exception {
            //fs.copyToLocalFile (new Path(inputPath), new Path(outputPath));
            //FileSystem对象的open()方法返回一个FSDataInputStream,用以读数据,建立输入流
            FSDataInputStream inputStream = fs.open (new Path(inputPath));
            //本地的输出流
            FileOutputStream outputStream = new FileOutputStream (new File (outputPath));
            IOUtils.copyBytes (inputStream,outputStream,conf);
            IOUtils.closeStreams ( inputStream, outputStream );
        }
        //上传文件
        public void putFile(String inputPath, String outputPath) throws Exception {
            //第一个参数是本地路径,第二个路径是上传路径,将本地文件上传到HDFS上
            //fs.copyFromLocalFile (new Path(inputPath), new Path(outputPath));
            FileInputStream inputStream = new FileInputStream (new File(inputPath));
            FSDataOutputStream outputStream = fs.create (new Path(outputPath));
            IOUtils.copyBytes (inputStream,outputStream,conf);
            IOUtils.closeStreams ( inputStream,outputStream );
        }
    
        //在HDFS上用流读写数据
        public void read_write(String inputPath, String outputPath) throws Exception {
            FSDataInputStream inputStream = fs.open (new Path(inputPath));
            FSDataOutputStream outputStream = fs.create (new Path(outputPath));
            //只能操作字节流
            byte[] buf = new byte[1024];
            inputStream.read(buf);
            //不可以用buf.toString,其没有重写toString()方法,只会返回类名和地址
            System.out.println (new String(buf));
            outputStream.write (buf);
            IOUtils.closeStreams (inputStream,outputStream);
        }
    
    
        public static void main(String[] args) {
    
        }
    }
    
    
  • 相关阅读:
    利息基础理论
    本地数据库
    线上一个数组查询遇到的坑
    老兵的十年职场之路(二)
    老司机心得之时间管理"入坑"
    补习系列(19)-springboot JPA + PostGreSQL
    PostGreSQL(1)-源码安装
    补习系列(18)-springboot H2 迷你数据库
    SpringBoot 2 要不要升级
    补习系列(17)-springboot mongodb 内嵌数据库
  • 原文地址:https://www.cnblogs.com/chenshaowei/p/13271965.html
Copyright © 2011-2022 走看看