Hadoop中HDFS的API操作、HDFS文件上传(测试参数优先级)、copyFromLocalFile参数解读、HDFS文件下载、文件更名和移动、删除文件和目录、文件详情查看、文件和文件夹判断

简介: Hadoop中HDFS的API操作、HDFS文件上传(测试参数优先级)、copyFromLocalFile参数解读、HDFS文件下载、文件更名和移动、删除文件和目录、文件详情查看、文件和文件夹判断

@[toc]

7.HDFS的API操作

7.2HDFS的API案例实操

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

在这里插入图片描述
在这里插入图片描述

package com.summer.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @author Redamancy
 * @create 2022-08-15 17:59
 */


public class HdfsClient {
    private FileSystem fs;
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        //创建一个配置文件
        Configuration configuration = new Configuration();
        //用户
        String user = "summer";
        //获取到了客户端对象
        fs = FileSystem.get(uri, configuration,user);
    }
    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }

    @Test
    public void testPut() throws IOException {
        //参数解读:
        // 参数一:表示删除原数据,为true表示上传完文件后,原数据文件将会删除;为false表示上传完文件后,原数据文件将不会删除;
        // 参数二:是否允许覆盖,为true表示不管目的地地址是否有同名的文件都会覆盖;
        // 为false表示目的地地址有同名的文件则报错org.apache.hadoop.fs.PathExistsException: `hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt': Target hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt already exists;
        // 参数三:原数据路径Windows;参数四:目的地路径HDFS
        fs.copyFromLocalFile(false,true,new Path("D:\\sunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huaguoshan"));
    }
}

7.2.1.1copyFromLocalFile参数解读

//参数解读:
        // 参数一:表示删除原数据,为true表示上传完文件后,原数据文件将会删除;为false表示上传完文件后,原数据文件将不会删除;
        // 参数二:是否允许覆盖,为true表示不管目的地地址是否有同名的文件都会覆盖;
        // 为false表示目的地地址有同名的文件则报错org.apache.hadoop.fs.PathExistsException: `hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt': Target hdfs://hadoop102/xiyou/huaguoshan/sunwukong.txt already exists;
        // 参数三:原数据路径Windows;参数四:目的地路径HDFS

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.2.1.2副本个数

在这里插入图片描述

为什么这里的副本有三个,因为在下面设置的
在这里插入图片描述
参数优先级:服务器的自定义配置(hdfs-site.xml) >服务器的默认配置(hdfs-default.xml)

7.2.1.3将hdfs-site.xml拷贝到项目的resources资源目录下

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>dfs.replication</name>
         <value>1</value>
    </property>
</configuration>

在这里插入图片描述

如果创建的文件副本变为了1,则

在这里插入图片描述
在这里插入图片描述

参数优先级:在项目资源目录下的用户自定义配置文件(如在resources下创建的hdfs-site.xml,可以看上面的过程) >服务器的自定义配置(hdfs-site.xml) >服务器的默认配置(hdfs-default.xml)

7.2.1.4客户端代码中设置的值

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
为2,则参数优先级排序:(1)客户端代码中设置的值 >(2)在项目资源目录下的用户自定义配置文件(如在resources下创建的hdfs-site.xml,可以看上面的过程) >(3)服务器的自定义配置(hdfs-site.xml) >(4)服务器的默认配置(hdfs-default.xml)

7.2.2HDFS文件下载

package com.summer.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @author Redamancy
 * @create 2022-08-15 17:59
 */


public class HdfsClient {
    private FileSystem fs;
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        //创建一个配置文件
        Configuration configuration = new Configuration();
        configuration.set("dfs.replication","2");
        //用户
        String user = "summer";
        //获取到了客户端对象
        fs = FileSystem.get(uri, configuration,user);
    }
    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }
    @Test
    public void testGet() throws IOException {
        //参数的解读:参数一:原文件是否删除;参数二:原文件路径HDFS;参数三:目标地址路径Windows;参数四:是否要校验CRC
        fs.copyToLocalFile(false,new Path("hdfs://hadoop102/xiyou/huaguoshan"),new Path("D:\\"),false);
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
CRC文件是一个校验文件,保证文件传输完整。

注意:如果执行上面代码,下载不了文件,有可能是你电脑的微软支持的运行库少,需要安装一下微软运行库。

7.2.3HDFS文件更名和移动

package com.summer.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @author Redamancy
 * @create 2022-08-15 17:59
 */


public class HdfsClient {
    private FileSystem fs;
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        //创建一个配置文件
        Configuration configuration = new Configuration();
        configuration.set("dfs.replication","2");
        //用户
        String user = "summer";
        //获取到了客户端对象
        fs = FileSystem.get(uri, configuration,user);
    }
    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }
    //文件的更名和移动
    @Test
    public void testmv() throws IOException {
        //参数解读:参数一:原文件路径;参数二:目标文件路径
        //对文件名称的修改
        fs.rename(new Path("/testinput/word.txt"),new Path("/testinput/summer.txt"));

        //文件的更名和移动
        fs.rename(new Path("/testinput/summer.txt"),new Path("/after.txt"));
        
        //目录更名
        fs.rename(new Path("/testinput"),new Path("/testoutput"));
    }
}

