Java实现hdfs的8个api操作

news2025/6/10 3:32:31

Java实现hdfs的8个api操作

    • 一、预处理准备
      • 1. 配置本地hadoop3.1.3目录文件
      • 2. 配置环境变量
    • 二、Maven项目依赖
    • 三、Java源代码
    • 四、api操作的实现
      • 1. 实现前的准备
      • 2. 创建hdfs上的路径
      • 3. 删除hdfs上的路径
      • 4. 创建hdfs文件并写入数据
      • 5. 删除hdfs上的文件
      • 6. hdfs上的文件移动路径并改名
      • 7.读取hdfs上的文件内容
      • 8.上传windows下的本地文件到hdfs上
      • 9. 从hdfs上下载文件到本地

一、预处理准备

1. 配置本地hadoop3.1.3目录文件

先将Linux上的hadoop解压版(tar -zxvf解压)复制一份,再删除(rm -rf)其share子目录(不然下载的文件比较大)

在这里插入图片描述

利用MobaXterm下载到本地(如D:\othersSofts目录下),改名为hadoop3.1.3,再在linux虚拟机上删除供下载用的hadoop目录文件

在这里插入图片描述
在这里插入图片描述

在其/bin目录下添加其所需要的Windows依赖,遇到同名文件则替换

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. 配置环境变量

在这里插入图片描述

在这里插入图片描述

二、Maven项目依赖

创建一个Maven项目,在pom.xml中添加如下依赖:

 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

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

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

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

三、Java源代码

package org.igeek.hdfsapi;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

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

/**
 * 使用hdfs的api进行操作
 */
public class HdfsApiTest {

    //文件系统对象
    FileSystem fs = null;

    /**
     * 初始化文件系统
     *
     * @throws URISyntaxException
     * @throws IOException
     */
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {

        //创建一个配置对象
        Configuration conf = new Configuration();

        // hdfs中的NameNode地址

        //方法一: ip地址:端口
//      String hdfsPath ="hdfs://192.168.31.53:8020";

        //方法二:hostname:端口
        String hdfsPath = "hdfs://bigdata03:8020";

        String userName = "root";

        //获取文件系统对象
        fs = FileSystem.get(new URI(hdfsPath), conf, userName);

        System.out.println("hdfs文件系统对象初始化完成!");

    }

    /**
     * 关闭文件系统
     *
     * @throws IOException
     */
    @After
    public void close() throws IOException {
        fs.close();
        System.out.println("hdfs文件系统已关闭!");

    }

    /**
     * 创建hdfs上的路径
     *
     * @throws IOException
     */

    @Test
    public void createPath() throws IOException {
        boolean createFlag = fs.mkdirs(new Path("/hdfs_api"));
        if (createFlag) {
            System.out.println("路径创建成功");
        } else {
            System.out.println("路径创建失败");

        }

    }

    /**
     * 删除hdfs上的路径
     *
     * @throws IOException
     */

    @Test
    public void deletePath() throws IOException {
        Path path = new Path("/test");
        //判断删除路径是否存在

        if (fs.exists(path)) {

            //使用递归删除
            boolean deleteFlag = fs.delete(path, true);
            if (deleteFlag) {
                System.out.println("删除路径成功");
            } else {
                System.out.println("删除路径失败");
            }

        }
    }


    /**
     * 创建hdfs文件并写入数据
     * @throwsIOException
     */
    @Test
    public void createFile() throws IOException {
        //创建文件路径
        Path path = new Path("/hdfs_api/add.txt");

        FSDataOutputStream fos = fs.create(path);
        //写出的数据
        String content = "我是通过api写入的数据";
        //通过流进行数据写出
        fos.write(content.getBytes());
        // 流的刷新
        fos.flush();
        }


    /**
    *删除hdfs上的文件
    *@throws IOException
    */
@Test
public void deleteFile() throws IOException{
        boolean deleteFlag = fs.deleteOnExit(new Path( "/touchz.txt"));

        if(deleteFlag){
            System.out. println("删除文件成功");
        } else {
            System. out. println("删除文件失败");
        }
}

    /**
     * hdfs上的文件移动路径并改名
     *@throws IOException
     */

    @Test
    public void moveFile() throws IOException {
    //文件的源路径
        Path src = new Path("/put.txt");
    //文件移动后的路径
        Path dst = new Path("/hdfs_api/put_new.txt");
        boolean renameFlag = fs.rename(src, dst);
        if (renameFlag) {
            System.out.println("文件移动成功");
        } else {
            System.out.println("文件移动失败");
        }
    }

