主机windows虚拟机centos的hadoop调试mapreduce访问hdfs文件
现在的场景是:
🖥️ 主机(Windows)装了 IDEA
🖧 VMware 里跑着一个 CentOS 虚拟机,虚拟机里部署了 Hadoop 集群
💡 目标:在主机的 IDEA 中调试运行 MapReduce 程序,让它访问虚拟机里的 Hadoop 文件(HDFS)
🧠 核心思路
主机上的 IDEA 只是写代码、打 jar 包,实际运行时通过 网络访问虚拟机里的 Hadoop 服务。
要做到这一点,只要 保证主机可以访问虚拟机的 Hadoop 集群(namenode、datanode),并且在代码中指定正确的 HDFS 地址即可。
🧩 一、配置 VMware 网络
打开 VMware → 选择你的 CentOS 虚拟机 → 设置 → 网络适配器
把网络模式改成:
桥接(Bridged)模式:虚拟机和主机处于同一网段(推荐)
或者 NAT 模式:虚拟机通过主机上网,也行,但主机访问虚拟机需要设置端口转发
启动 CentOS 虚拟机,执行命令获取虚拟机 IP:
ip addr show
记住它的 IP(如
192.168.1.120
)在主机命令行测试能不能 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
主机 IDEA 创建 Java / Maven 项目
添加 Hadoop 依赖(参考我上条信息的做法)
在代码中这样写:
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");
运行参数:
/user/asfor/input /user/asfor/output
运行时 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 Web | Hadoop 没启动 | start-dfs.sh 、start-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);}
}