hadoop中filesystem无法显示( Can't browse the DFS since there are no live nodes available to redirect to.)

在Hadoop 2.2.0版本中,尝试通过filesystem访问DFS时遇到了HTTP 500错误,原因是使用了已废弃的`hadoop -namenode -format`命令。正确的做法是使用`hdfs namenode -format`进行HDFS初始化。问题解决方法包括:停止所有Hadoop进程,重新格式化,以及确保datanode未启动的情况下,检查并统一`dfs.name.dir/current/VERSION`中的clusterID,以匹配namenode的clusterID。完成这些步骤后,重启服务即可解决问题。

2.2.0版本中通过filesystem进入
http://192.168.211.128:50070/nn_browsedfscontent.jsp
界面显示如下:


HTTP ERROR 500

Problem accessing /nn_browsedfscontent.jsp. Reason:

Can't browse the DFS since there are no live nodes available to redirect to.

Caused by:

java.io.IOException: Can’t browse the DFS since there are no live nodes available to redirect to.
at org.apache.hadoop.hdfs.server.namenode.NamenodeJspHelper.redirectToRandomDataNode(NamenodeJspHelper.java:646)
at org.apache.hadoop.hdfs.server.namenode.nn_005fbrowsedfscontent_jsp._jspService(nn_005fbrowsedfscontent_jsp.java:70)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler CachedChain.doFilter(ServletHandler.java:1221)atorg.apache.hadoop.http.lib.StaticUserWebFilter StaticUserFilter.doFilter(StaticUserWebFilter.java:109)
at org.mortbay.jetty.servlet.ServletHandler CachedChain.doFilter(ServletHandler.java:1212)atorg.apache.hadoop.http.HttpServer QuotingInputFilter.doFilter(HttpServer.java:1081)
at org.mortbay.jetty.servlet.ServletHandler CachedChain.doFilter(ServletHandler.java:1212)atorg.apache.hadoop.http.NoCacheFilter.doFilter(NoCacheFilter.java:45)atorg.mortbay.jetty.servlet.ServletHandler CachedChain.doFilter(ServletHandler.java:1212)
at org.apache.hadoop.http.NoCacheFilter.doFilter(NoCacheFilter.java:45)
at org.mortbay.jetty.servlet.ServletHandler CachedChain.doFilter(ServletHandler.java:1212)atorg.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)atorg.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)atorg.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)atorg.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)atorg.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)atorg.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)atorg.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)atorg.mortbay.jetty.Server.handle(Server.java:326)atorg.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)atorg.mortbay.jetty.HttpConnection RequestHandler.headerComplete(HttpConnection.java:928)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Powered by Jetty://


导致这种错误的原因是使用2.2.0版本就废弃的hadoop -namenode -format进行hdfs初始化,应该使用hdfs namenode
-format进行。
解决办法为先停止所有hadoop相关进程,然后使用hdfs namenode -format格式化再重启服务。

重启后产生了新的问题,使用jps查看hadoop进程发现datanode没有启动。以前也遇到过,是因为在配置文件中dfs.name.dir的路径下的/current/VERSION中每次格式化VERSION的clusterID会产生一个新的ID。
解决办法为:
查看hadoop目录下log目录下datanode相关的log文件,

这里写图片描述

找到namenode下面的clusterID,

这里写图片描述

修改dfs.name.dir/current/VERSION 里面的clusterID使二者一致。修改后保存重启服务即可。

这里写图片描述

