HDFS Java API 基本操作实验

news2024/10/5 1:25:24

文章目录

  • 一、实验环境
  • 二、实验内容
    • (一)数据准备
    • (二)编程环境准备
    • (三)使用Hadoop API操作HDFS文件系统
    • (四)使用Hadoop API + Java IO流操作HDFS文件系统
  • 三、实验步骤
    • (一)数据准备
    • (二)编程环境准备
      • 1、启动IDEA
      • 2、创建Maven项目
      • 3、添加项目依赖
        • (1)hadoop-common (org.apache.hadoop:hadoop-common:2.7.6)
        • (2)hadoop-client (org.apache.hadoop:hadoop-client:2.7.6)
        • (3)hadoop-hdfs (org.apache.hadoop:hadoop-hdfs:2.7.6)
        • (4)junit (junit:junit:4.10)
        • (5)log4j-core (org.apache.logging.log4j:log4j-core:2.8.2)
      • 4、添加资源文件
      • 5、创建包
    • (三)使用Hadoop API操作HDFS文件系统
      • 1、获取文件系统并配置在集群上运行
      • 2、创建目录
      • 3、上传文件
      • 4、下载文件
      • 5、删除文件/目录
      • 6、列出指定路径下的文件和目录
      • 7、查看完整代码
    • (四)使用Hadoop API + Java IO流操作HDFS文件系统
      • 1、获取文件系统并配置在集群上运行
      • 2、上传文件(IO流)
      • 3、读取文件(IO流)
      • 4、下载文件(IO流)
      • 5、辅助代码

一、实验环境

  • 本实验主要涉及到了4台虚拟机,其中1台虚拟机的操作系统是ubuntu desktop,另外3台虚拟机的操作系统是centos server
    在这里插入图片描述
  • 本实验已经搭建好了Hadoop HA的完全分布式集群
    在这里插入图片描述

二、实验内容

  • 我们将一同探讨数据处理中至关重要的一环——Hadoop文件系统(HDFS)的操作。我们将分为四个主要部分,分别是数据准备、编程环境准备、使用Hadoop API操作HDFS文件系统以及使用Hadoop API结合Java IO流进行操作。

(一)数据准备

  • 在进行任何数据处理之前,充分准备好数据是至关重要的一步。这一部分将介绍数据准备的重要性,以及如何有效地准备数据以供后续处理使用。

(二)编程环境准备

  • 在进行HDFS文件系统的操作之前,我们需要确保我们的编程环境已经得到了妥善的准备。这包括获取文件系统、配置集群环境等步骤,确保我们的操作能够在集群上运行。

(三)使用Hadoop API操作HDFS文件系统

  • 这一部分是我们的重头戏,我们将使用Hadoop API进行各种文件系统的操作。从创建目录到上传、下载、删除文件,再到列出指定路径下的文件和目录,我们将一一演示如何使用Hadoop API轻松地完成这些操作。同时,我们也会分享一些辅助代码,使大家更好地理解和应用这些操作。

(四)使用Hadoop API + Java IO流操作HDFS文件系统

  • 在这一部分,我们将进一步深入,结合Java IO流,展示如何通过IO流上传、读取和下载文件。这将为大家提供更多的灵活性和掌握文件系统操作的技能。

  • 本次实验帮助大家更好地理解和应用Hadoop文件系统的操作,使大家能够在实际工作中更加得心应手。接下来,我们将深入到各个部分,让我们一同来探索这个数据处理的世界吧!

三、实验步骤

(一)数据准备

  • desktop节点打开终端
    在这里插入图片描述
  • 切换到/opt目录
    在这里插入图片描述
  • 创建数据文件data.txt
    在这里插入图片描述
  • 创建数据文件localFile.txt
    在这里插入图片描述
  • 下载日志属性文件,执行命令:wget 192.168.192.81:8086/api/web/resource/bigdata/Hadoop_Base/06/expPackages/log4j.properties
    在这里插入图片描述
  • 下载Hadoop核心配置文件core-site.xml,执行命令:wget 192.168.192.81:8086/api/web/resource/bigdata/Hadoop_Base/06/expPackages/core-site.xml
    在这里插入图片描述
  • 下载Hadoop分布式文件系统配置文件hdfs-site.xml,执行命令:wget 192.168.192.81:8086/api/web/resource/bigdata/Hadoop_Base/06/expPackages/hdfs-site.xml
    在这里插入图片描述

