用几台虚拟机搭建hadoop集群,中间出了很多问题,这里暂且记录一下。

  先提醒各位同学,有任何问题先看日志,有问题看日志,有问题看日志。

  不会看日志?不知道各个日志是用来干嘛的?我也不知道,自己百度谷歌吧。

  1 slaves文件需要同步吗?

    目测是不需要的,在用hadoop/sbin/start-dfs.sh启动hdfs的时候,执行脚本的主机先分析core-site.xml,找到namenode,然后通过ssh到namenode上启动starr-dfs.sh。之后会根据namenode上的slaves文件启动各个datanode节点。(这个过程是实践过程猜测的启动流程)

  2 启动了datanode但是datanode无法和namenode通信。

    这种情况首先考虑防火墙,如果关掉防火墙,通信正常那么问题就在防火墙上。如果关掉防火墙日志还是提示原来的错误,那么应该就是系统配置或者hadoop配置的问题。根据情况具体分析。

  3 关闭防火墙,datanode还是提示Problem connecting to server:XXX。

    首先根据提示,看看datanode是否根据host名分析出了namenode的ip地址,如果ip有问题,先修改datanode的host信息。

    如果ip没问题,到namenode上"netstat -anp | grep PORT",查看namenode上相关的端口是否正常开放。如果未开放,则应该是hadoop配置有问题,找相关资料自行解决。

    如果端口正常开放,请务必注意,侦听该端口对应的ip是不是namenode的ip,如果是127.0.0.1这个地址是不行的,这样只有该主机能访问该端口,相当于说我开这个端口是对127.0.0.1,这个ip是环路ip,其他机器访问这个的时候无法通过127.0.0.1访问该端口。

    为什么会出现机器侦听环路ip?因为你在配置的hadoop的时候没有使用ip,而是使用主机名如master,这个时候有个问题,这个master主机很可能无法通过master访问自己。为什么无法访问自己?即便你把hostname改成master,如果你不在hosts文件中配置master对应的ip,相关服务在访问master的时候还是不知道master对应哪台主机,这个时候一定是hosts文件起作用,hostname是没用的。所以你需要在hosts文件里面配置master。这个时候如果你一抽风,会考虑这个问题"配成127.0.0.1多好,自己能访问自己,改ip后还是能访问?",如果你因为考虑了类似这样的问题,真把master的ip配置成127.0.0.1,那恭喜你,hadoop在创建相关进程的时候,也会去找相关主机,然后他就找到了127.0.0.1,然后就侦听这个地址的相关端口,然后其他机器就没办法访问这个端口。

    所以,造成这个问题一般有两个要素,你在配置hadoop的时候,用了主机名而不是ip,其次你在相关的机器上在hosts文件中把该主机名对应的ip配置成127.0.0.1。发现这个问题就是在用netstat命令查看相关端口的时候一定要注意侦听该端口的ip地址有没有问题。

    以上思路是解决类似问题的通用的手段,希望各位在遇到问题时,不要慌乱,按部就班就能找到问题所在。