Hadoop——HDFS的Java API操作(文件上传、下载、删除等)

6 篇文章 1 订阅
本文详细介绍了如何通过创建Maven项目,配置pom.xml来引入Hadoop相关依赖,以及添加Hadoop配置文件。接着展示了如何使用JavaAPI进行HDFS的文件上传、下载、创建目录、重命名和删除等操作。测试代码确保了功能的正确性。
摘要由CSDN通过智能技术生成

1、创建Maven项目

2、修改pom.xml文件

<dependencies>
        <!-- Hadoop所需依赖包 -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.0</version>
        </dependency>

        <!-- junit测试依赖,因为我只想测试HDFS是否能正常使用 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
</dependencies>

3、添加四个配置文件

为避免运行的一些错误,我们将Hadoop的四个重要配置文件添加到resources中

4、创建测试文件JavaAPI

5、初始化

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

import java.io.IOException;

public class JavaAPI {
    // 可操作HDFS文件系统的对象
    FileSystem hdfs = null;

    // 测试方法执行前执行,用于初始化操作,避免频繁初始化
    @Before
    public void init() throws IOException {
        // 构造一个配置参数对象,设置一个参数:要访问的HDFS的URI
        Configuration conf = new Configuration();
        // 指定使用HDFS访问
        conf.set("fs.defaultFS","hdfs://localhost:9000");
        // 进行客户端身份的设置(root为虚拟机的用户名,hadoop集群节点的其中一个都可以)
        System.setProperty("HADOOP_USER_NAME","root");
        // 通过FileSystem的静态get()方法获取HDFS文件系统客户端对象
        hdfs = FileSystem.get(conf);
    }

    // 测试方法执行后执行,用于处理结尾的操作,关闭对象
    @After
    public void close() throws IOException {
        // 关闭文件操作对象
        hdfs.close();
    }
}

因为对文件的操作我们都需要获取hdfs对象和关闭对象,所以为避免重复编写,将两个操作对立成单独方法,分别在文件相应操作执行前和执行后执行。

这里"hdfs://localhost:9000"对应core-site.xml的配置

6、文件操作

可以在浏览器访问http://localhost:50070/,点击Browse the file system 查看HDFS文件系统的目录

文件上传

我提前在本地E:\hadoop下创建一个HDFSTest.txt文件

    // 上传文件到HDFS文件系统
    @Test
    public void testUploadFileToHDFS() throws IOException {
        // 待上传的文件路径(windows)
        Path src = new Path("E:/hadoop/HDFSTest.txt");
        // 上传之后存放的路径(HDFS)
        Path dst = new Path("/HDFSTest.txt");
        // 上传
        hdfs.copyFromLocalFile(src, dst);
        System.out.println("上传成功");
    }
文件下载
    // 从HDFS下载文件到本地
    @Test
    public void testDownFileToLocal() throws IOException {
        // 待下载的路径(HDFS)
        Path src = new Path("/HDFSTest.txt");
        // 下载成功之后存放的路径(windows)
        Path dst = new Path("E:/hadoop/HDFSTest1.txt");
        // 下载
        hdfs.copyToLocalFile(false,src,dst,true);
        System.out.println("下载成功");
    }
创建目录
    // 创建目录
    @Test
    public void testMkdirFile() throws IOException {
        // 待创建目录路径
        Path src = new Path("/HDFS");
        // 创建目录
        hdfs.mkdirs(src);
        System.out.println("创建成功");
    }
目录重命名
    // 重命名
    @Test
    public void testRenameFile() throws IOException {
        // 重命名之前的名字
        Path src = new Path("/HDFS");
        // 重命名之后的名字
        Path dst = new Path("/HDFS1");
        // 重命名
        hdfs.rename(src,dst);
        System.out.println("重命名成功");
    }
删除目录
    // 删除目录
    @Test
    public void testDeleteFile() throws IOException {
        // 待删除目录路径(HDFS)
        Path src = new Path("/HDFS1");
        // 删除
        hdfs.delete(src, true);
        System.out.println("删除成功");
    }
查看文件信息
    // 查看HDFS目录中的文件信息
    @Test
    public void testCheckFile() throws IOException {
        // 获取迭代器对象("/"表示获取全部目录下的文件)
        RemoteIterator<LocatedFileStatus> listFiles = hdfs.listFiles(new Path("/"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            // 打印当前文件名
            System.out.println("文件名:" + fileStatus.getPath().getName());
            // 打印当前文件块大小
            System.out.println("文件块大小:" + fileStatus.getBlockSize());
            // 打印当前文件权限
            System.out.println("文件权限:" + fileStatus.getPermission());
            // 打印当前文件内容的长度
            System.out.println("文件内容长度:" + fileStatus.getLen());
            // 获取该文件块的信息(包含长度,数据块,DataNodes的信息)
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();
            for (BlockLocation bl : blockLocations) {
                System.out.println("block-length:" + bl.getLength());
                System.out.println("block-offset:" + bl.getOffset());
                // 获取DataNodes的主机名
                String[] hosts = bl.getHosts();
                for (String host : hosts) {
                    System.out.println(host);
                }
            }
            System.out.println("-----------------分割线-----------------");
        }
    }

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值