hadoop 完全分布式 下 datanode无法启动解决方法

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

2、怎么解决?





问题描述:
在集群模式下更改节点后,启动集群发现 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?




一、问题描述
当我多次格式化文件系统时,如
  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

复制代码


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值