HDFS Java API基本操作实验

一、实验环境

  • 本实验主要涉及到了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
    在这里插入图片描述

  • 下载日志属性文件,执行命令
    wget192.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】
    在这里插入图片描述

  • 单击【New Project】创建新的项目
    在这里插入图片描述

2、创建Maven项目

  • 点击【Maven】创建一个Maven项目,然后点击【Next】
    在这里插入图片描述
  • 单击【Next】按钮,在对话框里设置项目名称、位置、组标识和构件标识
    在这里插入图片描述
  • 勾选【Don’t show tips】,然后点击【Close】
    在这里插入图片描述
  • 单击【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
    在这里插入图片描述

3 刷新项目依赖

在这里插入图片描述

  • 刷新之后,多一个Dependencies
    在这里插入图片描述
  • 查看项目依赖的外部库(External Libraries)
    在这里插入图片描述

4、添加资源文件

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

5、创建包

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

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

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

  • net.hupingyuan.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()方法,查看结果
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9d095686dd61472bb631ad9a27d209b2.png

  • 查看上传的文件内容
    在这里插入图片描述

4、下载文件

  • 创建testCopyToLocal()方法
    在这里插入图片描述
  • 运行testCopyToLocal()方法,查看结果
    在这里插入图片描述
  • 在desktop节点上查看下载的文件
    在这里插入图片描述
  • 在desktop节点上查看下载的文件内容
    在这里插入图片描述

