今天用阿里的服務器搭了個偽分布式的HDFS,格式化后啟動hdfs,發現只有dataNode啟動了,查看啟動日志發現異常:
2019-01-22 15:54:50,507 FATAL org.apache.hadoop.hdfs.server.namenode.NameNode: Failed to start namenode.
java.net.BindException: Problem binding to [node01: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:791)
at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:720)
at org.apache.hadoop.ipc.Server.bind(Server.java:424)
at org.apache.hadoop.ipc.Server$Listener.<init>(Server.java:573)
at org.apache.hadoop.ipc.Server.<init>(Server.java:2206)
at org.apache.hadoop.ipc.RPC$Server.<init>(RPC.java:944)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Server.<init>(ProtobufRpcEngine.java:537)
at org.apache.hadoop.ipc.ProtobufRpcEngine.getServer(ProtobufRpcEngine.java:512)
at org.apache.hadoop.ipc.RPC$Builder.build(RPC.java:789)
at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.<init>(NameNodeRpcServer.java:331)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createRpcServer(NameNode.java:627)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:600)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:765)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:749)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1446)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1512)
針對找個異常,首先是要確定自己的配置文件有沒有配置錯誤,檢查了一遍沒錯呀。然后就去官網看看什么原因(點擊查看官網關於此異常介紹),官網上的內容如下:
根據官網介紹,出現這種情況要么是9000端口被占用了,要么就是hdfs在EC2上運行,那么hdfs服務將嘗試使用公共主機名或IP顯式綁定公共彈性IP地址,或者隱式使用“0.0.0.0”作為地址。
首先看看9000端口有沒有被占用,輸入官網提供的指令: netstat -a -t --numeric-ports -p,發現9000端口並沒有被占用,那么就是第二個原因了。百度了一下阿里的ECS服務器無法綁定公網IP的地址,細心的人應該能發現連接服務器的ip和你連接服務器后,輸入ifconfig顯示的ip地址不一致。如下圖,可以看到網段都不一樣:
所以要解決這個BindException,直接修改/etc/hosts文件:
內網IP地址 hostname1
公網IP地址 hostname2
注意:內網IP對應的hostname要和hadoop的配置文件core-site.xml的hostname對應。
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/abc/hadoop/local</value>
</property>
修改完成后重新格式化,hdfs就可以正常啟動了。