在这里插入图片描述

7.2.3.1对文件名称的修改

核心代码:

fs.rename(new Path("/testinput/word.txt"),new Path("/testinput/summer.txt"));

在这里插入图片描述

在这里插入图片描述

7.2.3.2文件的更名和移动

核心代码:

 fs.rename(new Path("/testinput/summer.txt"),new Path("/after.txt"));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2.3.3目录更名

核心代码:

fs.rename(new Path("/testinput"),new Path("/testoutput"));

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2.4HDFS删除文件和目录

package com.summer.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * @author Redamancy
 * @create 2022-08-15 17:59
 */


public class HdfsClient {
    private FileSystem fs;
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        //创建一个配置文件
        Configuration configuration = new Configuration();
        configuration.set("dfs.replication","2");
        //用户
        String user = "summer";
        //获取到了客户端对象
        fs = FileSystem.get(uri, configuration,user);
    }
    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }
    //文件删除
    @Test
    public void testRm() throws IOException {
        //参数解读:参数一:要删除的路径;参数二:是否递归删除
        //删除文件
        fs.delete(new Path("/hadoop-3.1.3.tar.gz"),false);

        //删除空目录
        fs.delete(new Path("/xiyou"),false);
        //删除非空目录
        fs.delete(new Path("/jinguo"),true);
    }
}

7.2.4.1删除文件

核心代码:

fs.delete(new Path("/hadoop-3.1.3.tar.gz"),false);

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.2.4.2删除空目录

核心代码:

fs.delete(new Path("/xiyou"),false);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.2.4.3删除非空目录

核心代码:

fs.delete(new Path("/jinguo"),true);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.2.5HDFS文件详情查看

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

//获取文件详细信息
    @Test
    public void fileDetail() throws IOException {

        //获取所有文件信息
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("hdfs://hadoop102/"), 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.getReplication());
            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));
        }

在这里插入图片描述

=============hdfs://hadoop102/after.txt=============
rw-r--r--
summer
3
26
1659793848099
3
134217728
after.txt
[0,26,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/hadoop-3.1.3.tar.gz=============
rw-r--r--
summer
2
338075860
1660640604122
2
134217728
hadoop-3.1.3.tar.gz
[0,134217728,hadoop104,hadoop102, 134217728,134217728,hadoop103,hadoop102, 268435456,69640404,hadoop102,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659955855387_0001/hadoop103_40403=============
rw-r-----
summer
3
66228
1659955977487
3
134217728
hadoop103_40403
[0,66228,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659955855387_0001/hadoop104_43491=============
rw-r-----
summer
3
67455
1659955978021
3
134217728
hadoop104_43491
[0,67455,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659963897517_0001/hadoop102_33697=============
rw-r-----
summer
3
32036
1659969846561
3
134217728
hadoop102_33697
[0,32036,hadoop102,hadoop104,hadoop103]
=============hdfs://hadoop102/tmp/logs/summer/logs-tfile/application_1659963897517_0001/hadoop104_42477=============
rw-r-----
summer
3
103855
1659969846884
3
134217728
hadoop104_42477
[0,103855,hadoop102,hadoop104,hadoop103]

Process finished with exit code 0

7.2.6HDFS文件和文件夹判断

package com.summer.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;

/**
 * @author Redamancy
 * @create 2022-08-15 17:59
 */


public class HdfsClient {
    private FileSystem fs;
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
        //连接的集群nn地址
        URI uri = new URI("hdfs://hadoop102:8020");
        //创建一个配置文件
        Configuration configuration = new Configuration();
        configuration.set("dfs.replication","2");
        //用户
        String user = "summer";
        //获取到了客户端对象
        fs = FileSystem.get(uri, configuration,user);
    }
    @After
    public void close() throws IOException {
        //关闭资源
        fs.close();
    }
    //判断是文件夹还是文件
    @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());
            }
        }
    }
}

在这里插入图片描述

相关文章
|
11月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1219 3
|
12月前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
453 4
|
Web App开发 测试技术 Linux
文件上传测试用例
测试一个文件上传组件,从客户端(Windows操作系统)向服务器端(Linux操作系统)上传一个图片文件(先选择要上传的文件,再点击【上传】按键进行上传),格式必须是JPG、PNG(大小写不敏感),文件大小必须控制在500M之内。上传后图片的名称不发生变化。请设计测试用例,测试这个文件上传组件。以下是针对文件上传组件的测试用例设计,主要涵盖了不同的上传场景,以确保组件在各种情况下都能正常工作
497 1
|
SQL 分布式计算 监控
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
Hadoop-20 Flume 采集数据双写至本地+HDFS中 监控目录变化 3个Agent MemoryChannel Source对比
357 3
|
SQL 分布式计算 关系型数据库
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
Hadoop-13-Hive 启动Hive 修改启动参数命令行启动测试 几句简单的HQL了解Hive
565 2
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
1508 56
|
安全 关系型数据库 MySQL
MySQL8使用物理文件恢复MyISAM表测试
MySQL8使用物理文件恢复MyISAM表测试
358 0
|
分布式计算 Java Hadoop
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
455 1

相关实验场景

更多