hadoop02_HDFS的API操作

news/2024/5/20 0:49:19 标签: hdfs, hadoop, 大数据

HDFS的API操作

1 HDFS 核心类简介

Configuration类:处理HDFS配置的核心类。

FileSystem类:处理HDFS文件相关操作的核心类,包括对文件夹或文件的创建,删除,查看状态,复制,从本地挪动到HDFS文件系统中等。

Path类:处理HDFS文件路径。

IOUtils类:处理HDFS文件读写的工具类。

2 HDFS文件处理类FileSystem的核心方法介绍:

1. FileSystem get(URI uri, Configuration conf)

根据HDFSURI和配置,创建FileSystem实例


2. public boolean mkdirs(Path f) throws IOException

根据路径创建HDFS文件夹


3. FSDataOutput Stream create(Path f, boolean overwrite)

根据具体的路径创建文件,并且知名是否以重写的方式


4. abstract boolean delete(Path f, boolean recursive)

根据路径删除文件


5. abstract FileStatus[] listStatus(Path f)

根据路径,返回该路径下所有文件夹或文件的状态。


6. Void moveFromLocalFile(Path src, Path dst)

将本地路径下的文件,挪动到HDFS的指定路径下


7. FSDataInputStream open(Path f)

打开指定路径下的文件内容

3 执行流程

maven依赖

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>3.3.2</version>
        </dependency>
        
    </dependencies>

hdfs___92">hdfs 创建文件夹

   public static void main(String[] args) throws IOException, Exception, URISyntaxException {

        Configuration conf = new Configuration();
//		conf.set("fs.defaultFS", "hdfs://hadoop102:9000");

        // 1 获取hdfs客户端对象
//		FileSystem fs = FileSystem.get(conf );
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf, "root");


        // 2 在hdfs上创建路径
        fs.mkdirs(new Path("/dir01/"));

        // 3 关闭资源
        fs.close();

        System.out.println("over");
    }

1 HDFS文件上传(测试参数优先级)


    // 1 文件上传
    @Test
    public void testCopyFromLocalFile() throws IOException, InterruptedException, URISyntaxException{

        // 1 获取fs对象
        Configuration conf = new Configuration();
        conf.set("dfs.replication", "2");
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf , "root");

        // 2 执行上传API
        fs.copyFromLocalFile(new Path("e:/info.txt"), new Path("/file1.txt"));

        // 3 关闭资源
        fs.close();
    }

2 HDFS文件下载

  // 2 文件下载
    @Test
    public void testCopyToLocalFile() throws URISyntaxException, IOException, InterruptedException {

        // 1 获取对象
        Configuration conf = new Configuration();
       // conf.set("dfs.replication", "2");
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf , "root");

        // 2 执行下载操作
//		fs.copyToLocalFile(new Path("/banhua.txt"), new Path("e:/banhua.txt"));
        fs.copyToLocalFile(false, new Path("/file1.txt"), new Path("e:/file2.txt"), true);

        // 3 关闭资源
        fs.close();
    }

3 HDFS文件夹删除

// 3 文件删除
    @Test
    public void testDelete() throws IOException, InterruptedException, URISyntaxException{

        // 1 获取对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf , "root");

        // 2 文件删除
        fs.delete(new Path("/dir01"), true);

        // 3 关闭资源
        fs.close();
    }

4 HDFS文件名更改

// 4 文件更名
    @Test
    public void testRename() throws IOException, InterruptedException, URISyntaxException{

        // 1 获取对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf , "root");

        // 2 执行更名操作
        fs.rename(new Path("/file1.txt"), new Path("/file111.txt"));

        // 3 关闭资源
        fs.close();
    }

5 HDFS文件详情查看

查看文件名称、权限、长度、块信息

// 5 文件详情查看
    @Test
    public void testListFiles() throws IOException, InterruptedException, URISyntaxException{

        // 1 获取对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf , "root");

        // 2 查看文件详情
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

        while(listFiles.hasNext()){
            LocatedFileStatus fileStatus = listFiles.next();

            // 查看文件名称、权限、长度、块信息
            System.out.println(fileStatus.getPath().getName());// 文件名称
            System.out.println(fileStatus.getPermission());// 文件权限
            System.out.println(fileStatus.getLen());// 文件长度

            BlockLocation[] blockLocations = fileStatus.getBlockLocations();

            for (BlockLocation blockLocation : blockLocations) {

                String[] hosts = blockLocation.getHosts();

                for (String host : hosts) {
                    System.out.println(host);
                }
            }

            System.out.println("------ok分割线--------");
        }

        // 3 关闭资源
        fs.close();
    }

6 HDFS文件和文件夹判断

// 6 判断是文件还是文件夹
    @Test
    public void testListStatus() throws IOException, InterruptedException, URISyntaxException{

        // 1 获取对象
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), conf , "root");

        // 2 判断操作
        FileStatus[] listStatus = fs.listStatus(new Path("/"));

        for (FileStatus fileStatus : listStatus) {

            if (fileStatus.isFile()) {
                // 文件
                System.out.println("f:"+fileStatus.getPath().getName());
            }else{
                // 文件夹
                System.out.println("d:"+fileStatus.getPath().getName());
            }
        }

        // 3 关闭资源
        fs.close();
    }

