Hadoop 格式化HDFS报错java.net.UnknownHostException: centos64

博客主要讲述Hadoop格式化HDFS时的问题。执行hadoop namenode -format命令出现未知主机名,执行/bin/start-all.sh不成功。原因是hostname获取的主机名在/etc/hosts文件中无映射。解决办法是在/etc/hosts中修改让主机名有对应IP,或修改/etc/sysconfig/network中的hostname为localhost并重启网络。

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

异常描述

在对HDFS格式化,执行hadoop namenode -format命令时,出现未知的主机名的问题,异常信息如下所示:

 [shirdrn@localhost bin]$ hadoop namenode -format
11/06/22 07:33:31 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   <span style="color: #ff0000;">host = java.net.UnknownHostException: centos64:centos64
</span>STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 0.20.0
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.20 -r 763504; compiled by 'ndaley' on Thu Apr  9 05:18:40 UTC 2009
************************************************************/
Re-format filesystem in /tmp/hadoop/hadoop-shirdrn/dfs/name ? (Y or N) Y
11/06/22 07:33:36 INFO namenode.FSNamesystem: fsOwner=shirdrn,shirdrn
11/06/22 07:33:36 INFO namenode.FSNamesystem: supergroup=supergroup
11/06/22 07:33:36 INFO namenode.FSNamesystem: isPermissionEnabled=true
11/06/22 07:33:36 INFO metrics.MetricsUtil: Unable to obtain hostName
java.net.UnknownHostException: <span style="color: #ff0000;">localhost.localdomain: localhost.localdomain
</span>        at java.net.InetAddress.getLocalHost(InetAddress.java:1353)
        at org.apache.hadoop.metrics.MetricsUtil.getHostName(MetricsUtil.java:91)
        at org.apache.hadoop.metrics.MetricsUtil.createRecord(MetricsUtil.java:80)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.initialize(FSDirectory.java:73)
        at org.apache.hadoop.hdfs.server.namenode.FSDirectory.<init>(FSDirectory.java:68)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.<init>(FSNamesystem.java:370)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:853)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:947)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:964)
11/06/22 07:33:36 INFO common.Storage: Image file of size 97 saved in 0 seconds.
11/06/22 07:33:36 INFO common.Storage: Storage directory /tmp/hadoop/hadoop-shirdrn/dfs/name has been successfully formatted.
11/06/22 07:33:36 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: localhost.localdomain: localhost.localdomain
************************************************************/

再执行 /bin/start-all.sh 就不成功。

通过执行hostname命令可以看到(由自己情况决定):

[shirdrn@localhost bin]# hostname
centos64&nbsp;

也就是说,Hadoop在格式化HDFS的时候,通过hostname命令获取到的主机名是centos64,然后在/etc/hosts文件中进行映射的时候,没有找到,看下我的/etc/hosts内容:

[root@localhost bin]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1                   localhost       localhost
192.168.18.130           localhost       localhost

在:查看一下/etc/sysconfig/network文件: 保存的是hostname 也就是主机名 。

在 /etc/hosts 中修改:

127.0.0.1                   localhost       centos64
192.168.18.130           localhost      centos64

让主机名centos64 在 hosts中能有一个IP与之相映射对应 。

2. 或修改 /etc/sysconfig/network 中的 hostname 为 localhost(要保证映射名称一致)

再:[root@localhost bin]# /etc/rc.d/init.d/network restart  

以上修改完后,再执行格式化HDFS命令,以及启动HDFS集群就正常了。

 

转自:

https://lihongchao87.iteye.com/blog/1998347

表示感谢!!

### 解决方案 `java.lang.IllegalArgumentException: java.net.UnknownHostException` 错误通常表明程序试图通过无法解析的主机名访问远程节点。以下是针对此问题的具体分析和解决方案: #### 1. **检查主机名解析** 主机名 `hadoop2` 可能未被正确解析为 IP 地址。可以通过编辑 `/etc/hosts` 文件来手动添加映射关系[^2]。 编辑 `hosts` 文件并加入以下内容: ```plaintext 192.168.x.x hadoop2 ``` 替换 `192.168.x.x` 为实际的 IP 地址,并确保该地址可正常通信。 #### 2. **验证网络连通性** 使用命令测试本地到目标主机的连通性: ```bash ping hadoop2 nslookup hadoop2 ``` 如果这些工具返回失败,则说明 DNS 或静态映射存在问题,需进一步排查。 #### 3. **确认 Hadoop 配置文件** 在 Hadoop 的核心配置文件中(如 `core-site.xml`, `hdfs-site.xml`),确保所有涉及主机名的地方均正确无误[^3]。例如,在 `core-site.xml` 中设置如下属性: ```xml <property> <name>fs.defaultFS</name> <value>hdfs://hadoop2:9000</value> </property> ``` 同时建议禁用权限控制以减少潜在冲突: ```xml <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> ``` #### 4. **检查防火墙与安全组** 确认服务器上的防火墙规则允许必要的端口流量(默认情况下 HDFS 使用的是 9000 和其他相关端口)。如果运行于云环境中,还需调整对应的安全组策略[^1]。 #### 5. **调试日志级别提升** 提升 Hadoop 日志记录等级可以帮助定位更深层次的原因。修改 `log4j.properties` 设置: ```properties log4j.rootLogger=DEBUG, console ``` --- ### 示例代码片段 以下是一个简单的 Java 客户端示例,用于连接至指定名称节点并读取数据流。注意替换变量值以匹配您的环境。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSTest { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://hadoop2:9000"); FileSystem fs = FileSystem.get(conf); Path path = new Path("/example.txt"); if (fs.exists(path)) { System.out.println("File exists."); } else { System.out.println("File does not exist."); } fs.close(); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值