华为云ECS上搭建Hadoop集群环境启动时报错“java.net.BindException: Cannot assign requested address”问题的解决
阅读原文时间:2023年09月07日阅读:3

启动时使用:

./sbin/start-all.sh

1

报错:

java.net.BindException: Problem binding to [test7972:9000] java.net.BindException: Cannot assign requested address; For more details see: http://wiki.apache.org/hadoop/BindException

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:824)

at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:735)

at org.apache.hadoop.ipc.Server.bind(Server.java:561)

at org.apache.hadoop.ipc.ServerL i s t e n e r . < i n i t > ( S e r v e r . j a v a : 1037 ) a t o r g . a p a c h e . h a d o o p . i p c . S e r v e r . < i n i t > ( S e r v e r . j a v a : 2738 ) a t o r g . a p a c h e . h a d o o p . i p c . R P C Listener.(Server.java:1037) at org.apache.hadoop.ipc.Server.(Server.java:2738) at org.apache.hadoop.ipc.RPCListener.(Server.java:1037)atorg.apache.hadoop.ipc.Server.(Server.java:2738)atorg.apache.hadoop.ipc.RPCServer.(RPC.java:958)

at org.apache.hadoop.ipc.ProtobufRpcEngineS e r v e r . < i n i t > ( P r o t o b u f R p c E n g i n e . j a v a : 420 ) a t o r g . a p a c h e . h a d o o p . i p c . P r o t o b u f R p c E n g i n e . g e t S e r v e r ( P r o t o b u f R p c E n g i n e . j a v a : 341 ) a t o r g . a p a c h e . h a d o o p . i p c . R P C Server.(ProtobufRpcEngine.java:420) at org.apache.hadoop.ipc.ProtobufRpcEngine.getServer(ProtobufRpcEngine.java:341) at org.apache.hadoop.ipc.RPCServer.(ProtobufRpcEngine.java:420)atorg.apache.hadoop.ipc.ProtobufRpcEngine.getServer(ProtobufRpcEngine.java:341)atorg.apache.hadoop.ipc.RPCBuilder.build(RPC.java:800)

at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.(NameNodeRpcServer.java:431)

at org.apache.hadoop.hdfs.server.namenode.NameNode.createRpcServer(NameNode.java:803)

at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:730)

at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:953)

at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:932)

at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1673)

at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1741)

Caused by: java.net.BindException: Cannot assign requested address

at sun.nio.ch.Net.bind0(Native Method)

at sun.nio.ch.Net.bind(Net.java:433)

at sun.nio.ch.Net.bind(Net.java:425)

at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)

at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)

at org.apache.hadoop.ipc.Server.bind(Server.java:544)

… 13 more

这里要注意: 这个错误是服务器ip识别问题造成的,在文件:

/etc/hosts

中设置ip与域名的匹配时:

1.在本机上的操作,都要设置成内网ip

2.其它机器上的操作,要设置成外网ip

那么具体的解决办法就是:

1.在Master服务器上,要将自己的ip设置成内网ip,而将另一台Slave服务器的ip设置成外网ip;

2.同样的在Slave服务器上,要将自己的ip设置成内网ip,而将另一台Master服务器的ip设置成外网ip。

这个问题确实有点棘手,之前我也没有想到是运营商服务器自身的网络问题,以后使用公有云搭建Hadoop集群要注意了!一方面要考虑系统间的交互速度,使用内网地址;另一方面还要考虑公有云自身与外界连接,使用外网地址;除此之外公有云运营商的网络规则我们是不清楚的,内网和外网之间有什么限制、规则我们不清楚。这些共同造成了这个问题的出现。