使用Hadoop 的 Java API 操纵 HDFS 文件系统

这篇具有很好参考价值的文章主要介绍了使用Hadoop 的 Java API 操纵 HDFS 文件系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0x00: 说明

使用 Java 操作 HDFS 文件系统可以使用其对应的Java API,即对应三个 jar 依赖包:

  • hadoop-common.jar (该文件在 hadoop-2.10.1.tar.gz 压缩包中的 \share\hadoop\common 目录下)
  • hadoop-hdfs.jar (该文件在 hadoop-2.10.1.tar.gz 压缩包中的 \share\hadoop\hdfs 目录下)
  • hadoop-client.jar (该文件在 hadoop-2.10.1.tar.gz 压缩包中的 \share\hadoop\hdfs 目录下)

这三个 jar 包的具体名字可能根据你所安装的版本进行变化,在本文档中这三个文件名称具体如下:

使用Hadoop 的 Java API 操纵 HDFS 文件系统

此处我不推荐直接通过 jar 包引入依赖支持,本文中也将不在撰写 jar 的方式引入,因为这三个jar还依赖于其他的依赖库,例如 woodstox-core 等一系列jar包,过程较为繁琐,因此本文中使用 pom 表引入对应配置,使用pom表来管理依赖后,子依赖会自动导入,不在需要我们手动引入,较为方便,pom表依赖配置如下:

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-common</artifactId>
  <version>2.10.1</version>
</dependency>

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-hdfs</artifactId>
  <version>2.10.1</version>
</dependency>

<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-client</artifactId>
  <version>2.10.1</version>
</dependency>

在本文中我将在宿主机使用 IDEA 创建对应工程调用虚拟机的 Java API 接口,创建基本 Java 工程在本文中将不在赘述,但请注意,在创建工程时请将系统编译方式选择为 Maven,如下图所示:

使用Hadoop 的 Java API 操纵 HDFS 文件系统

0x01: 依赖导入

注意,在第三步引入后你会发现他是处于红色的错误状态,此时点击第四步刷新依赖后即可

使用Hadoop 的 Java API 操纵 HDFS 文件系统

引入依赖完成后如下图所示,但因为版本问题存在相对较多的安全的漏洞提示,鼠标放在上方即可显示相关的CVE漏洞编号,但我们仅仅只是学习用途,该问题我们直接忽略

使用Hadoop 的 Java API 操纵 HDFS 文件系统

该步骤完成后 pom 表中无红色文本内容时则代表已完成依赖引入

0x02: HDFS 文件创建

这里给出一段示例代码,你可以用来验证 HDFS 的 Java API 是否能正常工作。在开始前,你需要了解如下几个注意点:

  1. 我们在访问 hdfs 的时候会进行一个权限认证认证的过程,取用户名的过程是这样的:

首先读取 HADOOP_USER_NAME系统环境变量,如果不为空,那么拿它作用户名

如果为空,则读取 HADOOP_USER_NAME 这个 java 环境变量,如果继续为空,则抛出异常

因此在下方代码中,我在第 19-20 行中加了环境变量配置,如果你不想进行该配置,则可以在第 27 行文件系统配置中进行修改,添加一个user参数,代码如下:

// 链接到文件系统
FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf, "root");
  1. 该段代码运行后可能会提示有找不到 logger 和 log4j 未正常初始化的配置,如下图,但因为我们此处仅作学习用途,该警告我们可直接忽略。

使用Hadoop 的 Java API 操纵 HDFS 文件系统

完整实例代码如下:

package org.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;


public class Main {

    public static void main(String[] args) {

        // 配置环境变量
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建配置
        Configuration conf = new Configuration();

        try {

            // 链接到文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);

            // 创建文件
            FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/Tianxidev/test/1.txt"));

            // 写入文件内容到输出流
            fsDataOutputStream.writeUTF("Hi HDFS!");

            // 输出流提交 HDFS
            fsDataOutputStream.flush();

            // 关闭输出流
            fsDataOutputStream.close();

            // 关闭文件系统
            fileSystem.close();

        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }

}

运行后,我们在虚拟机上执行命令 hdfs dfs -ls / 查看 HDFS 文件系统根目录,发现已多出一个我们代码中创建的文件夹,使用 hdfs dfs -cat /Tianxidev/test/1.txt 查看我们创建的文件内容发现写入内容为预期文本,此时则代表 HDFS 的 Java API 工作正常。

使用Hadoop 的 Java API 操纵 HDFS 文件系统

0x03: HDFS 文件夹创建

此处仅提供完整样例代码不在提供运行截图,样例代码已经过验证

package org.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;


public class Main {