5、删除文件/目录

  • 创建testDeleteFile()方法,删除/idea/mkdir/directory/data.txt文件
    在这里插入图片描述
  • 运行testDeleteFile()方法,查看结果
    在这里插入图片描述
  • 修改代码,删除/idea/mkdir/directory目录
    在这里插入图片描述

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

  • 创建testListAllStatus()方法
    在这里插入图片描述
  • 运行testListAllStatus()方法,查看结果
    在这里插入图片描述
  • 上传anaconda-ks.cfg到HDFS根目录
    在这里插入图片描述
  • 运行testListAllStatus()方法,查看结果
    在这里插入图片描述
  • 查看完整源代码
   package vip.zhonghui.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");
    }

    /**
     * 创建目录
     * @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();
    }

    /**
     * 下载文件
     * @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();
    }

    /**
     * 删除文件/目录
     * @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();
    }

}
  • 这段代码是一个Java程序,主要用于操作Hadoop分布式文件系统(HDFS)。它通过使用Apache Hadoop的FileSystem API来实现对HDFS的基本功能,包括创建目录、上传文件、下载文件、删除文件/目录以及列出指定路径下的文件和目录。

  • 在初始化阶段,程序通过Configuration对象配置HDFS连接,并通过FileSystem.get()方法获取到一个与HDFS的连接实例。然后,各个测试方法分别实现了上述的基本功能,如testMkdirs()用于创建目录,testCopyFromLocal()用于从本地上传文件,testCopyToLocal()用于从HDFS下载文件,testDeleteFile()用于删除文件或目录,testListStatus()用于列出指定路径下的所有文件和目录。

  • 整个程序以Java语言编写,并利用了JUnit进行单元测试,使得代码更加模块化和易于维护。同时,由于采用了Hadoop的HDFS API,使得程序可以方便地在Hadoop集群上运行,实现对HDFS的高效操作。

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

1、获取文件系统对象

(1)右键点击【net.hupingyuan.usehdfs】-【New】-【Java Class】新建一个类文件,并命名为【HDFSIO
在这里插入图片描述

  • 导入程序所需要的包
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
  • 创建init()方法,获取文件系统对象
    在这里插入图片描述
  • 运行init()方法,查看结果
    在这里插入图片描述
  • 代码修改
    在这里插入图片描述

2、上传文件(IO流)

在这里插入图片描述

  • 创建testUpload()方法
    在这里插入图片描述
  • 运行testUpload()方法,查看结果
    在这里插入图片描述- 查看上传的文件 - /io/localFile.txt
    在这里插入图片描述

3、读取文件(IO流)

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

4、下载文件(IO流)

  • 创建testDownload()方法
    在这里插入图片描述
  • 运行testDownload()方法,查看结果
    在这里插入图片描述
  • 查看下载的文件 - /usr/local/src/localFile.txt

在这里插入图片描述

5、查看完整源代码

package net.huawei.usehfds;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;

import java.io.*;
import java.net.URI;

public class HDFSIO {

    private FileSystem fileSystem;
    private Configuration configuration;

    /**
     * 获取文件系统并配置在集群上运行
     * @throws IOException
     * @throws InterruptedException
     */
    @Before
    public void init() throws IOException, InterruptedException {
        // 创建配置对象
        configuration = new Configuration();
        // 定义统一资源标识符变量指向集群
        String uri = "hdfs://mycluster:8020";
        // 基于集群、配置对象与用户获取文件系统对象
        fileSystem = FileSystem.get(URI.create(uri), configuration, "root");
        // 打印文件系统对象
        // System.out.println(fileSystem);
    }

    /**
     * 通过IO流上传文件
     * @throws IOException
     */
    @Test
    public void testUpload() throws IOException {
        // 创建本地文件输入流,读取本地文件内容
        File localFile = new File("/opt/localFile.txt");
        FileInputStream in = new FileInputStream(localFile);
        // 创建HDFS文件输出流,写入HDFS文件
        Path path = new Path("/io/localFile.txt");
        FSDataOutputStream out = fileSystem.create(path);
        // 利用IOUtils工具类实现流对接,完成文件拷贝
        IOUtils.copyBytes(in, out, configuration);
        // 关闭输入输出流
        IOUtils.closeStream(in);
        IOUtils.closeStream(out);
        // 关闭文件系统
        fileSystem.close();
        // 提示用户
        System.out.println("文件上传成功~" + path.toString());
    }

    /**
     * 通过IO流读取文件
     * @throws IOException
     */
    @Test
    public void testReadFile() throws IOException {
        // 创建HDFS文件输入流,读取HDFS文件
        Path path = new Path("/io/localFile.txt");
        FSDataInputStream in = fileSystem.open(path);
        // 利用IOUtils工具类,将输入流拷贝到控制台显示
        IOUtils.copyBytes(in, System.out, 4096);
        // 关闭输入流
        IOUtils.closeStream(in);
        // 关闭文件系统
        fileSystem.close();
    }

    /**
     * 通过IO流下载文件
     * @throws IOException
     */
    @Test
    public void testDownload() throws IOException {
        // 创建HDFS文件输入流,读取HDFS文件
        Path path = new Path("/io/localFile.txt");
        FSDataInputStream in = fileSystem.open(path);
        // 创建本地文件输出流,写入本地文件内容
        File localFile = new File("/usr/local/src/localFile.txt");
        FileOutputStream out = new FileOutputStream(localFile);
        // 利用IOUtils工具类实现流对接,完成文件拷贝
        IOUtils.copyBytes(in, out, configuration);
        // 关闭输入输出流
        IOUtils.closeStream(in);
        IOUtils.closeStream(out);
        // 关闭文件系统
        fileSystem.close();
        // 提示用户
        System.out.println("文件下载成功~" + localFile.getAbsolutePath());
    }
}
  • 这段代码是一个Java程序,主要用于操作Hadoop分布式文件系统(HDFS)中的文件。它通过使用Apache Hadoop的FileSystem API和IOUtils工具类来实现对HDFS中文件的基本功能,包括上传文件、读取文件以及下载文件。

  • 在初始化阶段,程序通过Configuration对象配置HDFS连接,并通过FileSystem.get()方法获取到一个与HDFS的连接实例。然后,各个测试方法分别实现了上述的基本功能,如testUpload()用于从本地上传文件到HDFS,testReadFile()用于从HDFS读取文件内容并输出到控制台,testDownload()用于从HDFS下载文件到本地。

  • 整个程序以Java语言编写,并利用了JUnit进行单元测试,使得代码更加模块化和易于维护。同时,由于采用了Hadoop的HDFS API和IOUtils工具类,使得程序可以方便地在Hadoop集群上运行,实现对HDFS文件的高效操作。

