zoukankan      html  css  js  c++  java
  • Hadoop系列007-HDFS客户端操作


    title: Hadoop系列007-HDFS客户端操作
    date: 2018-12-6 15:52:55
    updated: 2018-12-6 15:52:55
    categories: Hadoop
    tags: [Hadoop,HDFS,HDFS客户端]


    本人微信公众号,欢迎扫码关注!

    HDFS客户端操作

    1 环境准备

    1.1 Jar包准备

    1)解压hadoop-2.7.2.tar.gz到非中文目录

    注意1:如果使用WinRAR解压报错的话,就使用超级管理员权限打开DOS窗口,然后cd到解压包所在位置,执行start winrar x -y xxx.tar.gz命令,即可成功

    注意2:使用对应平台下编译后的hadoop源码包,即win7系统使用在win7下编译后的源码包,win10同理。

    2)进入share文件夹,查找所有jar包,并把jar包拷贝到_lib文件夹下

    3)在全部jar包中查找.source.jar,并剪切到_source文件夹。

    4)在全部jar包中查找tests.jar,并剪切到_test文件夹。

    1.2 IDEA准备

    1)配置HADOOP_HOME环境变量

    2)建立工程并且添加依赖

    注意:Eclipse全选Jar包右键Add Build Path

    3)编写代码测试

    
    

    4)执行程序

    客户端去操作hdfs时,是有一个用户身份的。默认情况下,hdfs客户端api会从jvm中获取一个参数来作为自己的用户身份:-DHADOOP_USER_NAME=atguigu,atguigu为用户名称。

    5)验证

    2 通过API操作HDFS

    2.1 HDFS获取文件系统
    @Test
    public void getFileSystem() {
        // 1 创建配置对象
        Configuration conf = new Configuration();
        // 2 获取文件系统
        FileSystem fs = null;
        try {
            fs = FileSystem.get(new URI("hdfs://hadoop102:8020"), conf, "intflag");
    
            // 3 打印文件系统
            System.out.println(fs);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    2.2 HDFS文件上传
    @Test
    public void putFileToHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 上传文件
        try {
            fs.copyFromLocalFile(true,new Path("D:/test/x3.000"), new Path("/user/intflag/input/x3.000"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    
    2.3 HDFS文件下载
    @Test
    public void getFileFromHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 下载文件
        try {
            fs.copyToLocalFile(new Path("/user/intflag/input/x3.000"),new Path("D:/test/x3.000"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    
    2.4 HDFS目录创建
    /**
     * 在HDFS上创建文件夹
     */
    @Test
    public void mkdirAtHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 创建文件夹
        try {
            fs.mkdirs(new Path("/user/intflag/test"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    
    2.5 HDFS文件夹删除
    /**
     * 删除HDFS上的文件夹
     */
    @Test
    public void deleteDirAtHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 删除文件夹
        try {
            //fs.delete(new Path("/user/intflag/test"));
            fs.delete(new Path("/user/intflag/test"),true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    
    2.6 HDFS文件名更改
    /**
     * 重命名HDFS上的文件夹
     */
    @Test
    public void renameDirAtHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 重命名文件夹
        try {
            fs.rename(new Path("/user/intflag/test"), new Path("/user/intflag/test22"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    
    2.7 HDFS文件详情查看
    /**
     * 读取HDFS上的文件信息
     */
    @Test
    public void readFileAtHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 读取文件信息
        try {
            RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
            while (listFiles.hasNext()) {
                LocatedFileStatus status = listFiles.next();
                System.out.println("-----------------------------------");
                System.out.println("文件名称:"+status.getPath().getName());
                System.out.println("块的大小:"+status.getBlockSize());
                System.out.println("内容长度:"+status.getLen());
                System.out.println("文件权限:"+status.getPermission());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    
    -----------------------------------
    文件名称:asd.txt
    块的大小:134217728
    内容长度:34
    文件权限:rw-r--r--
    -----------------------------------
    文件名称:hadoop-2.7.2.tar.gz
    块的大小:134217728
    内容长度:197657687
    文件权限:rw-r--r--
    -----------------------------------
    文件名称:liugx.txt
    块的大小:134217728
    内容长度:64
    文件权限:rw-r--r--
    -----------------------------------
    文件名称:x3.000
    块的大小:134217728
    内容长度:592
    文件权限:rw-r--r--
    
    Process finished with exit code 0
    
    2.8 HDFS文件夹查看
    /**
     * 读取文件夹信息
     */
    @Test
    public void readFfolderAtHDFS() {
        // 1 获取文件系统
        FileSystem fs = getFileSystem();
        // 2 读取文件夹信息
        try {
            FileStatus[] listStatus = fs.listStatus(new Path("/user/intflag/"));
            for (FileStatus status : listStatus) {
                if (status.isFile()) {
                    System.out.println("f----"+status.getPath().getName());
                } else {
                    System.out.println("d----"+status.getPath().getName());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3 关闭资源
            closeFileSystem(fs);
        }
    }
    

    3 通过IO流操作HDFS

    3.1 HDFS文件上传
    /**
     * 文件上传到HDFS
     */
    @Test
    public void putFileToHDFS() {
        // 1 获取HDFS
        FileSystem fs = getFileSystem();
    
        try {
            // 2 获取输出流
            FSDataOutputStream fos = fs.create(new Path("/user/intflag/input/x3.000"));
            // 3 获取输入流
            FileInputStream fis = new FileInputStream(new File("D:/test/x3.000"));
            // 4 流对接
            IOUtils.copyBytes(fis, fos, new Configuration());
            // 5 关闭流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5 关闭资源
            closeFileSystem(fs);
        }
    }
    
    3.2 HDFS文件下载
    /**
     * 下载文件
     */
    @Test
    public void getFileFromHDFS() {
        // 1 获取HDFS
        FileSystem fs = getFileSystem();
    
        try {
            // 2 获取输入流
            FSDataInputStream fis = fs.open(new Path("/user/intflag/input/liugx.txt"));
    
            // 3 获取输出流
            FileOutputStream fos = new FileOutputStream(new File("D:/test/liugx.txt"));
    
            // 4 流对接
            IOUtils.copyBytes(fis, fos, new Configuration());
            // 5 关闭流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5 关闭资源
            closeFileSystem(fs);
        }
    }
    
    3.3 定位文件读取

    下载第一块

    /**
     * 下载大文件-下载第一块
     */
    @Test
    public void getFileFromHDFSSeek1() {
        // 1 获取HDFS
        FileSystem fs = getFileSystem();
    
        try {
            // 2 获取输入流
            FSDataInputStream fis = fs.open(new Path("/user/intflag/input/hadoop-2.7.2.tar.gz"));
    
            // 3 获取输出流
            FileOutputStream fos = new FileOutputStream(new File("D:/test/hadoop-2.7.2.tar.gz.part1"));
    
            // 4 流对接(只读取128m)
            byte[] buff = new byte[1024];
            //1024 * 1024 * 128
            int len = 1024 * 128;
            for (int i = 0; i < len; i++) {
                fis.read(buff);
                fos.write(buff);
            }
            // 5 关闭流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5 关闭资源
            closeFileSystem(fs);
        }
    }
    

    下载第二块

    /**
     * 下载大文件-下载第二块
     */
    @Test
    public void getFileFromHDFSSeek2() {
        // 1 获取HDFS
        FileSystem fs = getFileSystem();
    
        try {
            // 2 获取输入流
            FSDataInputStream fis = fs.open(new Path("/user/intflag/input/hadoop-2.7.2.tar.gz"));
    
            // 3 获取输出流
            FileOutputStream fos = new FileOutputStream(new File("D:/test/hadoop-2.7.2.tar.gz.part2"));
    
            // 4 流对接(只读取128m)
            // 定位到128m
            int len = 1024 * 1024 * 128;
            fis.seek(len);
            IOUtils.copyBytes(fis,fos,new Configuration());
    
            // 5 关闭流
            IOUtils.closeStream(fis);
            IOUtils.closeStream(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5 关闭资源
            closeFileSystem(fs);
        }
    }
    

    合并文件

    打开DOS窗口,定位到下载后的位置,输入以下命令合并文件
    type hadoop-2.7.2.tar.gz.part2 >> hadoop-2.7.2.tar.gz.part1
    然后重命名文件hadoop-2.7.2.tar.gz.part1,将文件.part1去掉
    打开文件验证
    
  • 相关阅读:
    Android开发 ViewConfiguration View的配置信息类
    Android 开发 倒计时功能 转载
    Android 开发 关于7.0 FileUriExposedException异常 详解
    Android 开发 实现文本搜索功能
    Android 开发 Activity里获取View的宽度和高度 转载
    Android 开发 存储目录的详解
    Android 开发 Fresco框架点击小图显示全屏大图实现 ZoomableDraweeView
    Android 开发 将window变暗
    Android 开发 DisplayMetrics获取Android设备的屏幕高宽与其他信息
    Android 开发 DP、PX、SP转换详解
  • 原文地址:https://www.cnblogs.com/intflag/p/10097457.html
Copyright © 2011-2022 走看看