(二)编程环境准备

1、启动IDEA

  • 在desktop节点上启动IDEA
    在这里插入图片描述

  • 勾选用户协议
    在这里插入图片描述

  • 单击【Continue】按钮
    在这里插入图片描述

2、创建Maven项目

  • 单击欢迎窗口中的【New Project】按钮,在左边栏里选择【Maven】类型
    在这里插入图片描述
  • 单击【Next】按钮,在对话框里设置项目名称、位置、组标识和构件标识
    在这里插入图片描述
  • 单击【Finish】按钮,在弹出的【Tip of the Day】消息框里勾选【Don’t show tips】复选框
    在这里插入图片描述
  • 单击【Close】按钮,看到一个空的Maven项目
    在这里插入图片描述

3、添加项目依赖

  • pom.xml文件里添加相关依赖
    在这里插入图片描述
<dependencies>                                        
    <dependency>                                      
        <groupId>org.apache.hadoop</groupId>          
        <artifactId>hadoop-common</artifactId>        
        <version>2.7.6</version>                      
    </dependency>                                     
    <dependency>                                      
        <groupId>org.apache.hadoop</groupId>          
        <artifactId>hadoop-client</artifactId>        
        <version>2.7.6</version>                      
    </dependency>                                     
    <dependency>                                      
        <groupId>org.apache.hadoop</groupId>          
        <artifactId>hadoop-hdfs</artifactId>          
        <version>2.7.6</version>                      
    </dependency>                                     
    <dependency>                                      
        <groupId>junit</groupId>                      
        <artifactId>junit</artifactId>                
        <version>4.10</version>                       
    </dependency>                                     
    <dependency>                                      
        <groupId>org.apache.logging.log4j</groupId>   
        <artifactId>log4j-core</artifactId>           
        <version>2.8.2</version>                      
    </dependency>                                     
</dependencies>                                       
(1)hadoop-common (org.apache.hadoop:hadoop-common:2.7.6)
  • 作用: 提供Hadoop的通用库和工具,包括文件系统操作、配置管理等。
  • 详细说明: 这是Hadoop的核心库,包含了许多通用的类和工具,用于支持Hadoop分布式文件系统(HDFS)和分布式计算。
(2)hadoop-client (org.apache.hadoop:hadoop-client:2.7.6)
  • 作用: 提供Hadoop的客户端库,支持与Hadoop集群进行交互。
  • 详细说明: 包含Hadoop客户端的相关类,用于在应用程序中与Hadoop集群通信,提交作业等。
(3)hadoop-hdfs (org.apache.hadoop:hadoop-hdfs:2.7.6)
  • 作用: 提供Hadoop分布式文件系统(HDFS)的支持。
  • 详细说明: 包含了HDFS相关的类,用于进行文件系统的读写操作,支持分布式存储和文件管理。
(4)junit (junit:junit:4.10)
  • 作用: 提供Java单元测试的支持。
  • 详细说明: JUnit是一个广泛用于Java项目的测试框架,用于编写和运行单元测试。