四、实验总结

  • 在本次实验中,我们主要围绕Hadoop分布式文件系统(HDFS)的操作进行了深入的学习和实践。首先,我们对实验环境进行了简要的介绍,包括所需的数据准备和编程环境准备。

  • 在编程环境准备阶段,我们启动了IDEA,并创建了一个Maven项目。然后,我们为项目添加了必要的依赖库,包括hadoop-common、hadoop-client、hadoop-hdfs、junit以及log4j-core等。接下来,我们添加了一些资源文件,并创建了一个包,以便组织我们的代码。

  • 在使用Hadoop API操作HDFS文件系统部分,我们首先获取了文件系统对象,然后学习了如何创建目录、上传文件、下载文件、删除文件/目录以及列出指定路径下的文件和目录。这部分内容通过具体的代码示例,使同学们对Hadoop API有了更直观的理解和掌握。

  • 在使用Hadoop API + Java IO流操作HDFS文件系统部分,我们同样先获取了文件系统对象,然后学习了如何通过IO流来上传文件、读取文件以及下载文件。这部分内容结合了Java IO流的知识,使得同学们能够更加灵活地进行文件操作。

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的:学习如何使用eclipse开发调试HDFS Java程序,并利用Hadoop提供的Java API进行基本的文件操作实验环境:Eclipse、Hadoop、Java 实验过程: 1. 下载安装Hadoop 首先需要下载安装Hadoop,可以到官网下载最新版本。然后解压到本地目录并配置环境变量。 2. 配置Hadoop 打开Hadoop的配置文件hdfs-site.xml,修改以下参数: ``` <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/hdfs/datanode</value> </property> ``` 这里设置副本数为1,并设置namenode和datanode的存储路径。 3. 启动Hadoop 启动Hadoop,输入以下命令: ``` $ start-dfs.sh $ start-yarn.sh ``` 4. 创建Java项目 在Eclipse中创建Java项目,并导入hadoop-common和hadoop-hdfs-client的jar包。 5. 编写Java程序 编写Java程序,代码如下: ``` import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HdfsTest { public static void main(String[] args) throws IOException { // 创建配置对象 Configuration conf = new Configuration(); // 设置HDFS的访问地址 conf.set("fs.defaultFS", "hdfs://localhost:9000"); // 创建文件系统对象 FileSystem fs = FileSystem.get(conf); // 创建一个路径对象 Path path = new Path("/test.txt"); // 判断文件是否存在 boolean exists = fs.exists(path); System.out.println(exists); // 创建文件 fs.create(path); // 关闭文件系统对象 fs.close(); } } ``` 这段代码实现了连接到HDFS,判断文件是否存在,以及创建文件的功能。 6. 运行程序 在Eclipse中运行程序,可以看到控制台输出文件是否存在的信息。 7. 查看HDFS中的文件 使用Hadoop提供的命令行工具查看HDFS中是否存在test.txt文件: ``` $ hdfs dfs -ls / ``` 可以看到test.txt文件已经存在于HDFS中。 心得体会: 通过本次实验,我学会了如何使用eclipse开发调试HDFS Java程序,并利用Hadoop提供的Java API进行基本的文件操作。在实验过程中,我遇到了许多问题,比如Hadoop的环境配置、jar包导入等等,但通过不断的尝试和查找资料,我最终成功地完成了实验。通过这个过程,我深刻地体会到了学习的重要性,只有不断地学习和实践,才能更好地掌握知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值