Exception in thread "main" java.lang.IllegalArgumentException: java.net.UnknownHostException: nodes at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:406) at org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:310) at org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:176) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:749) at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:680) at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:158) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2816) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:98) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2853) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2835) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:387) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:296) at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPaths(FileInputFormat.java:507) at cn.edu.abtu.job.WordCountJob.main(WordCountJob.java:31) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:221) at org.apache.hadoop.util.RunJar.main(RunJar.java:136) Caused by: java.net.UnknownHostException: nodes ... 20 more
最新发布
04-30
<think>好的,我现在需要解决用户遇到的Hadoop中的IllegalArgumentException,原因是UnknownHostException。这个问题通常和主机名解析有关,所以我要先理清可能的触发场景和解决步骤。 首先,用户提到的异常堆栈可能涉及到Hadoop客户端无法解析某个主机名,比如NameNode或DataNode的地址。这时候需要检查几个方面:配置文件中的主机名是否正确,DNS解析是否正常,网络是否通畅,以及是否启用了HA配置但没有正确设置。 然后,我需要回顾用户提供的引用内容,里面有一个Java代码片段,涉及读取缓存文件,可能用户在处理MapReduce任务时遇到了这个问题。代码中使用了Hadoop相关的类,比如Mapper、Text等,但引用内容并没有直接关联到主机解析的问题。不过,这可能提示用户在任务执行过程中访问HDFS时出现问题,需要确认HDFS服务的可达性。 接下来,解决方案可能包括检查core-site.xml和hdfs-site.xml中的配置,特别是fs.defaultFS的地址是否正确,主机名是否存在拼写错误。然后,测试DNS解析,使用ping或nslookup命令验证主机名能否解析到正确的IP。如果使用IP地址替代主机名是否能解决问题,这样可以绕过DNS问题。 另外,如果Hadoop集群启用了高可用性(HA),需要确认相关配置是否正确,比如dfs.nameservices和对应的namenode ID配置。同时,检查客户端的Hadoop版本是否与集群一致,避免兼容性问题。防火墙设置也可能导致连接被拒绝,需要确认端口是否开放,比如NameNode的8020端口。 最后,查看Hadoop日志,如NameNode和DataNode的日志,以及客户端的错误日志,可以帮助定位具体问题。用户可能需要提供更详细的错误堆栈以便进一步分析。 现在需要将这些思考整理成结构化的解决方案,分步骤说明,并生成相关问题供用户参考。</think>针对Hadoop中出现$IllegalArgumentException$由$UnknownHostException$引发的问题,以下是系统级解决方案和排查路径: ### 一、问题根源分析 该异常通常发生在Hadoop客户端无法解析集群节点主机名时,常见触发场景包括: 1. 核心配置文件($core-site.xml$/$hdfs-site.xml$)中配置的主机名与实际DNS记录不匹配 2. 未正确配置Hadoop高可用(HA)导致地址解析异常 3. 客户端与集群网络连接异常或DNS服务不可达 4. 安全认证配置错误导致Kerberos反向解析失败[^1] ### 二、分步解决方案 #### 1. 验证基础配置 检查$core-site.xml$中关键配置项: ```xml <property> <name>fs.defaultFS</name> <value>hdfs://namenode-host:8020</value> <!-- 确认主机名可解析 --> </property> ``` 使用命令测试DNS解析: ```bash nslookup namenode-host # 替换实际主机名 ping -c 4 namenode-host ``` #### 2. HA集群特殊处理 若使用高可用配置,需确保$hdfs-site.xml$包含: ```xml <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> <!-- 确认节点ID对应真实主机 --> </property> ``` #### 3. 强制IP解析(临时方案) 在/etc/hosts中添加静态映射: ``` 192.168.1.100 namenode-host 192.168.1.101 datanode01 ``` #### 4. 安全模式排查 当启用Kerberos时,检查$krb5.conf$的域名配置: ``` [realms] EXAMPLE.COM = { kdc = kdc-host.example.com admin_server = admin-host.example.com } ``` ### 三、代码层修复 在MapReduce作业中显式设置配置参数: ```java Configuration conf = new Configuration(); conf.set("fs.defaultFS", "hdfs://namenode-ip:8020"); // 使用IP绕过DNS DistributedFileSystem dfs = (DistributedFileSystem)FileSystem.get(conf); ``` ### 四、日志分析要点 检查NameNode日志定位具体解析失败点: ```bash tail -f /var/log/hadoop-hdfs/hadoop-hdfs-namenode-*.log ``` 典型错误模式: ``` java.net.UnknownHostException: datanode03.cluster at java.net.InetAddress.getLocalHost(InetAddress.java:1506) at org.apache.hadoop.security.SecurityUtil.getLocalHostName(SecurityUtil.java:261) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值