hadoop集群搭建好后Datenode诡异的再master机器上开启,没有在slave机器上开启

我是一个master,3个slave
问题是这样的:
hadoop集群搭建好后在master机器上start-all.sh,结果datanode也在此机器启动没在slaves机器启动
我用的hadoop3.1+jdk1.8,之前照书上搭建的hadoop2.6+openjdk10可以搭建可以
正常启动,namenode等在master上启动,datanode等在slave上启动,现在换了新
版本就不行了,整了一天。。。

目前条件:各个机器能相互ping,也能ssh
都能正常上网
如果一台机器既做master又做slave,可以正常开启50070(当然hadoop3后改成了9870)网页,一切正常

在master上开启start-all.sh时:
WARNING: Attempting to start all Apache Hadoop daemons as hduser in 10 seconds.
WARNING: This is not a recommended production deployment configuration.
WARNING: Use CTRL-C to abort.
Starting namenodes on [emaster]
Starting datanodes
Starting secondary namenodes [emaster]
2018-05-04 22:39:37,858 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting resourcemanager
Starting nodemanagers

根本没有去找slave
jps后发现:
3233 SecondaryNameNode
3492 ResourceManager
2836 NameNode
3653 NodeManager
3973 Jps
3003 DataNode
全都在master上启动了,slave机器什么也没启动

查看datanode日志,发现它开了3次master的datanode(我的master名字是emaster):(展示部分)
STARTUP_MSG: Starting DataNode
STARTUP_MSG: host = emaster/192.168.56.100
STARTUP_MSG: args = []
STARTUP_MSG: version = 3.1.0

而且每遍有报错:

 java.io.EOFException: End of File Exception between local host is: "emaster/192.168.56.100"; destination host is: "emaster":9000; : java.io.EOFException; For more details see:  http://wiki.apache.org/hadoop/EOFException
    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:408)
    at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:831)
    at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:789)
    at org.apache.hadoop.ipc.Client.getRpcResponse(Client.java:1495)
    at org.apache.hadoop.ipc.Client.call(Client.java:1437)
    at org.apache.hadoop.ipc.Client.call(Client.java:1347)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:228)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:116)
    at com.sun.proxy.$Proxy20.sendHeartbeat(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolClientSideTranslatorPB.sendHeartbeat(DatanodeProtocolClientSideTranslatorPB.java:166)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.sendHeartBeat(BPServiceActor.java:514)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.offerService(BPServiceActor.java:645)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:841)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at org.apache.hadoop.ipc.Client$IpcStreams.readResponse(Client.java:1796)
    at org.apache.hadoop.ipc.Client$Connection.receiveRpcResponse(Client.java:1165)
    at org.apache.hadoop.ipc.Client$Connection.run(Client.java:1061)
2018-05-04 21:49:43,320 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: RECEIVED SIGNAL 15: SIGTERM

我的猜测,我设置了3台slave,却不知道哪里配置出了问题,使得master不去开启
slave的datanode,却开启自己的datanode,但我实在找不出哪里出错了,什么
masters文件,slaves文件都配了啊,而且各个机器间可以ping通,有大神可以指点下本小白吗,真的万分感谢!!!!

Hadoop3要用workers代替之前版本的slaves。我配的时候也在这里被坑了

https://blog.csdn.net/l1902090/article/details/37740959

搭建了一个小的实验集群,一共4台机器,一台namenode,三台datenode。执行start-all,发现在namenode上没有报任何错误,但是启动后直接显示datenode数量为0。
到datenode上查看日志,发现有这么个错误: ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs。百度后发现出现这个问题一般是datenode中的数据文件出了问题。这时我想到自己的几台datenode是直接由namenode中的系统复制过来,而我并没有设置hadoop.tmp.dir参数,也就是默认存储在/tmp目录中,这就跟直接namenode单机时存储的临时文件冲突了才造成了以上问题。解决方法也很简单,将tmp文件夹中的过期临时文件清楚,或者另外设置hadoop.tmp.dir参数指定新的临时文件夹。这里我选择了后者,因为我发现/tmp目录下的文件经常会受到损坏。
解决了上面这个错误后,datenode终于有一个了,但是我有三台datenode,应该显示3个datenode啊!接着看另外两台的日志,发现里面有大量无法连接到namenode的错误,因为我设置namenode时用的是主机名而非ip地址,看来应该是因为hosts文件设置错误。打开/etc/hosts文件,果然namenode的主机名对应地址误设为了127.0.0.1,改过来之后,再次重新格式化hdfs,start-all,终于能看到3个datenode了,真不容易。
总结一下,如果namenode能够成功启动,但是datenode显示为0,那么问题一般是出在datenode上。这时候我们可以前往datenode机器上查看/var/log/hadoop下的日志文件,里边应该会有一些错误提示,然后根据错误提示就能大体知道问题的所在。可能发生的问题无外乎下边几种:
1、datenode机器上的hadoop后台无法启动。出现这个问题的原因很多样,比如笔者这次就遇上了tmp文件夹中存在失效文件的问题。
2、datenode无法与namenode通信。出现这种问题一般都是网络设置有误,仔细排查网络设置后应该就能找到解决办法。如果datenode机器上的问题排除,那么出现这个错误也有可能是因为namenode上设置的监听地址有误造成的,可以在namenode上运行netstat命令看一看hadoop后台有没有在预期地址:端口上监听。

搞了一早上终于成功了,hadoop2好像是在/etc/hadoop设置masters 和slaves 现在hadoop3是要设置masters 和workers。
真的好坑。。。