    /**
     * 读取hdfs上的文件内容
     * @throws IOException
     */

    @Test
    public void readFile() throws IOException {
        FSDataInputStream fis = fs.open(new Path("/hdfs_api/add.txt"));
        IOUtils.copyBytes(fis, System.out, 2048, false);
        System.out.println("\n");

    }

    /**
     * 上传windows下的本地文件到hdfs上
     * @throws IOException
     */

    @Test
    public void uploadEile() throws IOException {
        //要上传的hdfs路径
        Path src = new Path("D:\\othersofts\\hadoop3.1.3\\etc\\hadoop\\core-site.xml");
        //文件的本地路径
        Path dst = new Path("/hdfs_api");
        fs.copyFromLocalFile(true, src, dst);
        System.out.println("文件从本地上传hdfs成功");

    }

    /**
     * 从hdfs上下载文件到本地
     * @throws IOException
     */
    @Test
    public void downloadFile() throws IOException {
        // hdfs路径
        Path src = new Path("/hdfs_api/add.txt");

        //本地路径
        Path dst = new Path("D:\\");

        fs.copyToLocalFile(false, src, dst,false);
        System.out.println("下载文件成功");

    }
    }

四、api操作的实现

注意:要在每个注解@Test下右击执行对应的方法,如:
在这里插入图片描述

1. 实现前的准备

再在Maven项目中完成初始化文件系统(注解使用@Before)和关闭文件系统(注解使用@After)部分:

 //文件系统对象
    FileSystem fs = null;

    /**
     * 初始化文件系统
     *
     * @throws URISyntaxException
     * @throws IOException
     */
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {

        //创建一个配置对象
        Configuration conf = new Configuration();

        // hdfs中的NameNode地址

        //方法一: ip地址:端口
//      String hdfsPath ="hdfs://192.168.31.53:8020";

        //方法二:hostname:端口
        String hdfsPath = "hdfs://bigdata03:8020";

        String userName = "root";

        //获取文件系统对象
        fs = FileSystem.get(new URI(hdfsPath), conf, userName);

        System.out.println("hdfs文件系统对象初始化完成!");

    }

    /**
     * 关闭文件系统
     *
     * @throws IOException
     */
    @After
    public void close() throws IOException {
        fs.close();
        System.out.println("hdfs文件系统已关闭!");

    }

2. 创建hdfs上的路径

    /**
     * 创建hdfs上的路径
     *
     * @throws IOException
     */

    @Test
    public void createPath() throws IOException {
        boolean createFlag = fs.mkdirs(new Path("/hdfs_api"));
        if (createFlag) {
            System.out.println("路径创建成功");
        } else {
            System.out.println("路径创建失败");

        }

    }

在这里插入图片描述

在这里插入图片描述

输入hadoop指令上查看创建/hdfs_api的结果:

在这里插入图片描述

3. 删除hdfs上的路径

  /**
     * 删除hdfs上的路径
     *
     * @throws IOException
     */

    @Test
    public void deletePath() throws IOException {
        Path path = new Path("/test");
        //判断删除路径是否存在

        if (fs.exists(path)) {

            //使用递归删除
            boolean deleteFlag = fs.delete(path, true);
            if (deleteFlag) {
                System.out.println("删除路径成功");
            } else {
                System.out.println("删除路径失败");
            }

        }
    }

在这里插入图片描述

在这里插入图片描述

输入hadoop指令上查看删除/test的结果:

在这里插入图片描述

4. 创建hdfs文件并写入数据

/**
     * 创建hdfs文件并写入数据
     * @throwsIOException
     */
    @Test
    public void createFile() throws IOException {
        //创建文件路径
        Path path = new Path("/hdfs_api/add.txt");

        FSDataOutputStream fos = fs.create(path);
        //写出的数据
        String content = "我是通过api写入的数据";
        //通过流进行数据写出
        fos.write(content.getBytes());
        // 流的刷新
        fos.flush();
        }

在这里插入图片描述

在这里插入图片描述

输入hadoop指令上查看写入的数据

在这里插入图片描述

5. 删除hdfs上的文件

  /**
    *删除hdfs上的文件
    *@throws IOException
    */
@Test
public void deleteFile() throws IOException{
        boolean deleteFlag = fs.deleteOnExit(new Path( "/touchz.txt"));

        if(deleteFlag){
            System.out. println("删除文件成功");
        } else {
            System. out. println("删除文件失败");
        }
}

在这里插入图片描述

在这里插入图片描述

输入hadoop指令发现已有的/touchz.txt之后被删除:

