HDFS Java API 开发指南:从基础操作到高级应用

HDFS (Hadoop Distributed File System) 作为大数据生态的核心存储系统,提供了分布式、高容错、高吞吐量的数据存储能力。通过 Java API 操作 HDFS 是开发大数据应用的基础技能。本文将基于你的笔记,详细解析 HDFS Java API 的使用方法,并提供完整的代码示例和最佳实践。

一、前置准备与环境配置

1. 添加 Maven 依赖

pom.xml 中添加 Hadoop 客户端依赖:

<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>${hadoop.version}</version>
</dependency>

推荐使用与生产环境一致的 Hadoop 版本(如 3.2.4)。

2. 初始化 FileSystem 对象
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Before;
import org.junit.After;
import java.net.URI;public class HdfsTest {private FileSystem fileSystem;private Configuration configuration;public static final String HDFS_ENPOINT = "hdfs://ip:8020";public static final String basePath = "/test/java_api";@Beforepublic void preEnv() throws Exception {// 设置 Hadoop 用户和路径System.setProperty("HADOOP_USER_NAME", "hadoop");System.setProperty("HADOOP_HOME", "D:\\Program Files\\hadoop-3.0.0");System.setProperty("hadoop.home.dir", "D:\\document");// 配置 HDFS 连接configuration = new Configuration();fileSystem = FileSystem.get(new URI(HDFS_ENPOINT), configuration);}@Afterpublic void afterEnv() throws Exception {if (fileSystem != null) {fileSystem.close();}}
}

二、核心文件操作

1. 创建目录
@Test
public void mkdir() throws Exception {boolean result = fileSystem.mkdirs(new Path(basePath));System.out.println("创建目录: " + (result ? "成功" : "失败"));
}
2. 创建文件并写入内容
@Test
public void create() throws Exception {Path filePath = new Path(basePath + "/test.txt");try (FSDataOutputStream outputStream = fileSystem.create(filePath)) {outputStream.write("Java operation hdfs!".getBytes());System.out.println("文件创建成功: " + filePath);}
}
3. 查看文件内容
@Test
public void cat() throws Exception {Path filePath = new Path(basePath + "/test.txt");try (FSDataInputStream inputStream = fileSystem.open(filePath)) {IOUtils.copyBytes(inputStream, System.out, 1024, false);}
}
4. 文件重命名
@Test
public void rename() throws Exception {Path srcPath = new Path(basePath + "/test.txt");Path dstPath = new Path(basePath + "/renameTest.txt");boolean result = fileSystem.rename(srcPath, dstPath);System.out.println("重命名文件: " + (result ? "成功" : "失败"));
}

三、文件上传与下载

1. 本地上传至 HDFS
@Test
public void copyFromLocalFile() throws Exception {Path localPath = new Path("D:\\document\\slow_query.log");Path hdfsPath = new Path(basePath);fileSystem.copyFromLocalFile(localPath, hdfsPath);System.out.println("文件上传成功: " + localPath);
}
2. 带进度条的大文件上传
@Test
public void copyFromLocalFileWithProgress() throws Exception {Path hdfsPath = new Path(basePath + "/slow_query.log");File localFile = new File("D:\\document\\slow_query.log");try (InputStream is = new BufferedInputStream(Files.newInputStream(localFile.toPath()));FSDataOutputStream outputStream = fileSystem.create(hdfsPath, new Progressable() {long totalBytes = localFile.length();long bytesWritten = 0;int lastProgress = 0;@Overridepublic void progress() {bytesWritten += 4096;int progress = (int) ((bytesWritten * 100) / totalBytes);if (progress > lastProgress) {System.out.print("\r上传进度: " + progress + "%");lastProgress = progress;}}})) {IOUtils.copyBytes(is, outputStream, 4096, false);System.out.println("\n文件上传完成: " + hdfsPath);}
}
3. 从 HDFS 下载到本地
@Test
public void copyToLocalFile() throws Exception {Path srcPath = new Path(basePath + "/renameTest.txt");Path dstPath = new Path("E://test.txt");// 使用原始本地文件系统,避免 Windows 兼容性问题fileSystem.copyToLocalFile(false, srcPath, dstPath, true);System.out.println("文件下载成功: " + dstPath);
}

四、文件管理与元数据操作

1. 查看文件列表
@Test
public void listFiles() throws Exception {Path dirPath = new Path(basePath);RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(dirPath, true);System.out.println("文件列表:");while (iterator.hasNext()) {LocatedFileStatus status = iterator.next();System.out.printf("%s\t%s\t%d\t%d\t%s%n",status.isDirectory() ? "文件夹" : "文件",status.getReplication(),status.getBlockSize(),status.getLen(),status.getPath());}
}
2. 删除文件/目录
@Test
public void delete() throws Exception {Path path = new Path(basePath + "/slow_query.log");boolean result = fileSystem.delete(path, false); // 非递归删除System.out.println("删除文件: " + (result ? "成功" : "失败"));
}

五、高级特性与最佳实践

1. 设置文件副本系数
@Test
public void setReplication() throws Exception {Path filePath = new Path(basePath + "/test.txt");short replication = 2; // 设置副本数为2boolean result = fileSystem.setReplication(filePath, replication);System.out.println("设置副本系数: " + (result ? "成功" : "失败"));
}
2. 检查文件是否存在
@Test
public void checkFileExists() throws Exception {Path filePath = new Path(basePath + "/test.txt");boolean exists = fileSystem.exists(filePath);System.out.println("文件是否存在: " + exists);
}
3. 获取文件块位置信息
@Test
public void getFileBlockLocations() throws Exception {Path filePath = new Path(basePath + "/test.txt");FileStatus fileStatus = fileSystem.getFileStatus(filePath);BlockLocation[] locations = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());System.out.println("文件块位置信息:");for (BlockLocation location : locations) {System.out.printf("块偏移量: %d, 长度: %d, 所在节点: %s%n",location.getOffset(),location.getLength(),Arrays.toString(location.getHosts()));}
}