    public static void main(String[] args) {

        // 配置环境变量
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建配置
        Configuration conf = new Configuration();

        try {

            // 链接到文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);

            // 创建文件夹
            fileSystem.mkdirs(new Path("/Tianxidev/test1"));

            // 关闭文件系统
            fileSystem.close();

        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }

}

0x04: 本地文件上传 HDFS

此处仅提供完整样例代码不在提供运行截图,样例代码已经过验证

package org.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;


public class Main {

    public static void main(String[] args) {

        // 配置环境变量
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建配置
        Configuration conf = new Configuration();

        try {

            // 链接到文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);

            // 上传本地文件
            fileSystem.copyFromLocalFile(new Path("D:\\temp\\hdfs_test_1.txt"),new Path("/Tianxidev/test1"));

            // 关闭文件系统
            fileSystem.close();

        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }

}

0x05: 读取 HDFS 文件内容

此处仅提供完整样例代码不在提供运行截图,样例代码已经过验证

package org.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;


public class Main {

    public static void main(String[] args) {

        // 配置环境变量
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建配置
        Configuration conf = new Configuration();

        try {

            // 链接到文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);

            // 打开文件
            FSDataInputStream fsDataInputStream = fileSystem.open(new Path("/Tianxidev/test/1.txt"));

            // 打印文件内容
            System.out.println("文件内容: " + fsDataInputStream.readUTF());

            // 关闭输入流
            fsDataInputStream.close();

            // 关闭文件系统
            fileSystem.close();

        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }

}

0x06: HDFS 文件下载本地

此处仅提供完整样例代码不在提供运行截图,样例代码已经过验证

请注意,因为win系统文件系统结构原因,会抛出如下报错:

java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. 

出现该报错时需要你引入 winutils 支持,winutil.exe 主要用于模拟linux下的目录环境,你可以在互联网上寻找该配置教程,如果你不想麻烦,也可以选择通过 API 读取文件内容然后在使用 Java 文件相关API方法将文件流作为文件写入系统。

package org.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;


public class Main {

    public static void main(String[] args) {

        // 配置环境变量
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建配置
        Configuration conf = new Configuration();

        try {

            // 链接到文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);

            // 下载文件到本地
            fileSystem.copyToLocalFile(new Path("/Tianxidev/test1/hdfs_test_1.txt"),new Path("D:\\temp\\hdfs_test_1.txt"));

            // 关闭文件系统
            fileSystem.close();

        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }

}

0x07: 远程删除 HDFS 文件或文件夹

此处仅提供完整样例代码不在提供运行截图,样例代码已经过验证文章来源地址https://www.toymoban.com/news/detail-424263.html

package org.example;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;


public class Main {

    public static void main(String[] args) {

        // 配置环境变量
        Properties properties = System.getProperties();
        properties.setProperty("HADOOP_USER_NAME", "root");

        // 创建配置
        Configuration conf = new Configuration();

        try {

            // 链接到文件系统
            FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.234.129:9000"), conf);

            // b: true 递归删除目录 false 删除指定文件
            fileSystem.delete(new Path("/Tianxidev/test1/hdfs_test_1.txt"),false);
            fileSystem.delete(new Path("/Tianxidev"),true);

            // 关闭文件系统
            fileSystem.close();

        } catch (IOException | URISyntaxException e) {
            throw new RuntimeException(e);
        }

    }

}

到了这里,关于使用Hadoop 的 Java API 操纵 HDFS 文件系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 使用Java API对HDFS进行如下操作:文件的创建、上传、下载以及删除等操作

    使用Java API对HDFS进行如下操作:文件的创建、上传、下载以及删除等操作

    HDFS-JAVA接口:上传文件 将一个本地文件(无具体要求)上传至HDFS中的/hdfs-test路径下(如无此路径,新建一个)。 新建路径:   首先在路径/usr/test/ 下新建test.txt,指令为:/usr/test/test.txt,然后进行上传操作。      2.HDFS-JAVA接口:创建文件 在HDFS中的/hdfs-test路径下新建一个da