在这里插入图片描述

6. hdfs上的文件移动路径并改名

 /**
     * hdfs上的文件移动路径并改名
     *@throws IOException
     */

    @Test
    public void moveFile() throws IOException {
    //文件的源路径
        Path src = new Path("/put.txt");
    //文件移动后的路径
        Path dst = new Path("/hdfs_api/put_new.txt");
        boolean renameFlag = fs.rename(src, dst);
        if (renameFlag) {
            System.out.println("文件移动成功");
        } else {
            System.out.println("文件移动失败");
        }
    }

在这里插入图片描述

在这里插入图片描述

输入hadoop指令查看:

在这里插入图片描述

7.读取hdfs上的文件内容

/**
     * 读取hdfs上的文件内容
     * @throws IOException
     */

    @Test
    public void readFile() throws IOException {
        FSDataInputStream fis = fs.open(new Path("/hdfs_api/add.txt"));
        IOUtils.copyBytes(fis, System.out, 2048, false);
        System.out.println("\n");

    }

在这里插入图片描述

在这里插入图片描述

8.上传windows下的本地文件到hdfs上

/**
     * 上传windows下的本地文件到hdfs上
     * @throws IOException
     */

    @Test
    public void uploadEile() throws IOException {
        //要上传的hdfs路径
        Path src = new Path("D:\\othersofts\\hadoop3.1.3\\etc\\hadoop\\core-site.xml");
        //文件的本地路径
        Path dst = new Path("/hdfs_api");
        fs.copyFromLocalFile(true, src, dst);
        System.out.println("文件从本地上传hdfs成功");

    }

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9. 从hdfs上下载文件到本地

/**
     * 从hdfs上下载文件到本地
     * @throws IOException
     */
    @Test
    public void downloadFile() throws IOException {
        // hdfs路径
        Path src = new Path("/hdfs_api/add.txt");

        //本地路径
        Path dst = new Path("D:\\");

        fs.copyToLocalFile(false, src, dst,false);
        System.out.println("下载文件成功");

    }

下载结果:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

算法笔记:Frechet距离度量

曲线之间相似性的度量&#xff0c;它考虑了沿曲线的点的位置和顺序 1 概念 1.1 直观理解 主人走路径A&#xff0c;狗走路径B&#xff0c;他们有不同的配速方案主人和狗各自走完这两条路径过程中所需要的最短狗绳长度 &#xff08;在某一种配速下需要的狗绳长度&#xff09;&a…

MySQL-高可用MHA(二)

目录 &#x1f341;通过keepalived方式 &#x1f342;安装keepalived &#x1f343;防火墙策略 &#x1f343;keep配置文件 &#x1f342;MHA应用keepalived &#x1f343;停止MHA &#x1f343;启动MHA &#x1f343;检查状态 &#x1f343;测试 &#x1f341;通过脚本实现VIP…

数据结构——线段树

线段树的结构 线段树是一棵二叉树&#xff0c;其结点是一条“线段”——[a,b]&#xff0c;它的左儿子和右儿子分别是这条线段的左半段和右半段&#xff0c;即[a, (ab)/2 ]和[(ab)/2 ,b]。线段树的叶子结点是长度为1的单位线段[a,a1]。下图就是一棵根为[1,10]的线段树&#xff1…

真题详解(UML图)-软件设计(四十七)

真题详解(Flynn分类)-软件设计&#xff08;四十六)https://blog.csdn.net/ke1ying/article/details/130072198 某搜索引擎在使用过程中&#xff0c;若要增加接受语音输入的功能&#xff0c;使用户可以通过语音来进行搜索&#xff0c;此时对应系统进行____维护&#xff1f; 正确…

基于逻辑回归构建肿瘤预测模型

使用逻辑回归构建肿瘤预测模型 描述 乳腺癌数据集包括569个样本&#xff0c;每个样本有30个特征值&#xff08;病灶特征数据&#xff09;&#xff0c;每个样本都属于恶性&#xff08;0&#xff09;或良性&#xff08;1&#xff09;两个类别之一&#xff0c;要求使用逻辑回归&…

Python学习笔记--函数

&#xff08;一&#xff09; 函数介绍 1. 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 eg. len()&#xff1a;实现统计长度这一特定功能的代码段。 2. 函数好处&#xff1a; * 将功能封装在函数内&#xff0c;可随时随地重复…

eSearch使用教程大全