六、常见问题与解决方案

1. Windows 环境兼容性问题
  • 错误信息:java.io.IOException: Could not locate executable
  • 解决方案:
    • 设置 HADOOP_HOMEhadoop.home.dir 系统变量
    • 下载 Windows 版 Hadoop 二进制文件(如 winutils.exe)
2. 权限不足问题
  • 错误信息:Permission denied: user=xxx, access=WRITE
  • 解决方案:
    // 在创建 FileSystem 时指定用户
    fileSystem = FileSystem.get(new URI(HDFS_ENPOINT), configuration, "hdfs");
    
3. 大文件上传性能优化
  • 使用带进度反馈的上传方法
  • 调整缓冲区大小:
    FSDataOutputStream outputStream = fileSystem.create(filePath, true, 8192); // 8KB 缓冲区
    

七、完整示例代码

下面是一个整合所有操作的完整示例:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.After;
import org.junit.Test;
import java.io.*;
import java.net.URI;
import java.nio.file.Files;public class HdfsOperationExample {private FileSystem fileSystem;private Configuration configuration;public static final String HDFS_ENPOINT = "hdfs://ip:8020";public static final String basePath = "/test/java_api";@Beforepublic void preEnv() throws Exception {System.setProperty("HADOOP_USER_NAME", "hadoop");configuration = new Configuration();fileSystem = FileSystem.get(new URI(HDFS_ENPOINT), configuration);}@Afterpublic void afterEnv() throws Exception {if (fileSystem != null) {fileSystem.close();}}@Testpublic void testAllOperations() throws Exception {// 创建目录mkdir();// 创建文件并写入内容create();// 查看文件内容System.out.println("\n文件内容:");cat();// 重命名文件rename();// 上传本地文件copyFromLocalFile();// 带进度条的上传copyFromLocalFileWithProgress();// 查看文件列表System.out.println("\n文件列表:");listFiles();// 获取文件块位置System.out.println("\n文件块位置:");getFileBlockLocations();// 删除文件delete();}// 其他方法实现...
}

八、性能调优建议

  1. 批量操作:避免频繁创建和关闭 FileSystem 对象
  2. 缓冲区设置
    // 增大缓冲区提高写入性能
    FSDataOutputStream outputStream = fileSystem.create(filePath, true, 65536); // 64KB
    
  3. 异步操作:对于大文件上传,考虑使用异步回调机制
  4. 连接池:在生产环境中使用连接池管理 FileSystem 实例

通过本文的示例,你可以全面掌握 HDFS Java API 的使用方法。在实际开发中,建议根据业务需求选择合适的 API,并注意处理异常和资源释放,以确保程序的健壮性和性能。

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

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

相关文章

区块链技术核心组件及应用架构的全面解析

区块链技术是一套融合密码学、分布式系统与经济激励的复合型技术体系&#xff0c;以下是其核心组件及应用架构的全面解析&#xff1a;一、区块链核心技术栈 1. 分布式账本技术&#xff08;DLT&#xff09; 核心原理&#xff1a;多节点共同维护不可篡改的数据链数据结构&#xf…

golang 协程 如何中断和恢复

Go语言通知协程退出(取消)的几种方式 - 知乎 GoLang之goroutine底层系列二(goroutine的创建、让出、恢复)_golang goroutine-CSDN博客 在 Go 语言中&#xff0c;协程&#xff08;也称为 goroutine&#xff09;是通过 go 关键字启动的轻量级线程。由于 goroutine 的调度是由 Go…

ARMv8 创建3级页表示例

最近在研究arm v8页表创建过程&#xff0c;顺带做了一个如下形式的页表&#xff0c; // level 1 table, 4 entries: // 0000 0000 - 3FFF FFFF, 1GB block, DDR // 4000 0000 - 7FFF FFFF, 1GB block, DDR // 8000 0000 - BFFF FFFF, 1GB block, DDR // C000 0000 - FFFF FFFF…

迁港战平 精神可胜国足

迁港战平可胜国足 江苏省城市足球联赛第6轮&#xff0c;宿迁队主场迎战连云港队。比赛中&#xff0c;宿迁队由张栋和高驰各入一球&#xff0c;连云港队则凭借穆家鑫与李团杰的进球连扳两城。最终双方以2比2握手言和。 第38分钟&#xff0c;张栋角球进攻中无人盯防推射破门&…

408第三季part2 - 计算机网络 - ip分布首部格式与分片

理解 好好看一下这个图 每行是4B&#xff0c;首部也不一定是20B&#xff0c;还有可选字段&#xff0c;可以变的更大 然后我们先看一下概念 然后这个生存时间每路过一个路由器就会扣1滴血 比如一开始是13&#xff0c;经过r1r2r3到B会变成10 但如果是2&#xff0c;经过第二个路…

详解String类不可变的底层原理

String类 String的基本特性 不可变性: String 对象一旦创建就不能被修改&#xff0c;所有看似修改的操作实际上都是创建新的 String 对象final类: String 类被声明为 final&#xff0c;不能被继承基于字符数组: 内部使用final char value[]存储字符数据(Java9以后改为byte[] …

GIT: 一个用于视觉与语言的生成式图像到文本转换 Transformer

摘要 在本文中&#xff0c;我们设计并训练了一个生成式图像到文本转换 Transformer——GIT&#xff0c;以统一视觉-语言任务&#xff0c;如图像/视频字幕生成和问答。虽然生成式模型在预训练和微调之间提供了一致的网络架构&#xff0c;但现有工作通常包含复杂的结构&#xff…

20250706-9-Docker快速入门(下)-Docker在线答疑_笔记

一、Kubernetes核心概念与集群搭建 1. 在线答疑 &#xfeff; 1&#xff09;答疑Docker需要掌握到什么程度 学习目标&#xff1a;达到入门水平即可&#xff0c;重点掌握第一章Docker入门视频内容学习建议&#xff1a;预习时间约3-4小时&#xff0c;建议吸收视频内容的80%学…

Node.js-http模块

HTTP 协议 概念 HTTP&#xff08;hypertext transport protocol&#xff09;协议&#xff1b;中文叫超文本传输协议,是一种基于TCP/IP的应用层通信协议这个协议详细规定了 浏览器 和万维网 服务器 之间互相通信的规则。协议中主要规定了两个方面的内容 客户端&#xff1a;用来…

Java JDBC的初步了解

文章目录 基本流程注册驱动的两种方法DriverManagerDriverManager 的核心作用核心原理自动注册驱动的机制关键方法 示例代码: 连接Mysql数据库StatementPreparedStatement JDBC全称Java DataBase Connectivity。 定义: JDBC 是 Java 语言中用于连接和执行 SQL 操作的标准接口。…

[netty5: ChunkedInput ChunkedWriteHandler]-源码分析

ChunkedInput ChunkedInput<B> 是 Netty 中用于按块读取不定长数据流的接口&#xff0c;常配合 ChunkedWriteHandler 实现流式写入&#xff0c;支持如文件、流、HTTP 和 WebSocket 等多种数据源。 实现类简要说明ChunkedFile用于将常规文件按块传输&#xff08;使用传统…

QT 第十二讲 --- 控件篇 LineEdit,TextEdit与ComboBox

前言&#xff1a;欢迎进入 QT 控件世界的第十二讲&#xff01;在上一讲《QT 第十一讲 --- 控件篇 LCDnumber&#xff0c;ProgressBar与CalenderWidget》中&#xff0c;我们探索了用于信息展示和状态反馈的控件&#xff1a;精准的数字显示器 LCD Number、直观的进度指示器 Progr…

VSCode遇到的一些小毛病(自动保存、运行后光标不再处于编辑区)

1. 右键点击Run Code没有触发自动保存 1. 打开 VS Code 设置&#xff08;Ctrl ,&#xff09; 2. 搜索&#xff1a;code runner save 3. 勾选你需要的 2. 运行后光标仍然处于编辑区&#xff08;容易误输入&#xff09; 1. 打开 VS Code 设置&#xff08;Ctrl ,&#xff09; 2.…

Maixcam的使用2

1.单文件和项目&#xff08;多个 py 文件项目/模块化&#xff09;# 在编写代码时&#xff0c;一般两种模式&#xff0c;执行单个文件&#xff0c;或者执行一个完成项目&#xff08;包含多个 py 文件或者其它资源文件&#xff09;。 单文件模式&#xff1a;MaixVision 创建或者…

征信系统架构思想:打造商业信任基石_东方仙盟—仙盟创梦IDE

一、建设必要性在复杂的商业环境中&#xff0c;企业面临多元交易对象与业务场景&#xff0c;准确评估合作方信用状况及潜在价值的难度显著增加。传统经验判断和简单背景调查存在局限性&#xff0c;难以满足现代商业决策需求&#xff0c;因此构建科学的征信体系具有现实必要性。…

网安-XSS-pikachu

介绍 XSS&#xff0c;即跨站脚本攻击&#xff0c;是指攻击者利用Web服务器中的代码漏洞&#xff0c;在页面中嵌入客户端脚本&#xff08;通常是一段由JavaScript编写的恶意代码&#xff09;&#xff0c;当信任此Web服务器的用户访问 Web站点中含有恶意脚本代码的页面&#xff…

算法入门——字典树(C++实现详解)

字典树&#xff08;Trie&#xff09;是处理字符串匹配的高效数据结构&#xff0c;广泛应用于搜索提示、拼写检查等场景。本文将带你从零掌握字典树的原理与实现&#xff01; 一、什么是字典树&#xff1f; 字典树&#xff08;Trie&#xff09;是一种树形数据结构&#xff0c;…

SpringBoot整合SpringCache缓存

SpringBoot整合SpringCache使用缓存 文章目录SpringBoot整合SpringCache使用缓存1.介绍2.SpringBoot整合1.导入xml依赖2.配置yml3.使用EnableCaching启用SpringCache4.Cacheable5.CachePut6.CacheEvict7. Caching8.CacheConfig3.其他属性配置1.keyGenerator 属性2. cacheManage…

WPF学习笔记(20)Button与控件模板

Button与控件模板一、 Button默认控件模板详解二、自定义按钮模板一、 Button默认控件模板详解 WPF 中的大多数控件都有默认的控件模板。 这些模板定义了控件的默认外观和行为&#xff0c;包括控件的布局、背景、前景、边框、内容等。 官方文档&#xff1a;https://learn.mic…

蓝天居士自传(1)

蓝天居士何许人&#xff1f; 蓝天居士是我的笔名&#xff0c;也可以说是号。就好像李白号青莲居士、欧阳修号六一居士一样。笔者本名彭昊 —— 一个有不少重名重姓者的名字。 笔者小的时候上语文课&#xff0c;无论是小学、初中抑或是高中&#xff0c;都会有鲁迅&#xff08;…