阿里云ECS上HDFS NameNode显示异常主机名求助
问题场景
阿里云ECS部署Hadoop 3.4.1后,执行hdfs namenode -format时启动日志显示主机名为iZib208xfvbhmyx1rha3gqZ/10.1.0.92,但系统实际主机名已设置为worker1,且hdfs getconf -namenodes返回worker1,与预期不符。
相关命令输出:
[root@worker1 hadoop-3.4.1]# hdfs namenode -format 2025-01-23 10:13:46,887 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = iZib208xfvbhmyx1rha3gqZ/10.1.0.92 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 3.4.1 [root@worker1 javademo]# hostname worker1 [root@worker1 javademo]# hostname -A worker1.cluster.local worker1 worker1 worker1 worker1 worker1 # 已配置HDFS NameNode主机名 hdfs getconf -namenodes # worker1
问题根源
从Hadoop 3.4.1的代码片段可知,NetUtils.getHostname()方法依赖InetAddress.getLocalHost()获取主机名,该方法优先读取系统/etc/hosts文件中的IP与主机名映射关系,而非直接读取系统hostname:
public static String getHostname() { try {return "" + InetAddress.getLocalHost();} catch(UnknownHostException uhe) {return "" + uhe;} }
阿里云ECS默认会在/etc/hosts中把内网IP映射到自动生成的iZxxx格式主机名,即使修改了系统hostname,Java的InetAddress.getLocalHost()仍会优先读取该映射,导致Hadoop日志显示旧主机名。
解决步骤
修改/etc/hosts文件
编辑/etc/hosts,将内网IP对应的主机名替换为worker1:vi /etc/hosts找到类似行:
10.1.0.92 iZib208xfvbhmyx1rha3gqZ修改为:
10.1.0.92 worker1 worker1.cluster.local保存退出。
验证修改生效
执行Java命令测试主机名解析结果,确认返回worker1/10.1.0.92:java -e 'System.out.println(java.net.InetAddress.getLocalHost());'重启Hadoop服务
停止所有Hadoop进程后重新启动,再次执行hdfs namenode -format(注意:格式化操作仅适用于首次启动或重置场景,执行前请备份数据),日志中host字段将显示worker1/10.1.0.92。同步Hadoop配置文件(可选)
确保所有Hadoop核心配置文件中涉及主机名的项统一使用worker1:core-site.xml的fs.defaultFS:hdfs://worker1:9000hdfs-site.xml的dfs.namenode.http-address:worker1:50070
内容的提问来源于stack exchange,提问作者yizhen liu