4 HDFS的I/O流操作

上面我们学的API操作HDFS系统都是框架封装好的。那么如果我们想自己实现上述API的操作该怎么实现呢?
我们可以采用IO流的方式实现数据的上传和下载。

1 HDFS文件上传

1.需求:把本地e盘上的banhua.txt文件上传到HDFS根目录
2.编写代码

@Test
    public void putFileToHDFS() throws IOException, InterruptedException, URISyntaxException {

        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), configuration, "root");

        // 2 创建输入流
        FileInputStream fis = new FileInputStream(new File("e:/hahaha.txt"));

        // 3 获取输出流
        FSDataOutputStream fos = fs.create(new Path("/hahaha.txt"));

        // 4 流对拷
        IOUtils.copyBytes(fis, fos, configuration);

        // 5 关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }

2 HDFS文件下载

1.需求:从HDFS上下载banhua.txt文件到本地e盘上
2.编写代码

@Test
    public void getFileFromHDFS() throws IOException, InterruptedException, URISyntaxException{

        // 1 获取文件系统
        Configuration configuration = new Configuration();
        FileSystem fs = FileSystem.get(new URI("hdfs://node1:9820"), configuration, "root");

        // 2 获取输入流
        FSDataInputStream fis = fs.open(new Path("/jinan/info/lenovo/hello.txt"));

        // 3 获取输出流
        FileOutputStream fos = new FileOutputStream(new File("e:/hello.txt"));

        // 4 流的对拷
        IOUtils.copyBytes(fis, fos, configuration);

        // 5 关闭资源
        IOUtils.closeStream(fos);
        IOUtils.closeStream(fis);
        fs.close();
    }

http://www.niftyadmin.cn/n/5281405.html

相关文章

万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&…

搜维尔科技:关于“第九届元宇宙数字人设计大赛”线上+线下巡回宣讲本周高校行程通告!

为了让大家更全面地了解此次大赛&#xff0c;顺利地进行大赛的报名和参赛&#xff0c;组委会遴选了一批优秀讲师代表&#xff0c;组建了宣讲团&#xff0c;以线上线下的方式陆续开展巡回宣讲。宣讲兼顾不同学生群体的需求&#xff0c;结合在数字人设计制作的过程中常见的疑难点…

虚拟机多开怎么设置不同IP?虚拟机设置独立IP的技巧

随着虚拟化技术的不断发展&#xff0c;虚拟机已经成为了许多人的必备工具。在虚拟机中&#xff0c;我们可以轻松地创建多个虚拟机&#xff0c;并在每个虚拟机中设置不同的IP地址。下面&#xff0c;我们将介绍如何在虚拟机中设置独立IP地址的方法。 一、虚拟机多开设置不同IP的方…

C/C++ 使用 MySQL API 进行数据库操作

C/C 使用 MySQL API 进行数据库操作 一、前言 随着信息时代的到来&#xff0c;数据库的应用日益广泛&#xff0c;MySQL 作为开源的关系型数据库管理系统&#xff0c;被广大开发者所喜爱。在 C/C 程序中&#xff0c;我们可以通过 MySQL 提供的 API 接口来连接数据库&#xff0…

如何使用kali来进行一次ddos攻击

本文章用于记录自己的学习路线&#xff0c;不用于其他任何途径! ! ! 哈喽啊&#xff01;又是好久不见&#xff0c;本博主在之前发过一个ddos攻击的介绍。 emm…虽然那篇文章也提到了ddos攻击的方式&#xff0c;但太过于简陋&#xff0c;好像也没有什么用&#xff0c;so&#…

refusing to merge unrelated histories如何解决git冲突

当使用git merge命令合并分支时&#xff0c;如果Git检测到分支之间存在不相关的提交历史记录&#xff0c;它会给出refusing to merge unrelated histories错误。这种情况下&#xff0c;可以通过以下几种方法解决冲突。 强制合并&#xff1a;使用git merge命令时&#xff0c;加…

Linux下统计多线程应用程序CPU 核心绑定信息

文章目录 自定义多线程压缩打包脚本 Linux下统计多线程应用程序CPU 核心绑定信息 对于高性能应用程序尤其是计算资源密集型应用通常通过cpu 核绑定&#xff08;即CPU 亲和性affinity &#xff09;避免操作系统动态分配核心&#xff0c;来提升CPU利用率&#xff0c;提升应用程序…

理解计算机中的中断与中断处理

计算机系统是一个高度并发的环境&#xff0c;处理各种任务和事件。为了有效地响应硬件和软件引起的特殊事件&#xff0c;计算机引入了一种叫做中断的机制。 什么是中断&#xff1f; 中断是一种通知机制&#xff0c;用于向计算机处理器表示发生了特殊事件&#xff0c;需要处理器…