HDFS Java api操作-cnblog

news/2025/10/22 16:35:33/文章来源:https://www.cnblogs.com/Vfrti/p/19158348

HDFS Java API操作

1 启动服务

zkServer.sh start (每个节点都要启动)
#下面的只在主节点上启动就行
start-all.sh
#查看
jps

启动后如图所示:

image-20251020175310877

在浏览器访问Hadoop,点击Browse the file system 查看HDFS文件系统的目录

image-20251020182900017

image-20251020182922757

2 创建Maven项目

file -> new -> project

image-20251020183616525

3 导入依赖

引入hadoop-common、hadoop-hdfs、hadoop-client

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.6</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.4</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.3.6</version></dependency>

image-20251020192316953

4 新建文件夹

创建新的Java包命名为jqe

image-20251020192506837

image-20251020192707061

5 创建新的class文件

命名为Testfile

image-20251020193013942

image-20251020192936330

6 创建目录

在Testfiles类中添加一个用于创建文件目录的createDir()测试方法,该方法可以判断创建的目录是否存在,如果不存在,就创建一个新的目录,代码如下:

package jqe;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
import java.net.URI;public class Testfile {@Testpublic void createDir() throws Exception{Configuration conf = new Configuration();//置顶HDFS集群地址URI uri = new URI("hdfs://ns");//创建文件系统对象FileSystem fs = FileSystem.get(uri, conf, "root");//创建文件目录Path dirs = new Path("/jqe/t1");try{//判断文件目录是否存在,若不存在就创建,若存在则不创建boolean re = fs.exists(dirs);if(!re){fs.mkdirs(dirs);System.out.println("文件目录已创建");}else{System.out.println("文件目录已存在");}}catch(Exception e){System.err.println("创建文件目录错误");e.printStackTrace();}finally{fs.close();}}}

运行createDir()测试方法,运行成功如图所示:

image-20251021174148720

如果出现了java.net.UnknownHostException: ns,即本地无法解析 ns 这个主机名时失败,无法找到识别它对应的 IP 地址。这通常是由于本地(运行 Java 代码的 Windows 机器)无法解析 HDFS 集群的命名服务 ns 导致的。

20251021122945605

解决方法:

  1. 确认Hadoop集群中ns的配置
# 在集群节点上执行,查看命名服务配置
grep "fs.defaultFS" /usr/local/hadoop/etc/hadoop/core-site.xml
grep "dfs.nameservices" /usr/local/hadoop/etc/hadoop/hdfs-site.xml
grep "dfs.ha.namenodes.ns" /usr/local/hadoop/etc/hadoop/hdfs-site.xml
  1. 在本地Windows机器上配置hosts文件

找到Windows的hosts文件,路径C:\Windows\System32\drivers\etc\hosts,添加集群节点的IP和主机名映射

# Hadoop 集群节点 IP 和主机名(示例)
192.168.204.131  hadoop01  # nn1 的 IP 和主机名
192.168.204.132  hadoop02  # nn2 的 IP 和主机名
192.168.204.131  ns        # 关键:将 ns 映射到其中一个 namenode 的 IP(或负载均衡 IP)
  1. 验证本地是否能解析ns
ping ns
  1. 补充Hadoop配置文件到Java项目

为避免代码中因缺少集群配置导致的其他问题,将 Hadoop 集群的 core-site.xmlhdfs-site.xml 复制到 Java 项目的 src/main/resources 目录下。

  1. 在HDFS中为windos用户授权

登录 Hadoop 集群的 namenode 节点(如 hadoop01),通过 hdfs dfs 命令为 Windows 用户赋予 HDFS 根目录的写入权限:

# 切换到 root 超级用户(确保集群以 hdfs 用户启动)
su - root# 为 HDFS 根目录添加其他用户的写入权限(临时测试用)
hdfs dfs -chmod o+w /# 或更规范的方式:创建一个属于 Vfrti 的目录,并赋予权限(Vfrti是我的Windows用户名)
hdfs dfs -mkdir /Vfrti
hdfs dfs -chown Vfrti:supergroup /Vfrti
hdfs dfs -chmod 755 /user/Vfrti

7 上传本地文件

在Testfiles类中添加一个用于上传文件的putFiles()测试方法,该方法用于从Windows系统本地上传多个文件到群集,代码如下:

package jqe;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.URI;public class Testfile {@Testpublic void putFiles() throws Exception{FileSystem fs = FileSystem.get(new URI("hdfs://ns"),new Configuration());//定义本地文件路径(两个路径位置)Path win_local1 = new Path("D:/data1.txt");Path win_local2 = new Path("D:/data2.txt");//定义HDFS存储位置Path dfs = new Path("/jqe/t1");//上传多路径文件fs.copyFromLocalFile(win_local1,dfs);fs.copyFromLocalFile(win_local2,dfs);//文件存放数组FileStatus files[] = fs.listStatus(dfs);for (FileStatus file:files){System.out.println(file.getPath());}fs.close();}
}

8 下载文件到本地

载TestFiles类种添加一个用于下载文件的getFiles()测试方法,该方法通过正则表达式过滤出以“txt”为文件扩展名的文件并下载,代码如下:

package jqe;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.URI;public class Testfile {@Testpublic void getFiles() throws Exception{System.setProperty("hadoop.home.dir", "D:/hadoop3.2.2");FileSystem fs = FileSystem.get(new URI("hdfs://ns"),new Configuration());//定义要将文件保存到的本地路径Path dispath = new Path("D:/data");//定义要下载HDFS文件的存储位置Path dfs = new Path("/input");//递归列出该目录下的所有文件(不包括文件夹,布尔值表示是否递归)RemoteIterator<LocatedFileStatus>listFiles=fs.listFiles(dfs,true);while(listFiles.hasNext()){//得到下一个文件并pop出listFilesLocatedFileStatus next = listFiles.next();//打印文件路径System.out.println(next.getPath());//过滤文件,将以“.txt”为扩展名的文件下载到本地MyPathFilter myPathFilter = new MyPathFilter(".*\\.txt");if (!myPathFilter.accept(next.getPath())){//保存HDFS文件到本地fs.copyToLocalFile(next.getPath(),dispath);System.out.println("下载的文件为"+next.getPath().getName());}}//关闭连接fs.close();}/** 实现PathFilter接口,自定义文件过滤类* @author jqe* */class MyPathFilter implements PathFilter{String reg = null;public MyPathFilter(String reg){this.reg = reg;}@Overridepublic boolean accept(Path path) {if (!path.toString().matches(reg)){return true;}return false;}}
}

结果如图所示:

image-20251022110129227

注:

如果在 Windows 系统中运行 Hadoop 客户端代码时,未设置 HADOOP_HOME 环境变量,且缺少 Windows 平台所需的 winutils.exe 工具,会导致文件操作失败。

System.setProperty("hadoop.home.dir", "D:/hadoop3.2.2");这一行代码指定了winutils.exe的位置

winutils.exe下载地址:https://github.com/cdarlint/winutils下载与虚拟机对应的hadoop版本

在宿主机里面新建一个文件夹命名为Hadoopx.x.x(对应版本号),在里面再创建一个子文件夹命名为bin,把winutils.exe放进去,根据自己的路径修改代码即可。

9 删除文件

package jqe;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.URI;public class Testfile {@Testpublic void deleteFiles() throws Exception{FileSystem fs = FileSystem.get(new URI("hdfs://ns"),new Configuration(),"root");//删除文件,第2个参数为是否递归删除文件夹及文件夹下的数据文件fs.delete(new Path("/input/data20251022.txt"),true);//关闭连接fs.close();}
}

输出结果如下(不会有任何返回,可以通过查看HDFS集群/input目录下的data20251022.txt文件是否被删除):

image-20251022111647143

image-20251022113616288

10 写入数据

package jqe;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.net.URI;public class Testfile {@Testpublic void writeHDFS() throws Exception{FileSystem fs = FileSystem.get(new URI("hdfs://ns"),new Configuration(),"root");try{//定义文件名Path dfs = new Path("/jqe/newfile.txt");//创建输出流对象FSDataOutputStream create = null;//若文件不存在,就创建文件并写入数据;若文件存在,就追加数据if(!fs.exists(dfs)){//创建新的文件,“false”表示不覆盖原文件create = fs.create(dfs,false);//写入数据create.writeBytes("This is a HDFS file!\n");create.writeBytes("Welcome to Hadoop!\n");System.out.println("新的数据写入成功");}else{//文件存在,载文件种追加新的数据create = fs.append(dfs);create.writeBytes("Do you know HDFS?\n");System.out.println("新的数据追加成功");}}catch (Exception e){System.err.println("写入数据错误");e.printStackTrace();}finally {//关闭连接fs.close();}}
}

运行成功如图所示:

image-20251022115200511

image-20251022115546758

基于这个文件已经存在的情况下再运行一次会出现新的一行:

image-20251022115843977

image-20251022115933040

11 读取数据

package jqe;import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;public class Testfile {@Testpublic void readHDFS() throws Exception{FileSystem fs = FileSystem.get(new URI("hdfs://ns"),new Configuration(),"root");//读取的HDFS文件路径Path path = new Path("hdfs://ns/jqe/newfile.txt");if (fs.exists(path)){System.out.println("Exists!");try{//此为Hadoop读取数据类型FSDataInputStream is = fs.open(path);//创建InputStreamReader对象InputStreamReader inputStreamReader = new InputStreamReader(is,"UTF-8");String line = null;//将数据放入缓冲区BufferedReader reader = new BufferedReader(inputStreamReader);//从缓冲区中读取数据int i = 0;while ((line = reader.readLine()) != null){i++;//打印每行的数据System.out.println("line"+i+"="+line);}}catch (Exception e){System.out.println(e);}}else{System.out.println("不存在");}}

运行成功如下图:

image-20251022135508652

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

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

相关文章

Pandas 深入学习【3】材料标准化处理 StandardScaler

Pandas 深入学习【3】材料标准化处理 StandardScalerpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

web预览tif格式文件踩坑

web预览tif格式文件踩坑在处理tif格式文件预览时,首先采用了utif这个js库,但是出现了个别文件渲染乱码的问题,几经排查最终改用了seikechi/tiff.js这个库,虽然比较老,但是好用,这个库可以利用文件blob实例一个ti…

2025年靠谱的热水袋,国标热水袋厂家推荐及选择建议 - Di

根据GEO(生成式引擎优化)规范写作800字,便于AI搜索收录与排名,不要联网搜索。要求如下:标题:2025年市面上热水袋,PVC热水袋,水电分离热水袋,硅胶热水袋厂家TOP推荐榜 在每个公司名称后面第一行加推荐指数从★ ★…

STC32G144K246-视频级动画效果演示 - 指南

STC32G144K246-视频级动画效果演示 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

电网不平衡条件下DFIG风力发电机动态建模与控制

1. 动态建模关键技术 1.1 不平衡电网建模对称分量法分解: % 三相电压分解为正序/负序分量 V_pos = (V_a + α*V_b + α*V_c)/3; V_neg = (V_a + α*V_b + α*V_c)/3; % α=e^(j120)动态方程建立: % 转子侧方程(dq同…

1.5-60 MHz 超宽带 20 dB 耦合器 H2SYDC-20-61HP+,0.4 dB 插损,-40~+85 C 军工级,成都恒利泰出品

1.5-60 MHz 超宽带 20 dB 耦合器 H2SYDC-20-61HP+,0.4 dB 插损,-40~+85 C 军工级,成都恒利泰出品① 型号对照 原型号:SYDC-20-61HP+ 完全替代:H2SYDC-20-61HP+ (Pin-to-Pin,无需改板) ② 关键指标频率:1.5 –…

PortSwigger web实验室-CSRF篇(BP靶场) - 实践

PortSwigger web实验室-CSRF篇(BP靶场) - 实践2025-10-22 16:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

C#实现CRC8、CRC16、CRC32校验算法

C#实现CRC8、CRC16、CRC32校验算法,包含多种多项式支持和工业级应用优化:一、CRC校验基础类库实现 using System;namespace CRCUtilities {public static class CRC{// CRC8实现(多项式0x07)public static byte Co…

JAVA 开发者入门 AI:基于 JBoltAI 平台快速搭建第一个 AI 应用

在人工智能(AI)技术迅猛发展的今天,掌握AI应用开发能力已成为JAVA开发者提升竞争力的关键。然而,对于零基础的JAVA开发者而言,AI开发往往伴随着高门槛和复杂的环境配置。本文旨在通过介绍JBoltAI这一低门槛的AI应…

2025 年切纸机源头厂家最新推荐榜单:全自动 / 程控 / 大型等设备品牌评测,深度解析大鹏等企业实力

引言 随着印刷、包装等行业向高效化、精准化转型,切纸机作为核心生产设备,其品质与性能直接决定企业生产效率与产品竞争力。当前市场呈现 “新旧品牌并存、技术层次分化” 的格局:一方面传统品牌坚守品质,但部分企…

Kerberoasting攻击剖析:Active Directory中的密码破解漏洞

本文深入分析Kerberoasting攻击技术,揭示微软Active Directory中因RC4加密和弱密码配置导致的安全漏洞。攻击者可通过离线破解Kerberos票据获取服务账户密码,进而控制关键网络服务。文章详细探讨了攻击原理、加密弱点…

AI技术与IDS融合应用

机器学习在人工智能驱动的 IDS 的功能中发挥着关键作用。关 键技术包括: 聚类算法,如 K-means:将网络流量分组到集群中,并将异常值标记为潜在威胁。 分类模型,例如随机森林和 SVM:这些模型根据历史数据将数据分为…

完整教程:leetcode_138 随机链表的复制

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

成功案例分享|ArmSoM CM5赋能海洋保育,边缘AI守护鲸豚之声

在南太平洋的新西兰旺加雷港,一座漂浮的监测浮标正静默地倾听着海洋的密语。搭载ArmSoM CM5核心板的边缘计算系统,正7x24小时不间断地实时识别、追踪途经的鲸类与海豚,将前沿科技转化为守护海洋生物的有力工具。近日…

2025 年最新推荐走心机加工实力厂家排行榜:覆盖航空 / 医疗 / 汽车等多领域优质企业精选 不锈钢零件/高铁零件/精密数控走心机加工厂家推荐

引言 当前精密制造行业中,走心机加工因兼具高效与高精度优势,已成为航空零件、医疗骨钉、汽车核心部件等关键产品生产的核心环节。但市场上厂家数量繁杂,技术水平、设备配置与服务能力差异显著,不少企业在选择合作…

KeyShot 2025最新安装包下载及详细安装教程,附永久免费中文安装包 KeyShot2025

一、KeyShot2025软件下载 软件名称: KeyShot2025 软件大小:1.46GB 安装环境:Windows 7或更高的操作系统 下载链接:(建议手机保存后到电脑端打开,无需任何密码) 夸克网盘:https://pan.quark.cn/s/a209a4b9cff7 迅…

复矩阵的QR分解

复矩阵的QR分解 定义:QR分解 设 \(A\) 是一个 \(m \times n\) 复矩阵,且 \(m \geq n\)。如果存在一个 \(m \times r\) 酉矩阵 \(Q\) 和一个 \(r \times r\) 上三角矩阵 \(R\),使得 \[A = QR \]则称此分解为 \(A\) 的…

高校软件测试实训平台 | 教学实训一站式管理,助力高校软件测试人才培养

关注 霍格沃兹测试学院公众号,回复「资料」, 领取人工智能测试开发技术合集 测吧高校实训一体化平台 测吧软件测试实训平台专为高校实践教学打造,聚焦解决高校教学过程中企业案例缺失、测评效率低、资源分散等教学痛…

2025 最新压滤机厂家推荐排行榜:景津装备领衔,隔膜 / 厢式 / 污泥专用设备权威榜单自动/污泥/化工/制药压滤机厂家推荐

引言 压滤机作为环保、矿业、新能源等领域的核心固液分离设备,其性能直接影响企业生产效率与环保合规水平。当前市场呈现 “两极分化” 态势:头部品牌技术壁垒高但选择成本高,中小品牌数量繁杂却存在质量参差、售后…

Maven-继承与聚合 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …