Hadoop学习总结(使用Java API操作HDFS)

news2024/11/27 22:40:36

      使用Java API操作HDFS,是在安装和配置Maven、IDEA中配置Maven成功情况下进行的,如果Maven安装和配置不完全将不能进行Java API操作HDFS。

      由于Hadoop是使用Java语言编写的,因此可以使用Java API操作Hadoop文件系统。使用HDFS提供的Java API构造一个访问客户端对象,然后通过客户端对象对HDFS上的文件进行操作(增、删、改、查)。

      可以使用单元测试法操作HDFS。这里不使用单元测试法。

一、创建HDFS_CRUD.java文件

二、初始化客户端对象

      通过 main() 方法调用进行HDFS增、删、改、查

public class HDFS_CRUD {
    public static void main(String[] args) throws IOException {
        // 初始化客户端对象
        //构造一个配置对象,设置一个参数:访问的 HDFS 的 URL
        Configuration conf = new Configuration();
        //这里指定使用的是 HDFS
        conf.set("fs.defaultFS", "hdfs://hadoop00:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME", "root");
        //通过 FileSystem 的静态方法获取文件系统客户端对象
        fs = FileSystem.get(conf);  //抛出异常
        System.out.println("hdfs连接成功");
    }

}

三、本地上传文件到HDFS

static FileSystem fs = null;

      声明了一个静态的FileSystem对象fs,并将其初始化为null。FileSystem是Java中用于操作Hadoop分布式文件系统(HDFS)的类。通过这个对象,可以执行一些与HDFS相关的操作,如创建文件、删除文件、读取文件等。在这段代码中,fs被声明为静态的,意味着它可以在整个类中被共享和访问。初始值为null,可能是因为在代码的其他部分会对其进行初始化。

      下面对上传功能进行编译

// 完成上传功能
    public static void upload(String path_str,String path_str1) throws IOException {
        //上传文件到HDFS
        //path_str本地文件路径  path_str1是上传到HDFS文件路径
        fs.copyFromLocalFile(new Path(path_str),new Path(path_str1));
        // 关闭资源
        fs.close();
        System.out.println("文件上传成功");
    }
//main()方法中调用
        upload("D:/大数据/word.txt","/input");  //上传

四、从HDFS下载文件到本地

// 完成下载文件
    public static void downloal(String path_str,String path_str1) throws IOException {
        //从 HDFS 下载文件到本地
        //path_str是HDFS文件路径  path_str1本地文件路径
        fs.copyToLocalFile(new Path(path_str),new Path(path_str1));
        // 关闭资源
        fs.close();
        System.out.println("文件下载成功");
    }
​
//main()方法中调用
        downloal("/data.txt","D:/大数据/文件");  //下载

五、创建目录

    // 创建目录
    public static void mkdir(String path_str) throws IOException {
        //path_str所要创建目录路径
        fs.mkdirs(new Path(path_str));
        // 关闭资源
        fs.close();
        System.out.println("创建目录成功");
    }
        //main()方法中调用
        mkdir("/input");  //创建目录

六、重命名文件或文件夹

    // 重命名文件夹
    public static void rename(String old_name,String new_path) throws IOException {
        //old_name原文件名路径  //new_path新文件名路径
        fs.rename(new Path(old_name),new Path(new_path));
        fs.close();
        System.out.println("重命名文件夹成功");
    }
    //main()方法中调用
    rename("/aa","/aa2");  //重命名文件夹

七、删除文件

    // 删除文件 ,如果是非空文件夹,参数2必须给值true
    public static void delete(String path_str) throws IOException {
        //ture表示递归删除 可以用来删除目录 rm -rf
        //false表示非递归删除
        fs.delete(new Path(path_str),true);
        // 关闭资源
        fs.close();
        System.out.println("删除文件夹成功");
    }
        //main()方法中调用
        delete("/aa2");  //删除文件

八、查看文件信息

1、查看文件信息

    // 查看文件信息
    public static void  listFiles(String path_str) throws IOException {
        //获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
        //遍历
        while (listFiles.hasNext()){
            LocatedFileStatus fileStatus = listFiles.next();
            //打印当前文件名
            System.out.println(fileStatus.getPath().getName());
            //打印当前文件块大小
            System.out.println(fileStatus.getBlockLocations());
            //打印当前文件权限
            System.out.println(fileStatus.getPermission());
            //打印当前文件内容长度
            System.out.println(fileStatus.getLen());
            //获取该文件块信息(包含长度、数据块、datanode的信息)
//            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
//            for (BlockLocation bl : blockLocations){
//                System.out.println("block-length:" + bl.getLength()+"--"+"block-offset:"+bl.getOffset());
//                String[] hosts = bl.getHosts();
//                for (String host : hosts){
//                    System.out.println(host);
//                }
//            }
        }
        System.out.println("--------分割线---------");
        fs.close();
    }
        //main()方法中调用
        listFiles("/data.txt");  //查看文件信息