下载&#xff1a; https://www.xsoftnet.com/share/a0002tNuuOswc.html产品&#xff1a; eSearch 即拥有 截屏OCR搜索翻译贴图以图搜图录屏功能。 截屏 框选裁切 框选大小位置可调整(支持方向键或 WASD) 框选大小栏可输入四则运算式调整 取色器 放大镜 画笔&#xff08;自由画…

Kafka系统整理 一

一、Kafka 概述 1.1 定义 Kafka传统定义&#xff1a;Kafka是一个分布式的基于发布/订阅模式的消息队列 (Message Queue), 主要应用于大数据实时处理领域。 kafka最新定义&#xff1a;kafka是一个开源的分布式事件流平台&#xff08;Event Streaming Platform&#xff09;, 被…

PostgreSQL下载、安装、Problem running post-install step的解决、连接PostgreSQL

我是参考《SQL基础教程》来安装的&#xff0c;关于书的介绍、配套视频、相关代码可以参照下面的链接&#xff1a; SQL基础教程&#xff08;第2版&#xff09; (ituring.com.cn) 一、下载 我直接打开书中的下载链接时&#xff0c;显示的是这个界面&#xff1a; You are not …

Flink的窗口机制

窗口机制 tumble&#xff08;滚动窗口&#xff09; hop&#xff08;滑动窗口&#xff09; session&#xff08;会话窗口&#xff09; cumulate&#xff08;渐进式窗口&#xff09; Over&#xff08;聚合窗口&#xff09; 滚动窗口&#xff08;tumble&#xff09; 概念 滚…

002:Mapbox GL更改大气、空间及星星状态

第002个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中更改大气、空间及星星状态 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共71行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:…

java截取字符串的方法

在 Java中&#xff0c;截取字符串的方法有多种&#xff0c;下面我们来介绍一下。 第一种方法&#xff0c;在 class中直接获取字符串&#xff0c; class. str是一个内置的字符串类&#xff0c;它有一个方法可以截取字符串&#xff0c;这个方法叫做 class. str &#xff08;&…

linux入门---缓冲区

查看问题 首先大家来看看下面这段代码 1 #include<stdio.h>2 #include<string.h>3 #include<unistd.h>4 int main()5 {6 printf("i am printf\n");7 fprintf(stdout,"i am fprintf\n");8 fputs("i am fputs\n",…

Unity --- 物理引擎 --- 触发器 与 碰撞器详解

碰撞器补充讲解 对第一个条件进行补充 --- 不仅要两者都具有碰撞组件&#xff0c;同时还需要两者的碰撞组件中都没有勾选 Is Trigger属性 1.上一篇文章中说了那么多&#xff0c;其实也可以总结为两个碰撞条件 --- a.两个游戏物体都具有碰撞器组件 &#xff0c;如果没有的话&…

【数据结构】哈希表详解以及代码实现

目录 1.来源&#xff1a; 2.哈希函数 1.哈希函数的设计规则 2.哈希函数的设计思路 3.哈希碰撞 4.解决哈希碰撞的方案 5.负载因子 3.基于开散列方案的HashMap实现 1.HashMap类中的属性 2.哈希函数 3.判断当前哈希表中是否含有指定的key值 4.判断当前哈希表中是否包含…

【尊享版】聊聊我最近比较重要的一些认知升级

超友们&#xff0c;早上好&#xff5e; 今天我为你带来的分享是《聊聊我最近比较重要的一些认知升级》&#xff0c;主要分为三个部分&#xff1a; 一、【10 点战略认知升级】 二、【10 点学习认知升级】 三、【5 点提效认知升级】 &#x1f388;一、【10 点战略认知升级】 …

基于Java+SpringBoot+vue的在线动漫信息平台设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例&#xff08;300套&#xff09; 目录 一、效果演示 二、…

一文吃透泛型

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址 如果访问不了Github&#xff0c…

CVE-2017-10271 WebLogic XMLDecoder反序列化漏洞

靶场环境&#xff1a;vulnstack靶机-委派靶场 漏洞描述 CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务&#xff0c;其中使用了XMLDecoder来解析用户传入的XML数据&#xff0c;在解析的过程中出现反序列化漏洞&#xff0c;导致可执行任…

【RabbitMQ】Spring整合RabbitMQ、Spring实现RabbitMQ五大工作模式(万字长文)

目录 一、准备 1、创建maven项目​编辑 2、引入依赖 3、创建配置文件 1.RabbitMQ配置文件 2.生产者项目配置文件 3.消费者项目配置文件 二、生产者xml中文件创建队列 三、生产者xml文件中创建交换机以及绑定队列 1、创建交换机 2、绑定队列 四、消费者xml文件中创建…