在测试集群上拉了5台机器,自己另外搭建了一个小集群,不影响原来的集群。
1.规划,jobtracker一台,namenode一台,datanode三台,secondNamenode和网关机一台
2.新建用户lxw,并打通无密码ssh
3.安装版本0.20.2
完成之后先启动namenode和jobtracker,接着启动一台datanode时候报错
2012-05-28 17:35:23,625 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.net.SocketException: Permission denied at sun.nio.ch.Net.bind(Native Method) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126) at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59) at org.mortbay.jetty.nio.SelectChannelConnector.open(SelectChannelConnector.java:216) at org.apache.hadoop.http.HttpServer.start(HttpServer.java:425) at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:375) at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:216) at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1283) at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1238) at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1246) at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1368)
查看源代码,DataNode.startDataNode,
该处涉及到三个属性值,
String address = NetUtils.getServerAddress(conf, "dfs.datanode.bindAddress", "dfs.datanode.port", "dfs.datanode.address");
觉得是新建的用户没有权限在绑定dfs.datanode.address默认端口(1004),于是修改hdfs-site.xml
添加或修改下面三个属性:
<property> <name>dfs.datanode.address</name> <value>0.0.0.0:9999</value> </property> <property> <name>dfs.datanode.http.address</name> <value>0.0.0.0:9998</value> </property> <property> <name>dfs.datanode.ipc.address</name> <value>0.0.0.0:9997</value> </property>
因为机器上还运行着测试集群的tasktracker和datanode,有些默认端口已经被占用,这时候需要修改端口号,比如tasktracker对应的:
<property> <name>mapred.task.tracker.http.address </name> <value>0.0.0.0:9996</value> </property>
问题解决!