• 大数据入门:HDFS API 常规操作


    今天看尚硅谷大海哥的hadoop课程,学习了 HDFS API 的常规操作,虽然很简单,但是对于我这个门外汉来说,这些都属于全新的领域,掌握之后感觉非常的开心,特此记录一下。

    IntelliJ IDEA java 开发用到的几个快捷键

    ctrl+p 提示参数信息(入参)
    Alt+回车 抛出异常(处理红色下划线)
    ctrl+Alt+F 设置全局变量(方法间变量共用)
    ctrl+Alt+L 美化代码
    ().var + 回车 自动补全代码
    ().sout + 回车 自动补全用于打印店代码

    @ 是个神奇的前缀

    IntelliJ IDEA java 开发过程中,@ 是个神奇的前准,可以使用 @ 实现很多意想不到的功能。

    @Before :在执行核心代码之前,执行此方法,常用于初始化。

    @Test:方便我们对一段代码进行测试,说明该方法为测试方法,可以执行。

    @Overwrite :方法重写。

    @After:常用于程序运行完毕之后,关闭资源。

    方法的选择

    在这里插入图片描述

    在这里插入图片描述

    感觉 java 有点特殊(或者是我孤陋寡闻),当尝试选择某函数方法时,会出现很多同名的,我们必须根据其不同的后缀说明或者参数个数来选择某一个(灰色字体),而且必须选择正确。(默认选择第一个)

    如上图所示,可以看出 hdfs 的.copyFromLocalFile(); 函数方法有四种类型的参数,当前第一种下面是灰色的,说明此时选择的是第一种,也就是输入参数是两个。

    API参数的优先级

    不同位置设置的 hdfs API参数的优先级不同:
    1、hdfs-default.xml
    2、hdfs-site.xml
    3、resources 资源目录下的 hdfs-site.xml
    4、程序代码中设置的参数值

    如上几种设置,优先级依次增加,即:
    代码中的参数 > resources 资源目录下的用户自定义文件 > 服务器自定义配置( xxx-site.xml) > 服务器默认配置(xxx-default.xml)

    HDFS API 操作完整代码

    如下是 HDFS API 常规操作的相关代码,包括创建文件夹、上传文件、下载文件、删除文件、文件的更名和移动、获取文件信息详情、判断是文件夹还是文件等。

    package com.omc.hdfs;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    import java.util.Arrays;
    
    /*
     *客户端代码常用套路
     * 1、获取一个客户端对象
     * 2、执行相关的操作命令
     * 3、关闭资源
     * hdfs zookeeper
     * ctrl+p 提示参数
     * Alt+回车,抛出异常
     * ctrl+Alt+F 设置全局变量
     * ctrl+Alt+L 美化代码
     * ().var 回车,自动补全代码
     */
    public class hdfsClient {
    
        private FileSystem fs;
    
        @Before
        public void init() throws URISyntaxException, IOException, InterruptedException {
            // 计划连接的集群的 namenode 地址
            URI uri = new URI("hdfs://hadoop102:8020");
            // 创建一个配置文件
            Configuration configuration = new Configuration();
            // 设置用户
            String user = "omc";
    
            // 获取到客户端对象
            fs = FileSystem.get(uri, configuration, user);
        }
    
        @After
        public void close() throws IOException {
            // 关闭资源
            fs.close();
        }
    
        // 1、创建一个文件夹
        @Test
        public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
            fs.mkdirs(new Path("/xiyou/huoguoshan1"));
        }
    
        // 2、上传文件
        @Test
        public void testPut() throws IOException {
        
            fs.copyFromLocalFile(false, true, new Path("D:/bigdata/sunwukong.txt"), new Path("hdfs://hadoop102/xiyou/huoguoshan"));
        }
    
        // 3、文件下载
        @Test
        public void testGet() throws IOException {
        
            fs.copyToLocalFile(false, new Path("hdfs://hadoop102/xiyou/huoguoshan/sunwukong.txt"), new Path("D:/bigdata/output"), true);
        }
    
        // 4、删除文件
        @Test
        public void testRm() throws IOException {
            // 参数解读:1、要删除的源文件路径,2、是否递归删除
    
            // a、删除文件
            fs.delete(new Path("/xiyou/huoguoshan/sunwukong.txt"), false);
    
            // b、删除空目录
            fs.delete(new Path("/xiyou/huoguoshan1"), false);
    
            // c、删除非空目录
            fs.delete(new Path("/output2"), true);
        }
    
        // 5、文件的更名和移动
        @Test
        public void testMv() throws IOException {
        
            fs.rename(new Path("/wcinput/wordCountTest.txt"), new Path("/wcinput/word.txt"));
        }
    
        // 6、获取文件信息详情
        @Test
        public void fileInfo() throws IOException {
    
            // 获取所有文件信息(参数2 标识是否递归)
            RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
    
            // 遍历迭代器
            while (listFiles.hasNext()) {
                LocatedFileStatus fileStatus = listFiles.next();
    
                System.out.println("============= " + fileStatus.getPath() + " ===================");
                System.out.println("权限:" + fileStatus.getPermission());
                System.out.println("归属用户:" + fileStatus.getOwner());
                System.out.println("归属组:" + fileStatus.getGroup());
                System.out.println("大小:" + fileStatus.getLen());
                System.out.println("最后修改时间:" + fileStatus.getModificationTime());
                System.out.println("副本数:" + fileStatus.getReplication());
                System.out.println("块大小:" + fileStatus.getBlockSize());
                System.out.println("文件名:" + fileStatus.getPath().getName());
    
                // 获取块信息
                BlockLocation[] blockLocations = fileStatus.getBlockLocations();
    
                System.out.println(Arrays.toString(blockLocations));
            }
        }
    
        // 7、判断是文件夹还是文件
        @Test
        public void testFile() throws IOException {
    
            FileStatus[] listStatus = fs.listStatus(new Path("/"));
    
            for (FileStatus status : listStatus) {
    
                if (status.isFile()) {
                    System.out.println("这是文件:" + status.getPath().getName());
                } else {
                    System.out.println("这是目录:" + status.getPath().getName());
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
  • 相关阅读:
    前端调试只会console.log()?
    Web Workers RPC
    React + antd树状结构目录
    【Proteus仿真】【STM32单片机】汽车倒车报警系统设计
    卷积神经网络(CNN)衣服图像分类的实现
    从ContinuousEventTimeTrigger/ContinuousProcessingTimeTrigger代码看如何实现一个自定义的触发器
    支持目标打卡,活力三环让运动更有趣
    Linux环境下不安装DM数据库,编译dmPython
    深入理解Java虚拟机:Jvm性能调优
    深度神经网络为何成功?其中的过程、思想和关键主张选择
  • 原文地址:https://blog.csdn.net/mba1398/article/details/126197776