问题导读:
1、hadoop 完全分布式 和伪分布式下 datanode无法启动的原因?

2、怎么解决?


hadoop中datanode都正常运行但是无法上传 hadoop中datanode启动不了_Hadoop




问题描述:

在集群模式下更改节点后,启动集群发现 datanode一直启动不起来。

我集群配置:有5个节点,分别为master slave1-5 。

在master以hadoop用户执行:start-all.sh

jps查看master节点启动情况:

1.    NameNode        
2.          JobTracker
3.          SecondaryNameNode

复制代码



均已经正常启动,利用 master:50070 , Live Nodes 为0, 随进入 slave1:

ssh slave1,  输入命令 jps ,发现只有 TaskTracker 而没有DataNode。随后看日志


上网查找解决方法,最后终于解决了,解决方法如下:

1. 先执行stop-all.sh暂停所有服务

2. 将所有Salve节点上的tmp(即 hdfs-site.xml 中指定的 dfs.data.dir 文件夹,DataNode存放数据块的位置)、 logs 文件夹删除 , 然后重新建立tmp , logs 文件夹

3. 将所有Salve节点上的/usr/hadoop/conf下的core-site.xml删除,将master节点的core-site.xml文件拷贝过来,到各个Salve节点

1. scp /usr/hadoop/conf/core-site.xml   hadoop@slave1:/usr/hadoop/conf/

复制代码


4. 重新格式化: hadoop namenode -format

5. 启动:start-all.sh


注:这是我碰到的情况,不见得是你遇到的问题,基本上从以下几个方面解决问题:

        1. 检查各个xml文件是否配置正确

        2. java环境变量配置是否正确

        3. ssh是否无密码互通

        4, Hadoop离开安全模式,hadoop dfsadmin -safemode leave。


也可以参考这个:伪分布式下datanode无法启动问题
例子如下:

1. 环境描述:

虚拟机7.1.4,Ubuntu 10.10,伪分布式安装Hadoop。



2. 问题描述:

多次格式化文件系统时:

1. $ bin/hadoop namenode -format

复制代码 会出现datanode无法启动。




3. 问题产生原因:

执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录namespaceID,标识了所格式化的namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。



4. datanode启动日志:

/home/xsj/hadoop/hadoop-0.20.2/logs/hadoop-xsj-datanode-xsj-virtual-machine.log.XXXX-XX-XX

查看日志发现:

************************************************************/

2012-05-28 17:40:59,973 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /home/xsj/hadoop/hadoop-0.20.2/hdfs/data: namenode namespaceID = 1525353449; datanode namespaceID = 1686950792



5. 解决方案:

把配置文件中dfs.data.dir在本地系统的路径下的current/VERSION文件中的namespaceID改为与dfs.name.dir在本地系统的路径下的current/VERSION文件中的namespaceID一样,例如:

dfs.data.dir为/home/xsj/hadoop/hadoop-0.20.2/hdfs/data

dfs.name.dir为/home/xsj/hadoop/hadoop-0.20.2/hdfs/name

打开/home/xsj/hadoop/hadoop-0.20.2/hdfs/name/current/VERSION文件:

1. #Wed May 30 09:51:09 CST 2012
2. namespaceID=1525353449
3. cTime=0
4. storageType=NAME_NODE
5. layoutVersion=-18

复制代码



打开/home/xsj/hadoop/hadoop-0.20.2/hdfs/data/current/VERSION文件:


    1. #Thu May 24 17:23:11 CST 2012
    2. namespaceID=1686950792
    3. storageID=DS-1689019725-127.0.1.1-50010-1337851391704
    4. cTime=0
    5. storageType=DATA_NODE
    6. layoutVersion=-18

    复制代码


    1、Hadoop出现问题时,该如何入手查看问题?
    2、datanode无法启动,我们该怎么解决?
    3、如何动态加入DataNode或TaskTracker?


    hadoop中datanode都正常运行但是无法上传 hadoop中datanode启动不了_Hadoop



    一、问题描述
    当我多次格式化文件系统时,如

    1. root@localhost:/usr/local/hadoop-1.0.2# bin/hadoop namenode -format

    复制代码

    会出现datanode无法启动,查看日志,发现错误为:

    1. 2012-04-20 20:39:46,501 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /home/gqy/hadoop/data: namenode namespaceID = 155319143; datanode namespaceID = 1036135033

    复制代码

    二、问题产生原因

    当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录namespaceID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的id不一致。


    三、解决办法

    把配置文件中dfs.data.dir在本地系统的路径下的current/VERSION中的namespaceID改为与namenode一样。


    如果大家在安装的时候遇到问题,或者按步骤安装完后却不能运行Hadoop,那么建议仔细查看日志信息,Hadoop记录了详尽的日志信息,日志文件保存在logs文件夹内。

    无论是启动,还是以后会经常用到的MapReduce中的每一个job,以及HDFS等相关信息,Hadoop均存有日志文件以供分析。

    例如:

    NameNode和DataNode的namespaceID不一致,这个错误是很多人在安装时会遇到的,日志信息为:

      1. java.io.IOException: Incompatible namespaceIDs in /root/tmp/dfs/data:
      2. NameNode namespaceID = 1307672299; DataNode namespaceID = 389959598

      复制代码

      若HDFS一直没有启动,读者可以查询日志,并通过日志进行分析,以上提示信息显示了NameNode和DataNode的namespaceID不一致。

      这个问题一般是由于两次或两次以上的格式化NameNode造成的,有两种方法可以解决,第一种方法是删除DataNode的所有资料(及将集群中每个datanode的/hdfs/data/current中的VERSION删掉,然后执行hadoop namenode -format重启集群,错误消失。<推荐>);第二种方法是修改每个DataNode的namespaceID(位于/hdfs/data/current/VERSION文件中)<优先>或修改NameNode的namespaceID(位于/hdfs/name/current/VERSION文件中),使其一致。



      下面这两种方法在实际应用中也可能会用到。

      1)重启坏掉的DataNode或JobTracker。当Hadoop集群的某单个节点出现问题时,一般不必重启整个系统,只须重启这个节点,它会自动连入整个集群。

      在坏死的节点上输入如下命令即可:

      1. bin/Hadoop-daemon.sh start DataNode
      2. bin/Hadoop-daemon.sh start jobtracker

      复制代码

      2) 动态加入DataNode或TaskTracker。这个命令允许用户动态将某个节点加入集群中。

        1. bin/Hadoop-daemon.sh --config ./conf start DataNode
        2. bin/Hadoop-daemon.sh --config ./conf start tasktracker

        复制代码