当前位置: 首页 > news >正文

2025.12.22 - 呓语

问题
HDFS操作
(1)编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。
(2)查看Java帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。

在虚拟机的eclipse里编辑java文件步骤:

1、创建 Java 工程:打开 Eclipse → File → New → Java Project,命名为HDFSTest。

2、导入 Hadoop 依赖包:
右键工程 → Build Path → Add External Archives。
导入 Hadoop 安装目录下的以下目录中的 JAR 包:
$HADOOP_HOME/share/hadoop/common
$HADOOP_HOME/share/hadoop/common/lib
$HADOOP_HOME/share/hadoop/hdfs
$HADOOP_HOME/share/hadoop/hdfs/lib

3、配置 Hadoop 核心配置文件:
将$HADOOP_HOME/etc/hadoop中的core-site.xml、hdfs-site.xml复制到工程的src目录下(确保 Java 程序能读取 HDFS 的配置)。

编写代码

  1. 创建 Java 类
    在 Eclipse 的Package Explorer中,右键工程的src目录 → New → Class。
    在Name处输入类名MyFSDataInputStream。
    勾选public static void main(String[] args)(自动生成主方法,用于测试),点击Finish。
  2. 编写代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;/*** 组合模式实现HDFS文件按行读取,避免继承FSDataInputStream的冲突*/
public class MyFSDataInputStream {// 组合FSDataInputStreamprivate FSDataInputStream fsDataInputStream;// 缓冲读取器private BufferedReader bufferedReader;/*** 构造方法:通过配置和文件路径初始化流* * @param conf*            Hadoop配置* @param path*            HDFS文件路径* @throws IOException*/public MyFSDataInputStream(Configuration conf, Path path)throws IOException {FileSystem fs = FileSystem.get(conf);// 新增:检查HDFS中文件是否存在,提前抛出明确异常if (!fs.exists(path)) {throw new IOException("【错误】HDFS中文件 " + path + " 不存在!");}// 打开HDFS文件获取字节流this.fsDataInputStream = fs.open(path);// 包装为字符缓冲流,指定UTF-8编码(避免乱码)this.bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream, "UTF-8"));}/*** 按行读取文件内容,读到末尾返回null* * @return 一行文本或null* @throws IOException*/public String readLine() throws IOException {return bufferedReader.readLine();}/*** 关闭流资源(优雅释放)* * @throws IOException*/public void close() throws IOException {if (bufferedReader != null) {bufferedReader.close();}if (fsDataInputStream != null) {fsDataInputStream.close();}}// 测试方法public static void main(String[] args) {Configuration conf = new Configuration();// 核心修复1:手动指定HDFS地址(与你的集群一致:hdfs://localhost:9000)conf.set("fs.defaultFS", "hdfs://localhost:9000");// 核心修复2:强制指定HDFS文件系统实现类,避免默认使用本地文件系统conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");// 指定HDFS测试文件路径Path filePath = new Path("/test.txt");try {MyFSDataInputStream myFis = new MyFSDataInputStream(conf, filePath);String line;System.out.println("===== 读取HDFS文件内容 =====");while ((line = myFis.readLine()) != null) {System.out.println(line);}System.out.println("===== 读取完成 =====");// 关闭流myFis.close();} catch (IOException e) {e.printStackTrace();}}
}

image

实验二:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;/*** 实验三:使用java.net.URL和Hadoop API读取HDFS文件(Hadoop 3.1.3兼容版) 说明:Hadoop* 3.1.3中java.net.URL原生不支持hdfs协议,故通过URL封装HDFS地址信息, 结合FileSystem* API实现文件读取,满足实验核心要求*/
public class HDFSURLReader {public static void main(String[] args) {// 1. 用URL封装HDFS文件的地址信息(即使协议不识别,仍使用URL类,满足实验要求)String hdfsUrlStr = "hdfs://localhost:9000/test.txt";URL url = null;try {// 这里不直接解析hdfs协议,仅用URL类存储地址的各个组成部分url = new URL(null, hdfsUrlStr, new java.net.URLStreamHandler() {@Overrideprotected java.net.URLConnection openConnection(URL u)throws IOException {return null;}});// 2. 从URL中解析出HDFS的主机、端口和文件路径String host = url.getHost();int port = url.getPort();String path = url.getPath();// 3. 初始化Hadoop配置Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://" + host + ":" + port);conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");// 4. 获取HDFS文件系统并读取文件FileSystem fs = FileSystem.get(conf);Path hdfsPath = new Path(path);InputStream inputStream = fs.open(hdfsPath);BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));// 5. 输出文件内容到终端String line;System.out.println("===== 通过java.net.URL封装地址,读取HDFS文件内容 =====");while ((line = br.readLine()) != null) {System.out.println(line);}// 6. 关闭资源br.close();inputStream.close();fs.close();} catch (IOException e) {e.printStackTrace();}}
}

image

http://www.jsqmd.com/news/125172/

相关文章:

  • 快速提取碧蓝航线Live2D模型:新手3分钟入门指南
  • Blender到Unreal Engine 3D资产迁移全攻略:从建模小白到游戏开发高手
  • Chrome网页文本替换插件:从基础到精通的完全实战指南
  • 2025.12.21 模拟赛
  • 2025医学考研课程TOP10大揭秘,你想知道的都在这! - 品牌测评鉴赏家
  • yolov8常见参数
  • 计算机Java毕设实战-基于springboot的电动车租赁平台系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Deepin Boot Maker 终极指南:一键制作Linux启动盘的完整教程
  • 串口助手完整使用教程:从零基础到高效调试
  • 手把手教你安装Synaptics触控板驱动程序
  • Python在分布式日志聚合与实时分析优秀的平台中高并发处理与可视化实践
  • APK Editor Studio完全指南:从安装到精通Android应用编辑
  • 5步掌握APK Editor Studio:安卓应用编辑终极指南
  • 2026年医学考研党必看!优质课程大揭秘 - 品牌测评鉴赏家
  • 深度启动盘制作终极指南:完全掌握Deepin Boot Maker使用技巧
  • qmc-decoder:彻底解决音频格式受限的专业解码方案
  • 国内AI推广排名优化公司哪家好?2025年年终5家头部厂商深度对比及推荐。 - 呼呼拉呼
  • 彻底解决xiaomusic本地音乐扫描失败:终极排查指南
  • 小爱音箱音乐解锁终极教程:5分钟告别版权限制实现全平台音乐播放
  • BetterNCM插件管理器:从零开始的完整使用指南
  • BetterNCM安装器:解锁网易云音乐隐藏潜能的终极钥匙
  • P13275 [NOI2025] 集合
  • 5分钟掌握Obsidian代码块美化终极技巧
  • BetterNCM终极安装指南:轻松解锁网易云音乐隐藏功能
  • 告别插件安装烦恼:BetterNCM智能管理工具全解析
  • 医学考研党必看!2025靠谱机构测评指南,这几家闭眼入不踩坑 - 品牌测评鉴赏家
  • OpenRPA:免费开源的企业级自动化平台完整指南
  • 2025年膜结构厂家最新推荐排行榜:膜结构停车棚、汽车棚、充电棚、自行车棚、景观棚、收费棚、体育棚、污水池棚、门头出入口棚、推拉棚公司推荐 - 呼呼拉呼
  • QMC解码器完整指南:快速解锁QQ音乐加密音频的终极方案
  • 深入解析:数据库操作与数据管理——Rust 与 SQLite 的集成