尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

软件工程学习日志2025.12.22

软件工程学习日志2025.12.22
📅 发布时间:2026/6/19 14:02:53

📍 学习主题:跨平台Hadoop开发环境搭建与HDFS连接调试

🎯 核心问题:如何在本地IDEA中编写代码连接到虚拟机Hadoop集群

📊 今日学习目标与成果

🎯 主要学习目标

  1. 理解本地-虚拟机开发环境的架构设计
  2. 掌握跨网络连接HDFS的配置方法
  3. 解决Windows/Linux环境下的兼容性问题
  4. 搭建完整的分布式开发调试环境

✅ 完成成果
成功搭建本地IDEA + 虚拟机Hadoop的开发环境

实现代码远程连接和调试HDFS

解决跨平台权限和网络连接问题

整理完整的配置步骤和故障排除指南

🔧 实验环境架构深入理解

  1. 系统架构设计

通过今天的学习,我深入理解了跨平台Hadoop开发环境的架构:

┌─────────────────────────────────────────────────────────────┐
│ 本地开发环境(Windows/Mac) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ IntelliJ IDEA │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Java代码编译和执行 │ │ │
│ │ │ • 编写HDFS操作代码 │ │ │
│ │ │ • 本地编译和调试 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ 通过Hadoop Client API调用 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ 通过网络Socket通信 ↓ │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 虚拟机环境(Ubuntu 18.04) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Hadoop集群(伪分布式) │ │
│ │ ┌───────────────┐ ┌───────────────┐ │ │
│ │ │ NameNode │ │ DataNode │ │ │
│ │ │ • 元数据管理 │ │ • 数据存储 │ │ │
│ │ │ • 端口:9000 │ │ • 端口:50010 │ │ │
│ │ └───────────────┘ └───────────────┘ │ │
│ │ ┌───────────────┐ │ │
│ │ │SecondaryNameNode│ │ │
│ │ └───────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

  1. 通信协议分析

• RPC通信:本地Java客户端通过RPC与NameNode通信

• 数据流传输:DataNode之间通过TCP传输数据块

• Web UI访问:通过HTTP访问Hadoop Web界面(50070端口)

🚀 关键实现步骤记录

第一阶段:虚拟机Hadoop环境配置

1.1 网络配置核心理解

关键发现:虚拟机网络模式选择

桥接模式:虚拟机获得独立IP,可直接连接

NAT模式:需要端口转发配置

这里选择桥接模式,更简单直接

查看虚拟机IP(关键步骤)

ifconfig

输出示例:

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.1.105 netmask 255.255.255.0

这个IP地址就是代码中要连接的地址

1.2 防火墙配置的坑与解决方案

初始问题:连接被拒绝

解决方案:开放必要端口

sudo ufw status
sudo ufw allow 9000/tcp # HDFS RPC端口
sudo ufw allow 50070/tcp # NameNode Web UI
sudo ufw allow 50075/tcp # DataNode Web UI
sudo ufw allow 22/tcp # SSH(可选)
sudo ufw enable

1.3 Hadoop配置的关键修改

fs.defaultFShdfs://192.168.1.105:9000
<!-- 临时目录配置,避免权限问题 -->
<property><name>hadoop.tmp.dir</name><value>/usr/local/hadoop/tmp</value>
</property>

第二阶段:本地IDEA项目配置

2.1 Maven依赖的完整配置

org.apache.hadoophadoop-common3.1.3org.apache.hadoophadoop-hdfs3.1.3org.apache.hadoophadoop-client3.1.3org.slf4jslf4j-log4j121.7.30

2.2 连接工具类的优化实现

public class HDFSConnection {
/**
* 获取HDFS连接(解决跨平台问题)
* 关键点:Windows和Linux环境处理不同
*/
public static FileSystem getConnection() throws Exception {
Configuration conf = new Configuration();

    // 1. 设置HDFS地址(必须与虚拟机配置一致)conf.set("fs.defaultFS", "hdfs://192.168.1.105:9000");// 2. 设置HDFS实现类conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");// 3. 解决Windows连接Linux的权限问题// 关键发现:Windows环境下需要显式设置用户if (System.getProperty("os.name").toLowerCase().contains("win")) {System.setProperty("HADOOP_USER_NAME", "hadoop");// Windows下需要设置Hadoop主目录System.setProperty("hadoop.home.dir", "C:/hadoop");}// 4. 设置超时参数,避免网络延迟问题conf.set("ipc.client.connect.timeout", "30000");  // 连接超时30秒conf.set("ipc.client.connect.max.retries", "3");  // 最大重试3次conf.set("dfs.client.socket-timeout", "60000");   // Socket超时60秒// 5. 获取文件系统连接return FileSystem.get(URI.create("hdfs://192.168.1.105:9000"), conf, "hadoop");
}

}

