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

主机windows虚拟机centos的hadoop调试mapreduce访问hdfs文件

现在的场景是:

🖥️ 主机(Windows)装了 IDEA
🖧 VMware 里跑着一个 CentOS 虚拟机,虚拟机里部署了 Hadoop 集群
💡 目标:在主机的 IDEA 中调试运行 MapReduce 程序,让它访问虚拟机里的 Hadoop 文件(HDFS)


🧠 核心思路

主机上的 IDEA 只是写代码、打 jar 包,实际运行时通过 网络访问虚拟机里的 Hadoop 服务

要做到这一点,只要 保证主机可以访问虚拟机的 Hadoop 集群(namenode、datanode),并且在代码中指定正确的 HDFS 地址即可。


🧩 一、配置 VMware 网络

  1. 打开 VMware → 选择你的 CentOS 虚拟机 → 设置 → 网络适配器

  2. 把网络模式改成:

    • 桥接(Bridged)模式:虚拟机和主机处于同一网段(推荐)

    • 或者 NAT 模式:虚拟机通过主机上网,也行,但主机访问虚拟机需要设置端口转发

  3. 启动 CentOS 虚拟机,执行命令获取虚拟机 IP:

    ip addr show
    

    记住它的 IP(如 192.168.1.120

  4. 在主机命令行测试能不能 ping 通虚拟机:

    ping 192.168.176.130
    

⚙️ 二、确认 Hadoop 服务可远程访问

在虚拟机 CentOS 里,启动 Hadoop:

start-dfs.sh
start-yarn.sh

查看 namenode 地址:

hdfs getconf -confKey fs.defaultFS

一般会返回:

hdfs://localhost:9000

你需要把它改成虚拟机的实际 IP,例如:

<!-- /opt/hadoop/etc/hadoop/core-site.xml -->
<configuration><property><name>fs.defaultFS</name><value>hdfs://192.168.176.130:9000</value></property>
</configuration>

即使使用将192.168.176.130改为localhost也能访问192.168.176.130的ip的webui页面。

<!-- /opt/hadoop/etc/hadoop/core-site.xml -->
<configuration><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property>
</configuration>

然后重启 Hadoop:

stop-dfs.sh
start-dfs.sh

现在你主机浏览器打开:

http://192.168.176.130:9870/

如果还是访问不了,就是虚拟机centos操作系统的防火墙没有允许端口开放。

sudo firewall-cmd --add-port=9864/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

列出所有防火墙允许的端口:

sudo firewall-cmd --list-ports

添加允许的端口:

sudo firewall-cmd --add-port=9864/tcp --permanent

其中的warning表示已经开放端口了。

只有运行接下来的命令才开始生效。

sudo firewall-cmd --reload

还有第二种方法:

直接关闭防火墙:

测试前可以临时关闭防火墙:

sudo systemctl stop firewalld

启动防火墙:

sudo systemctl start firewalld


应该能看到 Hadoop Web 界面,说明主机已经能访问虚拟机里的 Hadoop。


📝 三、主机 IDEA 访问虚拟机 Hadoop

  1. 主机 IDEA 创建 Java / Maven 项目

  2. 添加 Hadoop 依赖(参考我上条信息的做法)

  3. 在代码中这样写:

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.1.120:9000"); // 虚拟机 Hadoop IP
conf.set("mapreduce.framework.name", "yarn");
conf.set("yarn.resourcemanager.address", "192.168.1.120:8032");
conf.set("mapreduce.jobhistory.address", "192.168.1.120:10020");
  1. 运行参数:

/user/asfor/input /user/asfor/output
  1. 运行时 VM options(可选):

-DHADOOP_USER_NAME=asfor

📁 四、调试时访问虚拟机的 HDFS 文件

虚拟机中准备输入文件:

hdfs dfs -mkdir -p /user/asfor/input
hdfs dfs -put /test/hadoopput/text.txt /user/asfor/input

主机上运行 MapReduce 时,它会自动通过网络访问虚拟机中的 /user/asfor/input/user/asfor/output


📌 五、整体流程图

+-----------------------+        网络访问        +-------------------------+
|     主机 Windows      | <--------------------> |  VMware 中的 CentOS     |
|  IDEA 写代码+调试     |                       |  Hadoop (namenode等)     |
+-----------------------+                       +-------------------------+|                                                   ↑| Hadoop 配置中写虚拟机 IP                          |└──────────────────────────────────────────────────┘

⚡ 六、常见问题排查

问题原因解决
访问 HDFS 报 Connection refused虚拟机 IP 写成了 localhost改成 192.168.x.x
ping 不通虚拟机网络模式不对用桥接模式
主机无法访问 Hadoop WebHadoop 没启动start-dfs.shstart-yarn.sh
权限不足没指定 Hadoop 用户-DHADOOP_USER_NAME=asfor

📝 示例代码:写入 HDFS 文件

java代码如下:

package org.example;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;import java.io.OutputStreamWriter;
import java.io.BufferedWriter;public class HDFSWriteFile {public static void main(String[] args) throws Exception {// 1. 创建 Hadoop 配置Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://192.168.176.130:9000");  // 这里写你的 NameNode 地址conf.set("dfs.client.use.datanode.hostname", "true");// 2. 获取 HDFS 文件系统对象FileSystem fs = FileSystem.get(conf);// 3. 定义 HDFS 路径Path path = new Path("/user/asfor/hello.txt");// 4. 如果文件已存在,先删除(可选)if (fs.exists(path)) {fs.delete(path, true);}// 5. 创建文件并写入数据FSDataOutputStream out = fs.create(path);BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));writer.write("你好,HDFS!\n");writer.write("这是一段写入 HDFS 的测试内容。\n");writer.close();// 6. 关闭文件系统fs.close();System.out.println("文件已写入到 HDFS: " + path);}
}

http://www.dtcms.com/a/391043.html

相关文章:

  • 嵌入式Linux C语言程序设计
  • 【开题答辩全过程】以 基于Python的电影数据爬取及可视化分析为例,包含答辩的问题和答案
  • 推荐一些适合新手的Java项目教程
  • 探索PV操作:并发编程的核心钥匙
  • 一计算机网络基本概念-体系结构-思考题
  • Teslasuit动捕服的实际应用,系统利用电肌肉刺激为用户在VR中提供逼真的感觉和触觉
  • 【DMA】深入解析DMA控制器架构与运作原理
  • wayland 下 带特殊权限的 Qt GUI 程序 部署为 开机自启+守护进程
  • 无事随笔——mp踩坑
  • 根据后端给定的swagger文档生成对应的ts接口
  • 《黑天鹅》
  • docker编写java的jar步骤
  • HDR简介
  • 视觉Slam14讲笔记第4讲李群李代数【更新中】
  • 【无人机】ardupilot事项笔记
  • 大端模式与小端模式
  • Openwrt 平台下移植rk3568 rknn_yolov5_demo 应用程序问题分析
  • Dioxus后端代码
  • 概念篇:ReactJS + AppSync + DynamoDB 性能优化核心概念
  • 实践篇:ReactJS + AppSync + DynamoDB 性能优化实践
  • GPS 定位:守护财产安全的 “隐形防盗锁”
  • Vue3 + Three.js 进阶实战:批量 3D 模型高效可视化、性能优化与兼容性解决方案
  • 海外VPS索引版本兼容性检查,版本兼容问题检测与多系统适配方法
  • uniapp 常用
  • C语言入门教程 | 阶段一:基础语法讲解(数据类型与运算符)
  • 现代AI工具深度解析:从GPT到多模态的技术革命与实战应用
  • 自由学习记录(101)
  • 2025最新口红机防篡改版本源码
  • Unity2D-图片导入设置
  • 今日赛事前瞻:德甲:斯图加特VS圣保利,意甲:莱切VS卡利亚里