    2024年02月07日
    浏览(18)
  • hadoop调用HDFS java api实现在HDFS上创建文件夹

    hadoop调用HDFS java api实现在HDFS上创建文件夹

    目录 一、前期准备 1、Hadoop集群已配置完毕 2、Linux系统安装jdk 3、安装并破解IntelliJ IDEA 二、通过JAVA API操纵HDFS 1.在IDEA中创建项目  2.在hdfs项目的src-main-java路径下创建一个包,然后在包下创建一个java类实现hdfs的文件操作  3.java类的代码 4.对JAVA程序传入参数后运行程序  5

    2024年02月08日
    浏览(49)
  • Java API 操作HDFS文件

    使用JavaAPI操作hdfs 文件的常用操作代码 1.创建目录 2.创建文件 3.重命名 4.上传本地文件到hdfs 5.查看某个目录下的所有文件 6.查看文件块信息 7.文件读写 8.文件上传 9.文件下载 10.使用字节流读取数据 11.删除文件 12.删除文件夹 13.自定义数据输入流

    2024年02月11日
    浏览(10)
  • Hadoop HDFS分布式文件系统(介绍以及基础操作命令)

    Hadoop HDFS分布式文件系统(介绍以及基础操作命令)

    目录 一、为什么需要分布式存储? 二、分布式的基础架构分析  三、HDFS基础架构 1.HDFS简介 四、HDFS集群启停命令 1.一键启停脚本 2.单进程启停 五、HDFS基本操作命令 1.创建文件夹  2.查看指定目录下内容  3.上传文件到HDFS指定目录下  4.查看HDFS文件内容 5.下载HDFS文件  6.拷贝

    2024年02月05日
    浏览(87)
  • 【Hadoop】HDFS API 操作大全

    【Hadoop】HDFS API 操作大全

    🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 🍁🪁🍁 🪁🍁🪁🍁 感谢点赞和关注 ,

    2024年02月07日
    浏览(12)
  • Hadoop HDFS的API操作

    Hadoop HDFS的API操作

    hadoop的 Windows依赖文件夹,拷贝hadoop-3.1.0到非中文路径(比如d:)。 配置HADOOP_HOME环境变量 配置Path环境变量。 不能放在包含有空格的目录下,cmd 输入hadoop显示此时不应有 hadoop-3.0.0bin。我放在E:Program Files (x86) hadoop-3.0.0bin中,就出现错误 验证Hadoop环境变量是否正常。双击

    2024年02月05日
    浏览(9)
  • Hadoop入门学习笔记——三、使用HDFS文件系统

    Hadoop入门学习笔记——三、使用HDFS文件系统

    视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd=5ay8 Hadoop入门学习笔记(汇总) 3.1.1. HDFS文件系统基本信息 HDFS和Linux系统一样,均是以 / 作为根目录的组织形式; 如何区分HDFS和Linux文件系统: Linux文件系统以 file:// 作为

    2024年01月16日
    浏览(11)
  • 大数据学习:使用Java API操作HDFS

    大数据学习:使用Java API操作HDFS

    一、创建Maven项目 二、添加依赖 在 pom.xml 文件里添加 hadoop 和 junit 依赖 三、创建日志属性文件 在 resources 目录里创建 log4j.properties 文件 代码 四、在HDFS上创建文件 在 /ied01 目录创建 hadoop2.txt 文件 创建 net.xxr.hdfs 包,在包里创建 CreateFileOnHDFS 类 编写 create1() 方法 结果 利用H

    2024年02月08日
    浏览(13)
  • 分布式文件系统HDFS之利用Java API与HDFS进行交互

    分布式文件系统HDFS之利用Java API与HDFS进行交互

    文章目录 一、环境要求 二、在Ubuntu中安装Eclipse 三、在Eclipse创建项目 四、为项目添加需要用到的JAR包 五、编写Java应用程序代码  总结 Hadoop不同的文件系统之间通过调用Java API进行交互,利用Java API进行交互,需要利用软件Eclipse编写Java程序。 已经配置好网络的Ubuntu系统的虚

    2023年04月21日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包