第三阶段:连接测试与验证

3.1 完整的连接测试程序

public class ConnectionTest {
public static void main(String[] args) {
System.out.println("=== 开始HDFS连接测试 ===");
System.out.println("操作系统: " + System.getProperty("os.name"));
System.out.println("Java版本: " + System.getProperty("java.version"));

    try {// 测试连接FileSystem fs = HDFSConnection.getConnection();// 验证连接成功System.out.println("✓ HDFS连接成功!");System.out.println("Scheme: " + fs.getScheme());System.out.println("URI: " + fs.getUri());System.out.println("Home Directory: " + fs.getHomeDirectory());// 测试基本操作testBasicOperations(fs);fs.close();System.out.println("\n=== 所有测试通过! ===");} catch (Exception e) {System.err.println("✗ 连接失败: " + e.getClass().getName());System.err.println("错误信息: " + e.getMessage());// 详细错误分析analyzeError(e);}
}private static void testBasicOperations(FileSystem fs) throws IOException {// 创建测试目录Path testDir = new Path("/test_" + System.currentTimeMillis());if (!fs.exists(testDir)) {fs.mkdirs(testDir);System.out.println("✓ 目录创建成功: " + testDir);}// 创建测试文件Path testFile = new Path(testDir, "test.txt");try (FSDataOutputStream out = fs.create(testFile)) {out.writeUTF("Hello from IDEA at " + new Date());System.out.println("✓ 文件创建成功: " + testFile);}// 读取验证try (FSDataInputStream in = fs.open(testFile)) {String content = in.readUTF();System.out.println("✓ 文件读取成功: " + content);}// 清理fs.delete(testDir, true);System.out.println("✓ 清理完成");
}private static void analyzeError(Exception e) {System.out.println("\n=== 错误分析 ===");if (e instanceof ConnectException) {System.out.println("1. 网络连接问题:");System.out.println("   - 检查虚拟机IP: 192.168.1.105");System.out.println("   - 检查端口9000是否开放");System.out.println("   - 在虚拟机执行: netstat -tlnp | grep 9000");} else if (e.getMessage().contains("Permission denied")) {System.out.println("2. 权限问题:");System.out.println("   - 在代码中添加: System.setProperty(\"HADOOP_USER_NAME\", \"hadoop\")");System.out.println("   - 检查虚拟机用户权限");} else if (e instanceof UnknownHostException) {System.out.println("3. 主机名解析问题:");System.out.println("   - 检查IP地址是否正确");System.out.println("   - 尝试ping 192.168.1.105");}
}

}

🎯 核心问题与解决方案记录

问题1:Connection refused

现象:java.net.ConnectException: Connection refused
原因分析:

  1. Hadoop服务未启动
  2. 防火墙阻止连接
  3. IP地址配置错误
  4. 端口被占用

解决方案:

在虚拟机中检查

1. 检查Hadoop服务

jps

应输出:NameNode, DataNode, SecondaryNameNode

2. 检查端口监听

netstat -tlnp | grep java

应看到:9000端口被监听

3. 检查防火墙

sudo ufw status
sudo ufw allow 9000

4. 从本地测试连接

telnet 192.168.1.105 9000

如果能连接,说明网络通

问题2:Permission denied

现象:Permission denied: user=administrator
原因:Windows默认使用本地用户名,但HDFS中不存在该用户

解决方案:
// 关键代码:在连接前设置用户
System.setProperty("HADOOP_USER_NAME", "hadoop");

// 或者在连接时指定用户
FileSystem fs = FileSystem.get(
URI.create("hdfs://192.168.1.105:9000"),
conf,
"hadoop" // 指定用户
);

问题3:ClassNotFoundException

现象:找不到Hadoop相关类
原因:依赖包未正确引入

解决方案:

  1. 确保Maven依赖正确
  2. 或手动添加Hadoop所有jar包
  3. 检查IDEA的Module Dependencies

问题4:慢速连接/超时

现象:连接很慢,或超时错误
原因:网络延迟或配置不当

解决方案:
// 增加超时设置
conf.set("ipc.client.connect.timeout", "30000");
conf.set("ipc.client.connect.max.retries", "5");
conf.set("dfs.client.socket-timeout", "60000");
conf.set("dfs.client.socket-timeout", "60000");

📈 学习成果总结

✅ 技术掌握情况

  1. 跨平台开发环境搭建:成功建立本地IDEA + 虚拟机Hadoop的开发模式
  2. 网络配置:理解并配置了桥接网络、防火墙规则
  3. Hadoop核心配置:掌握了core-site.xml的关键配置项
  4. Java客户端编程:熟练使用Hadoop Java API远程连接HDFS
  5. 故障排除:积累了丰富的连接问题解决经验

🔧 关键技术点

