行业资讯 2025年08月6日
0 收藏 0 点赞 203 浏览 3823 个字
摘要 :

文章目录 准备 代码实现 1、创建Maven项目 2、添加依赖 2、创建测试类 准备 使用Java API操作HDFS中文件主要涉及如下几个类: 1)Configuration类:该类的对象封装了客……




  • 准备
  • 代码实现
    • 1、创建Maven项目
    • 2、添加依赖
    • 2、创建测试类

    准备

    使用Java API操作HDFS中文件主要涉及如下几个类:
    1)Configuration类:该类的对象封装了客户端或者服务器的配置。
    2)FileSystem 类:该类的对象是一个文件系统对象,可以用该对象的一些方法对文件进行操作。FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
    3)FSDatalnputStream FSDataOutputStream:这两个类是HDFS中的输入/输出流,分别通过FileSystem的open 方法和create方法获得。

    代码实现

    以下我们会通过实例代码来介绍如何利用Java API进行文件夹的创建、文件列表显示、文件上传的文件下载的操作。

    1、创建Maven项目

    我们基于Maven创建一个java项目,使用的archetype为maven-archetype-quickstart,在此不再赘述

    2、添加依赖

    我们在pom.xml中添加HDFS操作的相关依赖(依赖版本尽量与安装的hadoop版本一致),如下:

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>3.2.1</version>
    </dependency>
    

    2、创建测试类

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    /**
     * <h3>hdfs</h3>
     *
     * @author panziye
     * @description <p></p>
     * @date 2021-04-22 12:30
     **/
    public class TestHDFS {
        //1.创建文件夹
        public static void createFloder(){
            //定义一个配置对象
            Configuration conf = new Configuration();
            try {
                //URI对象通过使用HDFS协议指定HDFS文件系统配置的节点地址,ip可换为主机映射名
                URI uri = new URI("hdfs://192.168.55.100:9820");
                //根据配置信息获取文件系统对象
                FileSystem fs = FileSystem.get(uri, conf);
                //在指定路径下创建文件夹
                Path path = new Path("/yunpan");
                fs.mkdirs(path);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //2.上传文件
        public static void uploadFile(){
            //定义一个配置对象
            Configuration conf = new Configuration();
            try {
                //URI对象
                URI uri = new URI("hdfs://192.168.55.100:9820");
                //根据配置信息获取文件系统对象
                FileSystem fs = FileSystem.get(uri, conf);
                //定义文件的路径和上传路径
                Path src = new Path("D://hello.txt");
                Path dest = new Path("/yunpan/hello.txt");
                //从本地上传到文件服务器上
                fs.copyFromLocalFile(src,dest);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //3.递归显示文件
        public static void listFile(Path path){
            //定义一个配置对象
            Configuration conf = new Configuration();
            try {
                //URI对象
                URI uri = new URI("hdfs://192.168.55.100:9820");
                //根据配置信息获取文件系统对象
                FileSystem fs = FileSystem.get(uri, conf);
                // true 表示递归查找 ; false 表示不进行递归查找
                RemoteIterator<LocatedFileStatus> iterator = fs.listFiles(path, true);
                while (iterator.hasNext()){
                    LocatedFileStatus next = iterator.next();
                    System.out.println("当前文件路径是:"+next.getPath());
                }
                System.out.println("-------------------------------------");
                //将给定path路径下的所有文件元数据放到一个FileStatus的数组中
                //FileStatus对象封装了文件和目录的元数据,包括文件长度、块大小、权限等
                final FileStatus[] fileStatusArray = fs.listStatus(path);
                for (int i = 0; i < fileStatusArray.length; i++) {
                    FileStatus fileStatus = fileStatusArray[i];
                    System.out.println(fileStatus.getPath());
                }
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //4.下载文件
        public static void downloadFile(){
            //定义一个配置对象
            Configuration conf = new Configuration();
            try {
                //URI对象
                URI uri = new URI("hdfs://192.168.55.100:9820");
                //根据配置信息获取文件系统对象
                FileSystem fs = FileSystem.get(uri, conf);
                //定义下载文件的路径和本地存放路径
                Path src = new Path("/yunpan/hello.txt");
                Path dest = new Path("E://hello.txt");
                //从文件服务器下载到本地
                fs.copyToLocalFile(src,dest);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        //main方法
        public static void main(String[] args) {
            //设置操作用户
            System.setProperty("HADOOP_USER_NAME","hadoop");
            //1.创建新文件夹
            //createFloder();
    
            //2.上传文件
            //uploadFile();
    
            //3.递归显示文件
            //listFile(new Path("/"));
    
            //4.下载文件
            downloadFile();
        }
    }
    

    注意:
    1)如果报错org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator,请参考:

    解决org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator

    我们在使用Java API操作HDFS时如果出现如下错误提示: 表明我们没有使用正确的用户操作HDFS,即没有 […]

    2)下载文件如果报错 java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset请参考:

    解决java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset

    我们在使用Java API测试从Liunx上HDFS中下载文件到本地windows系统时,发现会包如下错误: […]

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/7923.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号