hadoop无法访问50070端口

在搭建Hadoop 2.7.3环境时,遇到访问50070和50030端口失败但能访问8088端口的异常。尝试了重新格式化NameNode等常见解决方案无效。问题根源可能是NameNode默认端口失效。通过手动在hdfs-site.xml中配置NameNode端口为0.0.0.0,解决了访问问题。此问题仅在CentOS 7 Minimal上出现,Ubuntu 16.04则无此现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在搭建hadoop(2.7.3)环境时遇到了一件比较奇葩的问题。整个环境下JDK正常,hadoop配置文件正常,各个守护进程正常启动,防火墙已关闭,但是启动后无法从浏览器中访问50070、50030端口,显示无法访问,但是又可以访问8088端口。

启动后的守护进程
守护进程

网上的主要解决方式是重新格式化namenode 即如下命令:

以下命令在hadoop安装目录下执行

sbin/stop-hdfs.sh
sbin/stop-yarn.sh

bin/hdfs namenode -format

sbin/start-hdfs.sh
sbin/start-yarn.sh

但以上方法并没有解决我的问题,并且通过上面的方式会造成datanode守护进程无法启动的。

重新格式化namenode之前需要清空dfs下的name和data文件夹以解决datanode无法启动的问题

最后发现可能是namenode初始化默认端口失效,于是决定手动修改配置文件设置默认端口
1.hdfs-site.xml 添加如下:

<property>
  <name>dfs.http.address&l
### Hadoop 50070端口无法访问的原因分析与解决方案 HadoopNameNode Web UI 默认监听的是 50070 端口,在较新的版本中已被替换为 9870 端口。如果 Windows 客户端无法访问端口,可能涉及以下几个方面的问题: #### 1. **防火墙设置** 防火墙可能是阻止外部客户端访问的关键因素之一。即使虚拟机内部能够正常访问所有端口,但如果主机上的防火墙未开放特定端口,则外部设备(如 Windows 主机)将无法连接到这些端口。 - 可通过以下命令查看当前系统的防火墙状态并确认是否允许指定端口的流量: ```bash systemctl status firewalld ``` - 如果需要放行 TCP 50070 或者新版本中的 9870 端口,可运行如下命令[^3]: ```bash firewall-cmd --add-port=50070/tcp --permanent firewall-cmd --reload ``` #### 2. **绑定地址配置错误** NameNode 的默认监听地址通常被设定为 `localhost` (即 `127.0.0.1`),这会使得它仅接受来自本地机器的请求而忽略远程连接尝试。因此需检查 Hadoop 配置文件 (`core-site.xml`, `hdfs-site.xml`) 中的相关参数。 - 修改 `hdfs-site.xml` 文件以确保 NameNode 绑定至正确的网络接口 IP 地址而非仅仅 localhost: ```xml <property> <name>dfs.namenode.http-address</name> <value>hadoop102:50070</value> <!-- 替换 hadoop102 为主节点实际IP --> </property> ``` #### 3. **SELinux 设置冲突** 除了传统意义上的防火墙外, SELinux(安全增强型 Linux)也可能阻碍某些服务对外提供服务的能力. - 使用命令临时禁用 SELinux 来测试其影响程度: ```bash setenforce 0 ``` - 若要永久更改此行为则编辑 `/etc/selinux/config` 将其中的 `SELINUX=enforcing` 改成 `disabled`. #### 4. **代理或 NAT 层面的影响** 当使用 VMWare/VirtualBox 创建虚拟化环境时,宿主机和客户操作系统之间可能存在额外一层抽象层(NAT),这也可能导致部分端口映射失败或者不可达的情况发生。 - 对于 VirtualBox 用户而言,可以通过创建静态端口转发规则来解决这个问题;而对于 VMware Workstation Pro 则应该调整相应的网络适配器模式为桥接(Bridged Mode). --- ```python import socket def test_port(host='hadoop102', port=50070): """ 测试给定主机名/地址以及端口号是否可达 """ try: sock = socket.create_connection((host, port), timeout=5) print(f"{host}:{port} is reachable.") sock.close() except Exception as e: print(f"Unable to reach {host}:{port}. Error={e}") if __name__ == "__main__": test_port() # Example usage with default values. ``` 以上脚本可用于初步验证目标服务器上的具体端口是否可以从另一台计算机成功建立连接。 --- ### 结论 综合考虑上述几个方面的可能性之后采取相应措施解决问题。最终目的是让 master 节点(hadoop102) 上运行的服务能正确暴露出来供外界调用。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值