Azure虚拟机Spark Docker中HDFS本地Windows访问超时问题排查
问题根源与解决方案
首先,那个未知IP 10.122.118.83并不是导致问题的根本原因——它只是你的Windows本地DNS解析sandbox主机名时返回的无效IP(大概率是本地DNS缓存或默认解析结果),和DataNode的真实IP无关。
你的核心问题出在Hadoop的重定向逻辑与网络配置不匹配上:
- 当你通过Azure VM公网IP访问Namenode的50070端口时,Namenode返回307重定向,但它给出的DataNode地址是容器内部设置的主机名
sandbox(因为你启动Docker时加了-h sandbox,且Hadoop配置fs.defaultFS为hdfs://sandbox:9000)。 - 你的Windows本地无法正确解析
sandbox到Azure VM的公网IP,所以会解析到无效的10.122.118.83,最终导致连接超时。 - 而同资源组内的Azure机器能正常访问,是因为它们处于同一内网环境,可以将
sandbox解析到VM的内网IP 10.0.0.7,从而正确连接DataNode。
下面是具体的修复步骤:
1. 修改Hadoop配置,让Namenode返回可外部访问的地址
进入你的Spark Docker容器,修改Hadoop的核心配置文件:
修改core-site.xml
找到${HADOOP_HOME}/etc/hadoop/core-site.xml,添加或更新以下配置:
<!-- 让客户端优先使用IP而非主机名访问DataNode --> <property> <name>dfs.client.use.datanode.hostname</name> <value>false</value> </property> <!-- 将默认文件系统地址替换为Azure VM的公网IP --> <property> <name>fs.defaultFS</name> <value>hdfs://52.234.XXX.XXX:9000</value> </property>
修改hdfs-site.xml
找到${HADOOP_HOME}/etc/hadoop/hdfs-site.xml,添加以下配置:
<!-- 关闭DataNode注册时的IP与主机名校验,避免因网络环境差异导致的注册失败 --> <property> <name>dfs.namenode.datanode.registration.ip-hostname-check</name> <value>false</value> </property>
2. 重启Hadoop服务生效配置
在Docker容器内执行命令重启Hadoop:
stop-all.sh start-all.sh
3. 验证修复效果
回到Windows本地重新执行curl命令:
curl -i -v -L http://52.234.XXX.XXX:50070/webhdfs/v1/user/helloworld.txt?op=OPEN
此时重定向地址会指向Azure VM的公网IP:50075,而非sandbox:50075,Windows就能正常连接DataNode了。
临时测试方案(可选)
如果只是临时验证功能,可以直接修改Windows的hosts文件(路径:C:\Windows\System32\drivers\etc\hosts),添加一行:
52.234.XXX.XXX sandbox
这样Windows会强制将sandbox解析到你的Azure VM公网IP,也能解决问题,但这只是临时方案,长期建议修改Hadoop配置。
内容的提问来源于stack exchange,提问作者Alice LIU
相关产品推荐
相关产品推荐