2、统计目录下所有文件(包括子目录)

    // 1、统计目录下所有文件(包括子目录)
    // 1、统计某个路径(由main方法决定哪个路径),下所有的文件数里,例如:输出:该路径下共有 3 个文件
    public static void count(String path_str) throws IOException {
        //获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
        //遍历
        int count = 0;
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            count++;
        }
        System.out.println("路径:【"+ path_str +"】下,文件数量为"+count);
        fs.close();
    }
        //main()方法中调用
        count("/");  //统计

 3、列出某个路径下所有的文件数里

    // 2、列出某个路径(由main方法决定哪个路径),下所有的文件数里,例如:文件1,文"路径:【"+ path_str +"】下,文件有:"+件2,....
    public static void fileList(String path_str) throws IOException {
        //获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
        String res = "";
        //遍历
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            res += fileStatus.getPath().getName() + ", ";
        }
        if (res.equals("")){
            res = "没有文件";
        }else {
            res = res.substring(0,res.length() - 2);
        }
        System.out.println("路径:【"+ path_str +"】下的文件:" + res);
//        fs.close();
    }
        //main()方法中调用
          fileList("/"); //查看有什么文件
          fileList("/input"); //查看有什么文件

4、查看所有文件

/*    路径【/】下共有 7 子文件
    文件数量:1,文件列表:data.txt
    目录数量:6,文件列表:a, exp, input, output, test, tmp*/
    public static void list(String path) throws IOException {
        FileStatus[] fileStatuses = fs.listStatus(new Path(path));
        String res = "路径【" + path + "】下共有 " + fileStatuses.length + " 子文件";
        int file_num = 0;
        String file_list = "";
        int dir_num = 0;
        String dir_list = "";
        for (FileStatus fileStatus:fileStatuses){
            if (fileStatus.isFile()){
                file_num ++;
                file_list += fileStatus.getPath().getName() + ", ";
            }else {
                dir_num ++;
                dir_list += fileStatus.getPath().getName() + ", ";
            }
        }
        if (file_num != 0) res += "\n\t文件数量:" + file_num + ",文件列表:" + file_list.substring(0,file_list.length()-2);
        if (dir_num != 0) res += "\n\t目录数量:" + dir_num + ",文件列表:" + dir_list.substring(0,dir_list.length()-2);
        System.out.println(res);
    }
        //main()方法中调用
        list("/"); //查看所有

5、判断是文件还是目录

    // 检查路径是目录还是文件
    public static void mulu(String path_str) throws IOException {
        Path path = new Path(path_str);
        // 判断路径是否存在
        if (fs.exists(path)) {
            // 获取指定路径的详细信息
            FileStatus status = fs.getFileStatus(path);
            if (status.isDirectory()) {
                System.out.println(path + "这是一个目录");
            } else if (status.isFile()) {
                System.out.println(path + "这是一个文件");
            } else {
                System.out.println("这是一个未知类型");
            }
        } else {
            System.out.println("路径不存在");
        }
        //关闭资源
        fs.close();
    }
        //main()方法中调用
        mulu("/exp/word.txt"); //检查路径是目录还是文件

九、源代码

package com.itcast.hdfsdemo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
import sun.tracing.dtrace.DTraceProviderFactory;

import java.io.IOException;
import java.util.Arrays;

public class HDFS_CRUD {

    static FileSystem fs = null;

    // 完成上传功能
    public static void upload(String path_str,String path_str1) throws IOException {
        //上传文件到HDFS
        //path_str本地文件路径  path_str1是上传到HDFS文件路径
        fs.copyFromLocalFile(new Path(path_str),new Path(path_str1));
        // 关闭资源
        fs.close();
        System.out.println("文件上传成功");
    }

    // 完成下载文件
    public static void downloal(String path_str,String path_str1) throws IOException {
        //从 HDFS 下载文件到本地
        //path_str是HDFS文件路径  path_str1本地文件路径
        fs.copyToLocalFile(new Path(path_str),new Path(path_str1));
        // 关闭资源
        fs.close();
        System.out.println("文件下载成功");
    }

    // 创建目录
    public static void mkdir(String path_str) throws IOException {
        //path_str所要创建目录路径
        fs.mkdirs(new Path(path_str));
        // 关闭资源
        fs.close();
        System.out.println("创建目录成功");
    }