  1. IP地址配置:必须使用虚拟机的实际IP,不能是localhost
  2. 用户权限处理:Windows和Linux环境下的差异处理
  3. 依赖管理:Maven依赖的正确配置方法
  4. 连接参数优化:超时和重试机制的设置

🎯 实际应用价值

这种本地开发+远程执行的模式在实际工作中非常常见:
• 开发效率高:利用本机IDE的调试功能

• 环境隔离:开发环境和运行环境分离

• 资源优化:不需要在本机运行Hadoop

• 接近生产:开发环境与生产环境架构相似

💡 深入理解与思考

  1. 架构设计思考

通过今天的实践,我理解了分布式系统开发的典型模式:
• 开发机:轻量级,专注于代码编写和调试

• 运行环境:重量级,提供完整的服务支持

• 网络通信:通过标准协议(RPC/HTTP)连接

  1. 配置文件的重要性

Hadoop的配置文件扮演了桥梁角色:
• core-site.xml:定义文件系统的基本属性

• hdfs-site.xml:定义HDFS的特定行为

• 这些配置必须在客户端和服务端保持一致

  1. 权限模型的差异

Linux和Windows在用户权限管理上的差异,导致在跨平台开发时需要特别注意:
• Linux:严格的用户权限控制

• Windows:较宽松的权限管理

• 解决方案:在代码中显式指定用户

  1. 网络调试技巧

• 使用telnet测试端口连通性

• 使用netstat检查端口监听状态

• 使用jps检查Hadoop服务状态

• 逐步验证网络链路的每个环节

🔄 实验流程优化建议

  1. 分阶段验证

第一阶段:网络连通性
↓
第二阶段:Hadoop服务状态
↓
第三阶段:Java客户端连接
↓
第四阶段:功能实现

  1. 调试日志开启

// 在代码中添加详细日志
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;

public class HDFSClient {
private static final Logger LOG = Logger.getLogger(HDFSClient.class);

static {BasicConfigurator.configure();  // 启用日志
}

}

  1. 配置管理

创建配置文件,避免硬编码:

config.properties

hdfs.url=hdfs://192.168.1.105:9000
hdfs.username=hadoop
connection.timeout=30000

📋 明日学习计划

短期计划

  1. 功能完善:完成实验要求的所有10个功能
  2. 异常处理优化:增加更完善的错误处理机制
  3. 性能测试:测试大文件上传下载性能
  4. Shell命令集成:在Java中调用Shell命令

中长期计划

  1. Web界面开发:基于Spring Boot开发HDFS管理界面
  2. 集群模式扩展:从伪分布式扩展到完全分布式
  3. 安全性增强:集成Kerberos认证
  4. 监控集成:集成Prometheus监控HDFS状态

💎 核心收获

  1. 理论与实践结合:理论知识必须通过实践才能真正掌握
  2. 问题解决能力:每个错误都是学习的机会
  3. 系统性思维:要从整体架构角度理解每个组件的作用
  4. 文档重要性:详细的配置记录能大大节省调试时间
  5. 耐心与细心:分布式系统配置需要极大的耐心和细心

📁 资源配置文件汇总

  1. 虚拟机网络配置

/etc/netplan/01-netcfg.yaml

network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: yes
dhcp6: no

  1. 本地hosts文件

Windows: C:\Windows\System32\drivers\etc\hosts

添加

192.168.1.105 hadoop-master

  1. IDEA运行配置

// .idea/runConfigurations/HDFS_Client.xml
{
"vmOptions": "-Djava.library.path=C:/hadoop/bin -DHADOOP_USER_NAME=hadoop",
"programArguments": "",
"workingDirectory": "$PROJECT_DIR$"
}

✅ 验证检查清单
虚拟机能正常启动Hadoop服务

本机能ping通虚拟机IP

本机能通过telnet连接9000端口

IDEA项目能正确引入Hadoop依赖

测试程序能成功连接HDFS

能执行基本的文件操作

能通过Web UI访问HDFS(50070端口)

相关新闻

  • PetaLinux内核定制全流程:新手入门必看图文教程
  • AD导出Gerber文件与钻孔文件同步输出技巧(操作指南)
  • Flutter 与 TensorFlow Lite:在手机上实时运行 YOLOv8 目标检测

最新新闻

  • 标准库-8.RTC实时时钟
  • 告别单调终端:用pyfiglet打造你的Python命令行艺术
  • 如何在Mac上使用CXPatcher提升CrossOver游戏性能:终极优化指南
  • 从“向内修德”到“向外料敌”:七境体系的元认知跃迁
  • 深入解析sys.set_int_max_str_digits:从ValueError到Python大整数打印的边界控制
  • 2026年6月最新劳力士中国官方售后服务网点地址及客服电话一览 - 劳力士服务中心

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号