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

      使用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:/大数据/文件");  //下载
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Delphi 12 重返雅典 (RAD Studio 12)

RAD Studio 12 的新功能&#xff1a; 以最新的平台版本为目标&#xff01; RAD Studio 12 提供对 iOS 17&#xff08;仅适用于 Delphi&#xff09;、Android 14 和 macOS Sonoma 的官方支持。RAD Studio 12 还支持 Ubuntu 22 LTS 和 Windows Server 2022。 Delphi 源代码的多…

小黑子—springMVC:第一章 请求处理与响应数据

springMVC入门1.0 1、小黑子的springMVC基础1.1 SpringMVC概述1.2 SpringMVC快速入门1.3 Controller中直接注入spring中维护的Bean1.4 SpringMVC关键组件浅析 2、SpringMVC的请求处理2.1 请求映射路径配置2.2 请求数据的接收2.2.1 键值对方式接收数据2.2.1 - I RquestParam属性…

华为云Ascend310服务器使用

使用华为云服务器 cpu: 16vCPUs Kunpeng 920 内存&#xff1a;16GiB gpu&#xff1a;4* HUAWEI Ascend 310 cann: 20.1.rc1 操作系统&#xff1a;Ubuntu aarch64目的 使用该服务器进行docker镜像编译&#xff0c;测试模型。 已知生产环境&#xff1a;mindx版本为3.0.rc3&a…

有符号数是如何判断正负符号位的?

文章目录 有符号数是如何判断正负符号位的&#xff1f; 运行结果&#xff1a; 有符号数是如何判断正负符号位的&#xff1f; #include<stdio.h> int main() {int input_data 0;printf("Please input the data ! \n");scanf("%d",&input_data);…

【CASS精品教程】cass3d基于osgb根据点、线、面提取高程,生成等高线

本文讲解cass3d 11.0基于osgb三维模型,根据点、线、面提取高程点,并将高程点保存到文件。cass11.0下载与安装请点击。 一、加载osgb模型 打开cass11.0软件,打开3d窗口,加载osgb三维模型,如下图所示。 二、点提取 CASS3d中提取点高程的快捷键是G,输入G命令,回车。 提示…

5 Paimon数据湖之表数据查询详解

更多Paimon数据湖内容请关注&#xff1a;https://edu.51cto.com/course/35051.html 虽然前面我们已经讲过如何查询Paimon表中的数据了&#xff0c;但是有一些细节的东西还需要详细分析一下。 首先是针对Paimon中系统表的查询&#xff0c;例如snapshots\schemas\options等等这些…

C# 同步异步大白话

同步异步大白话 背景 任务异步编程模型&#xff08;TAP&#xff09;提供了对异步代码的抽象。您可以像往常一样&#xff0c;将代码编写为一系列语句。您可以阅读该代码&#xff0c;就好像每条语句都在下一条语句开始之前完成一样。编译器执行许多转换&#xff0c;因为其中一些…

log4j CVE-2021-44228 RCE漏洞复现

一、漏洞特征 Apache Log4j 是 Apache 的一个开源项目&#xff0c;Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架&#xff0c;并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等&#xff0c;通过定义每一条日志信息的…

双编码器构建机器人零力拖动/导纳控制思路

前言 这篇博客主要记录昨日与实验室大佬针对UR5机器人拖动示教功能实现的思路。由于本人并非主攻力控方面。直到昨天在做实验的时候&#xff0c;与力控组的大佬讨论过后才了解UR机器人实现导纳控制的思路。 关于导纳控制/零力拖动 导纳控制与阻抗控制单从字面去理解很容易记…

多因素验证如何让企业邮箱系统登录更安全?

企业邮箱系统作为基础的办公软件之一&#xff0c;既是企业内外沟通的重要工具&#xff0c;也是连接企业多个办公平台的桥梁&#xff0c;往往涉及到客户隐私、业务信息、企业机密等等。为了保护邮箱账户的安全&#xff0c;设置登陆密码无疑是保护账户安全的常用措施之一。然而随…

如何设计一个网盘系统的架构

1. 概述 现代生活中已经离不开网盘&#xff0c;比如百度网盘。在使用网盘的过程中&#xff0c;有没有想过它是如何工作的&#xff1f;在本文中&#xff0c;我们将讨论如何设计像百度网盘这样的系统的基础架构。 2. 系统需求 2.1. 功能性需求 用户能够上传照片/文件。用户能…

一题三解(暴力、二分查找算法、单指针):鸡蛋掉落

涉及知识点 暴力、二分查找算法、单指针 题目 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它低的…

归并分治 归并排序的应用 + 图解 + 笔记

归并分治 前置知识&#xff1a;讲解021-归并排序 归并排序 图解 递归 非递归 笔记-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134338789?spm1001.2014.3001.5501原理&#xff1a; (1&#xff09;思考一个问题在大范围上的答案&#xff0c;是否等于&…

postman 参数化使用csv导入外部数据

一、参数化脚本入参 postman中变量用{{变量名}}表示变量 二、创建外部数据文件 csv文件逗号分割多个变量和对应值注意编码格式必须为utf-8 三、run collection导入数据文件 四、设置运行参数run 浏览数据 可调试设置迭代次数&#xff1a;防止批量出错&#xff0c;可先设定…

新风机小助手-风压变速器

风压变速器是一种用于调节系统中风量和风压的装置&#xff0c;常用于通风系统中。它通过改变进出风口的开度来调整风流的速度和风压。 风压变速器通常由进出风口和可调节的风门组成。风门可以手动或自动调节&#xff0c;控制进出风口的开度&#xff0c;从而改变风量和风压。根据…

uni-app基于vite和vue3创建并集成pinia实现数据持久化

一、uni-app基于Vite和Vue3创建并集成pinia实现数据持久化 文章目录 一、uni-app基于Vite和Vue3创建并集成pinia实现数据持久化1.如何创建基于Vite和Vue3的uni-app项目&#xff1f;2.选择其中一个分支&#xff0c;就是一个脚手架 二、以下都是基于vite-ts版本创建和配置1.目录结…

第一章 Object-XML 映射简介

文章目录 第一章 Object-XML 映射简介基础如何工作的映射选项IRIS 中的相关工具XML 文档的可能应用 第一章 Object-XML 映射简介 基础 将对象映射到 XML 一词意味着定义如何将该对象用作 XML 文档。要将对象映射到 XML&#xff0c;请将 %XML.Adaptor 添加到定义该对象的类的超…

线性代数-Python-04:线性系统+高斯消元的实现

文章目录 1 线性系统2 高斯-jordon消元法的实现2.1 Matrix2.2 Vector2.3 线性系统 3 行最简形式4 线性方程组的结构5 线性方程组-通用高斯消元的实现5.1 global5.2 Vector-引入is_zero5.3 LinearSystem5.4 main 1 线性系统 2 高斯-jordon消元法的实现 2.1 Matrix from .Vecto…

搭建完全分布式Hadoop

文章目录 一、Hadoop集群规划二、在主节点上配置Hadoop&#xff08;一&#xff09;登录虚拟机&#xff08;二&#xff09;设置主机名&#xff08;三&#xff09;主机名与IP地址映射&#xff08;四&#xff09;关闭与禁用防火墙&#xff08;五&#xff09;配置免密登录&#xff…

根据DataFrame指定的列该列中如果有n个不同元素则将其转化为n行显示explode()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 根据DataFrame指定的列 该列中如果有n个不同元素 则将其转化为n行显示 explode() 选择题 以下代码两次输出结果分别为几行&#xff1f; import pandas as pd df pd.DataFrame({种类:[蔬菜,水…