    // 重命名文件夹
    public static void rename(String old_name,String new_path) throws IOException {
        //old_name原文件名路径  //new_path新文件名路径
        fs.rename(new Path(old_name),new Path(new_path));
        // 关闭资源
        fs.close();
        System.out.println("重命名文件夹成功");
    }
    //main()方法中调用
//    rename("/aa","/aa2");  //重命名文件夹

    // 删除文件 ,如果是非空文件夹,参数2必须给值true
    public static void delete(String path_str) throws IOException {
        //ture表示递归删除 可以用来删除目录 rm -rf
        //false表示非递归删除
        fs.delete(new Path(path_str),true);
        // 关闭资源
        fs.close();
        System.out.println("删除文件夹成功");
    }

    // 查看文件信息
    public static void  listFiles(String path_str) throws IOException {
        //获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
        //遍历
        while (listFiles.hasNext()){
            LocatedFileStatus fileStatus = listFiles.next();
            //打印当前文件名
            System.out.println(fileStatus.getPath().getName());
            //打印当前文件块大小
            System.out.println(fileStatus.getBlockLocations());
            //打印当前文件权限
            System.out.println(fileStatus.getPermission());
            //打印当前文件内容长度
            System.out.println(fileStatus.getLen());
            //获取该文件块信息(包含长度、数据块、datanode的信息)
//            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
//            for (BlockLocation bl : blockLocations){
//                System.out.println("block-length:" + bl.getLength()+"--"+"block-offset:"+bl.getOffset());
//                String[] hosts = bl.getHosts();
//                for (String host : hosts){
//                    System.out.println(host);
//                }
//            }
        }
        System.out.println("--------分割线---------");
        fs.close();
    }
    //把查看文件信息分解为下面几个方法
    // 1、统计目录下所有文件(包括子目录)
    // 1、统计某个路径(由main方法决定哪个路径),下所有的文件数里,例如:输出:该路径下共有 3 个文件
    public static void count(String path_str) throws IOException {
        //获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
        //遍历
        int count = 0;
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            count++;
        }
        System.out.println("路径:【"+ path_str +"】下,文件数量为"+count);
        fs.close();
    }

    // 2、列出某个路径(由main方法决定哪个路径),下所有的文件数里,例如:文件1,文"路径:【"+ path_str +"】下,文件有:"+件2,....
    public static void fileList(String path_str) throws IOException {
        //获取迭代器对象
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path(path_str),true);
        String res = "";
        //遍历
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            res += fileStatus.getPath().getName() + ", ";
        }
        if (res.equals("")){
            res = "没有文件";
        }else {
            res = res.substring(0,res.length() - 2);
        }
        System.out.println("路径:【"+ path_str +"】下的文件:" + res);
//        fs.close();
    }

