大数据入门: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());
            }
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值