(5)log4j-core (org.apache.logging.log4j:log4j-core:2.8.2)
  • 作用: 提供Log4j日志框架的核心功能。
    -详细说明: Log4j是一个用于Java应用程序的灵活的日志框架,log4j-core包含了其核心的日志处理功能。

  • 中慧教学实训平台提供了文件的上传和下载功能
    在这里插入图片描述

  • CentOS上Maven项目本地仓库默认位置(用户主目录/.m2/repository
    在这里插入图片描述

  • 刷新项目依赖
    在这里插入图片描述

  • 刷新之后,多一个Dependencies
    在这里插入图片描述

  • 查看项目依赖的外部库(External Libraries)
    在这里插入图片描述

4、添加资源文件

  • /opt目录里的core-site.xmlhdfs-site.xmllog4j.properties文件拷贝到项目的resources目录
    在这里插入图片描述
    在这里插入图片描述

5、创建包

  • src/main/java里创建net.huawei.usehdfs
    在这里插入图片描述

(三)使用Hadoop API操作HDFS文件系统

1、获取文件系统并配置在集群上运行

  • net.huawei.usehdfs包里创建HDFSBase
    在这里插入图片描述
  • 导入程序所需要的包
    在这里插入图片描述
  • 创建init()方法,获取在集群上运行的文件系统
    在这里插入图片描述
  • 运行init()方法
    在这里插入图片描述
  • 在控制台查看结果
    在这里插入图片描述

2、创建目录

  • 创建testMkdirs()方法
    在这里插入图片描述
  • 由于每次对于HDFS文件系统的操作都需要获取文件系统并配置在集群上运行,因此需要将上一个功能代码中的@Test修改为@Before,并将System.out.printIn(fileSystem);语句注释掉。
    在这里插入图片描述
  • 运行testMkdirs()方法,查看控制台结果
    在这里插入图片描述
  • 在Hadoop WebUI上查看创建的目录
    在这里插入图片描述
  • 利用HDFS Shell命令hdfs dfs -ls -R /查看
    在这里插入图片描述

3、上传文件

  • 创建testCopyFromLocal()方法
    在这里插入图片描述
  • testCopyFromLocal()方法,查看结果
    在这里插入图片描述
  • 查看上传的文件内容
    在这里插入图片描述

4、下载文件

  • 创建testCopyToLocal()方法
    在这里插入图片描述

  • 运行testCopyToLocal()方法,查看结果
    在这里插入图片描述

  • 在desktop节点上查看下载的文件
    在这里插入图片描述

  • 在desktop节点上查看下载的文件内容
    在这里插入图片描述

5、删除文件/目录

  • 创建testDeleteFile()方法,删除/idea/mkdir/directory/data.txt文件
    在这里插入图片描述

  • 运行testDeleteFile()方法,查看结果
    在这里插入图片描述

  • 查看/idea/mkdir/directory/data.txt文件,报错说文件不存在
    在这里插入图片描述

  • 修改代码,删除/idea/mkdir/directory目录
    在这里插入图片描述

  • 运行testDeleteFile()方法,查看结果
    在这里插入图片描述

  • 查看/idea/mkdir/directory目录,报错说目录不存在
    在这里插入图片描述

6、列出指定路径下的文件和目录

  • 创建testListAllStatus()方法
    在这里插入图片描述
  • 运行testListAllStatus()方法,查看结果
    在这里插入图片描述
  • 上传anaconda-ks.cfg到HDFS根目录
    在这里插入图片描述
  • 运行testListAllStatus()方法,查看结果
    在这里插入图片描述

7、查看完整代码

package net.huawei.usehdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;

public class HDFSBase {

    private FileSystem fileSystem;
    private Configuration configuration;

    /**
     * 获取文件系统并配置在集群上运行
     * @throws IOException
     * @throws InterruptedException
     */
    @Before
    public void init() throws IOException, InterruptedException {
        //1、获取文件系统
        configuration = new Configuration();
        //2、配置在集群上运行
        String uri = "hdfs://mycluster:8020";
        fileSystem = FileSystem.get(URI.create(uri), configuration, "root");
        //System.out.println(fileSystem);
    }

    /**
     * 创建目录
     * @throws IOException
     */
    @Test
    public void testMkdirs() throws IOException {
        //3、创建目录
        Path path = new Path("/idea/mkdir/directory");
        fileSystem.mkdirs(path);
        fileSystem.close();
    }

    /**
     * 上传文件
     * @throws IOException
     */
    @Test
    public void testCopyFromLocal() throws IOException {
        //3、从本地上传文件到hdfs文件系统
        // Path src 要上传的文件的路径(本地文件系统中的路径)
        Path src = new Path("/opt/data.txt");
        // Path dst 将文件上传到的路径(hdfs文件系统中的路径)
        Path dst = new Path("/idea/mkdir/directory");
        fileSystem.copyFromLocalFile(src, dst);
        fileSystem.close();
        System.out.println("文件上传成功~" + dst.toString() + "/" + src.getName());
    }

    /**
     * 下载文件
     * @throws IOException
     */
    @Test
    public void testCopyToLocal() throws IOException {
        //3、从hdfs文件系统将文件下载到本地
        // Path src 文件在hdfs文件系统中的路径(hdfs文件系统中的路径)
        Path src = new Path("/idea/mkdir/directory/data.txt");
        // Path dst 要下载的文件的路径(本地文件系统中的路径)
        Path dst = new Path("/usr/local/src/data.txt");
        fileSystem.copyToLocalFile(src, dst);
        fileSystem.close();
        System.out.println("文件下载成功~" + dst.toString());
    }

    /**
     * 删除文件/目录
     * @throws IOException
     */
    @Test
    public void testDeleteFile() throws IOException {
        //3、删除hdfs文件系统中的文件或目录
        Path path = new Path("/idea/mkdir/directory");
        //判断是否是目录
        boolean directory = fileSystem.isDirectory(path);
        //判断是否是文件
        boolean file = fileSystem.isFile(path);
        //如果是目录,则删除目录
        if(directory){
            boolean deleteDirectory = fileSystem.delete(path, true);
            if(deleteDirectory){
                System.out.println("该路径是个目录,删除目录成功!");
            }
        }
        //如果是文件,则删除文件
        if(file){
            boolean deleteFile = fileSystem.delete(path, true);
            if(deleteFile) {
                System.out.println("该路径是个文件,删除文件成功!");
            }
        }
        fileSystem.close();
    }

    /**
     * 列出指定路径下的文件和目录
     * @throws IOException
     */
    @Test
    public void testListAllStatus() throws IOException {
        //3、列出hdfs文件系统中指定路径下所有的目录和文件
        Path path = new Path("/");
        FileStatus[] fileStatuses = fileSystem.listStatus(path);
        for (FileStatus fileStatus : fileStatuses) {
            //如果是文件,则输出文件
            if(fileStatus.isFile()){
                System.out.println("文件:"+fileStatus.getPath().getName());
            }
            //如果是目录,则输出目录
            if(fileStatus.isDirectory()){
                System.out.println("目录:"+fileStatus.getPath().getName());
            }
        }
        fileSystem.close();
    }
}

(四)使用Hadoop API + Java IO流操作HDFS文件系统

1、获取文件系统并配置在集群上运行

2、上传文件(IO流)

3、读取文件(IO流)

4、下载文件(IO流)

5、辅助代码

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

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

相关文章

OpenCL学习笔记(二)手动编译开发库(win10+vs2019)

前言 有时需求比较特别&#xff0c;可能需要重新编译opencl的sdk库。本文档简单记录下win10下&#xff0c;使用vs2019编译的过程&#xff0c;有需要的小伙伴可以参考下 一、获取源码 项目地址&#xff1a;GitHub - KhronosGroup/OpenCL-SDK: OpenCL SDK 可以直接使用git命令…

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、剑指offer每日一练 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️寻找文件副本(题目难度&#xff1a;简单)1.1 题目1.2 示例1.3 限制1.4 解题思路一c代…

2023年第一次系统架构师备考经历

12月7日成绩已经出来&#xff0c;果然最担心的案例分析没有过&#xff0c;才考了40分&#xff0c;还差5分&#xff0c;我就可以一次拿下证书&#xff0c;好可惜啊&#xff0c;今年的题出的有点偏&#xff0c;大数据居然成为必答题&#xff0c;平常是搞Java&#xff0c;大数据方…

做抖店代发,新手如何定类目?五大类目优缺点分析!

我是电商珠珠 类目是店铺的方向&#xff0c;只有将店铺的定位确定好&#xff0c;才能超越大部分的同行。 我经常跟我的学生讲&#xff0c;选择类目的时候不能瞎选&#xff0c;要学会去分析市场&#xff0c;由于大部分的学员前期都是新手小白&#xff0c;所以我们这边会负责给…

[Linux] 用LNMP网站框架搭建论坛

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守护进程 它是php.ini是一个php解析器 工作过程&#xff1a; 1.当客户端通过域名请求访问时&#xff0c;Nginx会找到对应的虚拟主机 2. Nginx将确定请求。 对于静态请求&#xff0c;Nginx会自行处理…

听GPT 讲Rust源代码--src/tools(9)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/apply_demorgan.rs 在Rust源代码中&#xff0c;apply_demorgan.rs文件位于rust-analyzer工具的ide-assists库中&#xff0c;其作用是实现一个辅助函数&#xff0c;用于在代码中应用De Morgan定律的变换。 …

第二十一章网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissi…

SPRD Android 13 下拉状态栏菜单添加静音快捷键简单记录

SPRD Android 13 下拉状态栏菜单添加静音快捷键简单记录 需要修改文件具体修改补丁吐槽需要修改文件 frameworks/base/packages/SystemUI/res/values/config.xml frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java frameworks/base…

Java入门 EditPlus的安装与配置讲解

写Java程序不建议使用EditPlus&#xff0c;首选idea社区版&#xff0c;其次是vscode&#xff0c; 然后是eclipse 。editplus说实话排不上号。 但既然小伙伴想了解一下怎么配置&#xff0c;这里就简单说一下。 下载 首先是jdk&#xff0c;jdk是Java开发和运行的基础&#xff…

【MySQL】:库的操作

库的操作 一.创建和删除数据库二.认识编码三.库的查改1.查找2.修改 四.库的备份和恢复1.备份2.还原 一.创建和删除数据库 说明&#xff1a; 1.大写的表示关键字 2.[] 是可选项 3.CHARACTER SET: 指定数据库采用的字符集 4.COLLATE: 指定数据库字符集的校验规则首先进入MySQL 创…

Verilog基础:时序调度中的竞争(三)(#0的使用)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言&#xff0c;Verilog HDL常常需要使用语句描述并行执行的电路&#xff0c;但其实在仿真器的底层&#xff0c;这些并行执行的语句是有先后顺…

IDEA构建springBoot新项目时JDK只有17和21,无法选择JDK8解决方案

今天创建springboot新项目时&#xff0c;发现IDEA里JDK选项只有17和21&#xff0c;无法选择本机的JDK8&#xff0c;网上查资料后发现是springboot2.7于11.24号后停止维护&#xff0c;基于2.7和java8的spring Initializ官方不再维护&#xff0c;解决方案是在server URL栏&#x…

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

【项目资源下载】 本篇配套直接打开可用的项目包地址,欢迎下载: https://download.csdn.net/download/weixin_41697242/88612084 【背景】 想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。 【要求】 平台:基本常用平台…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…

机器人学习目标

学习目标&#xff1a; 若干年后&#xff0c;我们都将化为尘土&#xff0c;无人铭记我们的存在。那么&#xff0c;何不趁现在&#xff0c;尽己所能&#xff0c;在这个世界上留下一些痕迹&#xff0c;让未来的时光里&#xff0c;仍有人能感知到我们的存在。 机器人协会每届每个阶…

【开源】基于Vue.js的公司货物订单管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 082 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S082。} 文末获取源码&#xff0c;项目编号&#xff1a;S082。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供…

Ultimate VFX

Ultimate VFX 构建套件:

C++实现2024新年日历

日历计算 平年润年计算 首先大概日历最麻烦的就是2月份的计算了&#xff0c;因为会需要考虑到平年还是闰年。每年的2月份天数的计算方法&#xff0c;如果年份能被4整除但不能被100整除&#xff0c;或者能被400整除&#xff0c;那么这一年的2月份只有29天&#xff08;闰年&…

idea import 不让打包时自动带*

场景 因为多人开发&#xff0c;合代码时经常发现因自动import带*了&#xff0c;导致各种问题。 解决

docker学习(八、mysql8.2主从复制遇到的问题)

在我配置主从复制的时候&#xff0c;遇到了一直connecting的问题。 起初可能是我ip配置的不对&#xff0c;slave_io_running一直connecting。&#xff08;我的环境&#xff1a;windows中安装了wsl&#xff0c;是ubuntu环境的&#xff0c;在wsl中装了miniconda&#xff0c;mini…