/*    路径【/】下共有 7 子文件
    文件数量:1,文件列表:data.txt
    目录数量:6,文件列表:a, exp, input, output, test, tmp*/
    public static void list(String path) throws IOException {
        FileStatus[] fileStatuses = fs.listStatus(new Path(path));
        String res = "路径【" + path + "】下共有 " + fileStatuses.length + " 子文件";
        int file_num = 0;
        String file_list = "";
        int dir_num = 0;
        String dir_list = "";
        for (FileStatus fileStatus:fileStatuses){
            if (fileStatus.isFile()){
                file_num ++;
                file_list += fileStatus.getPath().getName() + ", ";
            }else {
                dir_num ++;
                dir_list += fileStatus.getPath().getName() + ", ";
            }
        }
        if (file_num != 0) res += "\n\t文件数量:" + file_num + ",文件列表:" + file_list.substring(0,file_list.length()-2);
        if (dir_num != 0) res += "\n\t目录数量:" + dir_num + ",文件列表:" + dir_list.substring(0,dir_list.length()-2);
        System.out.println(res);
    }

    // 检查路径是目录还是文件
    public static void mulu(String path_str) throws IOException {
        Path path = new Path(path_str);
        // 判断路径是否存在
        if (fs.exists(path)) {
            // 获取指定路径的详细信息
            FileStatus status = fs.getFileStatus(path);
            if (status.isDirectory()) {
                System.out.println(path + "这是一个目录");
            } else if (status.isFile()) {
                System.out.println(path + "这是一个文件");
            } else {
                System.out.println("这是一个未知类型");
            }
        } else {
            System.out.println("路径不存在");
        }
        //关闭资源
        fs.close();
    }

        //调用
    public static void main(String[] args) throws IOException {
        // 初始化客户端对象
        //构造一个配置对象,设置一个参数:访问的 HDFS 的 URL
        Configuration conf = new Configuration();
        //这里指定使用的是 HDFS
        conf.set("fs.defaultFS","hdfs://hadoop00:9000");
        //通过如下的方式进行客户端身份的设置
        System.setProperty("HADOOP_USER_NAME","root");
        //通过 FileSystem 的静态方法获取文件系统客户端对象
        fs = FileSystem.get(conf);  //抛出异常
        System.out.println("hdfs连接成功");
        
        //main()方法中调用
//        list("/"); //查看所有
        //main()方法中调用
//          fileList("/"); //查看有什么文件
//          fileList("/input"); //查看有什么文件
        //main()方法中调用
//        count("/");  //统计
        //main()方法中调用
//        mulu("/exp/word.txt"); //检查路径是目录还是文件
        //main()方法中调用
//        listFiles("/data.txt");  //查看文件信息
        //main()方法中调用
//        delete("/aa2");  //删除文件
        //main()方法中调用
//        rename("/aa","/aa2");  //重命名文件夹
        //main()方法中调用
//        upload("D:/大数据/word.txt","/input");  //上传
        //main()方法中调用
//        mkdir("/input");  //创建目录
        //main()方法中调用
//        downloal("/data.txt","D:/大数据/文件");  //下载
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工厂设备报修的流程是怎样的?维修流程要如何优化?

在当今高度自动化的生产环境中&#xff0c;工厂设备的正常运行无疑对于企业的生产效率和经济效益具有至关重要的影响。然而&#xff0c;设备故障是生产过程中不可避免的现象。当设备发生故障时&#xff0c;如何快速、有效地进行报修、维修&#xff0c;以恢复设备的正常运转&…

基于SSM的在线作业管理系统 -octopus-master(源码+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

HashMap存值、取值及哈希碰撞原理分析

HashMap中的put()和get()的实现原理&#xff1a; map.put(k,v)实现原理 首先将k,v封装到Node对象当中&#xff08;节点&#xff09;。 然后它的底层会调用K的hashCode()方法得出hash值。 通过哈希表函数/哈希算法&#xff0c;将hash值转换成数组的下标&#xff0c;下标位置上…

纵行科技LPWAN2.0芯片产品ZT1826获“2023年度硬核芯”大奖

2023年10月30日&#xff0c;由深圳市芯师爷科技有限公司主办、慕尼黑华南电子展协办、深圳市半导体行业协会支持的“第五届硬核芯生态大会暨2023汽车芯片技术创新与应用论坛”在深圳国际会展中心1号馆圆满落幕。当晚&#xff0c;“2023年度硬核芯评选”获奖榜单同步揭晓并进行颁…

【C++心愿便利店】No.12---C++之探索string底层实现

文章目录 前言一、写实拷贝&#xff08;了解&#xff09;二、string类常用接口实现2.1 成员变量2.2 默认构造函数2.3 拷贝构造函数2.4 operator2.5 operator[]2.6 c_str2.7 size()2.8 capacity() 三、迭代器的实现3.1 begin()和end()3.2 范围for 四、string类增删查改4.1 reser…

四川芸鹰蓬飞商务信息咨询有限公司电商带货可信吗

今天&#xff0c;我们要向大家介绍的是四川芸鹰蓬飞商务信息咨询有限公司的电商带货服务&#xff0c;一个在电商领域独树一帜的服务项目。它的出现&#xff0c;不仅为电商行业注入了新的活力&#xff0c;也引领了行业发展的新趋势。 一、背景介绍 四川芸鹰蓬飞商务信息咨询有限…

mac 安装使用svn教程

mac 安装使用svn教程 一、安装Homebrew 要在Mac OS上安装SVN&#xff0c;首先需要安装Homebrew。Homebrew是一个流行的包管理器&#xff0c;因此我们将使用它来安装SVN。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…

电子印章怎么弄?三步教你电子印章在线生成免费教程!

在这个数字化快速发展的时代&#xff0c;电子印章已经成为日常商务活动中不可或缺的一部分。相对于传统的实体印章&#xff0c;电子印章具有更高的便捷性和安全性&#xff0c;更是无纸化办公中必不可少的一环。那么&#xff0c;电子印章怎么弄呢&#xff1f;跟着下面这三步来操…

Map and Set

map and set 文章目录 map and set前言搜索树<1> 操作-查找<2> 操作-插入<3> 操作-删除<4> 代码展示<5> 性能分析 Map 和 Set 概念及应用场景Map 和 Set 模型分析Map 的使用<1> Map常用方法说明<3> TreeMap 演示<2> Entry 内部…

[git] cherry pick 将某个分支的某次提交应用到当前分支

功能&#xff1a;将某个分支的某次提交应用到当前分支 应用场景&#xff1a; 在合并分支时&#xff0c;是将源分支的所有内容都合并到目标分支上&#xff0c;有的时候我们可能只需要合并源分支的某次或某几次的提交&#xff0c;这个时候我们就需要使用到git的cherry-pick操作…

超级APP,All in one APP

在信息化时代&#xff0c;企业需要处理的数据和使用的各种系统繁多复杂。然而&#xff0c;传统的应用往往孤立存在&#xff0c;导致数据无法流动和系统无法高效对接。WorkPlus作为一款超级APP&#xff0c;以其全面的功能和强大的集成能力&#xff0c;实现了数据到系统的全方位集…

GitHub Copilot Chat将于12月全面推出;DeepLearning.AI免费新课

&#x1f989; AI新闻 &#x1f680; GitHub Copilot Chat将于12月全面推出&#xff0c;提升开发者的生产力 摘要&#xff1a;GitHub宣布将于12月全面推出GitHub Copilot Chat&#xff0c;这是GitHub Copilot的一个新功能&#xff0c;旨在帮助开发者编写代码。它能够集成到开…

乐优商城(三)品牌管理

1. 品牌的新增 1.1 url 异步请求 点击品牌管理下的新增品牌&#xff0c;填写品牌信息后提交 2.打开浏览器控制台 由此可以得知&#xff1a; 请求方式&#xff1a;POST请求路径&#xff1a;/item/brand请求参数&#xff1a;{name: “测试品牌”, image: “”, cids: “76,32…

【Cocos新手进阶】父级预制体中的数据列表,在子预制体中的控制方法!

本篇文章主要讲解&#xff0c;cocos中在预制体操作过程中&#xff0c;父级预制体生成的数据列表中&#xff0c;绑定了子预制体中的事件&#xff0c;在子预制体的时间中如何控制上级列表的具体操作教程。 日期&#xff1a;2023年11月10日 作者&#xff1a;任聪聪 一、实际效果情…

矩阵起源加入 OpenCloudOS 操作系统开源社区,完成技术兼容互认证

近日&#xff0c;超融合异构云原生数据库 MatrixOne企业版软件 V1.0 完成了与 OpenCloudOS 的相互兼容认证&#xff0c;测试期间&#xff0c;整体运行稳定&#xff0c;在功能、性能及兼容性方面表现良好。 一、产品简介 矩阵起源 MatrixOrigin 致力于建设开放的技术开源社区和…

牛客网:NC69 链表中倒数最后k个结点

一、题目 函数原型&#xff1a; struct ListNode* FindKthToTail(struct ListNode* pHead, int k ) 二、思路 本题需要找到链表中的倒数第k个结点&#xff0c;有两种方法&#xff1a; 1.暴力解法&#xff1a;先遍历一次链表&#xff0c;计算出链表的长度&#xff1b;再遍历一次…

大厂面试题-MySQL索引的优点和缺点?

(图片)索引&#xff0c;是一种能够帮助MySQL高效从磁盘上检索数据的一种数据结构。在MySQL中的InnoDB引擎中&#xff0c;采用了B树的结构来实现索引和数据的存储 MySQL里面的索引的优点有很多&#xff1a; 1. 通过B树的结构来存储数据&#xff0c;可以大大减少数据检索时的磁…

【docker:容器提交成镜像】

容器创建部分请看&#xff1a;点击此处查看我的另一篇文章 容器提交为镜像 docker commit -a "sinwa lee" -m "首页变化" mynginx lxhnginx:1.0docker run -d -p 88:80 --name lxhnginx lxhnginx:1.0为啥没有变啊&#xff0c;首页&#xff1f; 镜像打包 …

CAN总线记录诊断助手 CAN记录仪

随着CAN总线的应用市场越来越多&#xff0c;不仅局限于汽车行业&#xff0c;工程车、特种车、消防、医疗等多行业都是以CAN总线通讯为主。总线的调试诊断也成为技术日常工作&#xff0c;有个好的工具能有效帮助发现问题、解决问题。 来可电子的CANLog-VCI是一款即插即用的CAN数…

从零开始:集成视频直播美颜SDK的步骤及注意事项

如果你是一位开发者&#xff0c;想要为你的视频直播应用添加美颜功能&#xff0c;那么你来对地方了。本文将从零开始&#xff0c;介绍集成视频直播美颜SDK的步骤及需要注意的事项&#xff0c;帮助你顺利实现这一技术目标。 步骤一&#xff1a;选择合适的美颜SDK 在开始之前&…