没有数据节点启动

时间:2012-04-10 22:14:50

标签: hadoop hdfs

我正在尝试使用以下指南在伪分布式配置中设置 Hadoop版本0.20.203.0

http://www.javacodegeeks.com/2012/01/hadoop-modes-explained-standalone.html

运行start-all.sh脚本后,我运行“jps”。

我得到了这个输出:

4825 NameNode
5391 TaskTracker
5242 JobTracker
5477 Jps
5140 SecondaryNameNode

当我尝试使用以下命令向hdfs添加信息时:

bin/hadoop fs -put conf input

我收到了一个错误:

hadoop@m1a2:~/software/hadoop$ bin/hadoop fs -put conf input
12/04/10 18:15:31 WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/hadoop/input/core-site.xml could only be replicated to 0 nodes, instead of 1
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1417)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:596)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:523)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1383)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1379)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:416)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1377)

        at org.apache.hadoop.ipc.Client.call(Client.java:1030)
        at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:224)
        at $Proxy1.addBlock(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
        at $Proxy1.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:3104)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2975)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:2255)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2446)

12/04/10 18:15:31 WARN hdfs.DFSClient: Error Recovery for block null bad datanode[0] nodes == null
12/04/10 18:15:31 WARN hdfs.DFSClient: Could not get block locations. Source file "/user/hadoop/input/core-site.xml" - Aborting...
put: java.io.IOException: File /user/hadoop/input/core-site.xml could only be replicated to 0 nodes, instead of 1
12/04/10 18:15:31 ERROR hdfs.DFSClient: Exception closing file /user/hadoop/input/core-site.xml : org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/hadoop/input/core-site.xml could only be replicated to 0 nodes, instead of 1
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1417)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:596)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:523)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1383)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1379)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:416)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1377)

org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/hadoop/input/core-site.xml could only be replicated to 0 nodes, instead of 1
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1417)
        at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:596)
        at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:523)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1383)
        at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1379)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:416)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1377)

        at org.apache.hadoop.ipc.Client.call(Client.java:1030)
        at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:224)
        at $Proxy1.addBlock(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
        at $Proxy1.addBlock(Unknown Source)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.locateFollowingBlock(DFSClient.java:3104)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2975)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:2255)
        at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2446)

我不完全确定,但我认为这可能与datanode未运行这一事实有关。

有人知道我做错了什么,或者如何解决这个问题?

编辑:这是datanode.log文件:

2012-04-11 12:27:28,977 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting DataNode
STARTUP_MSG:   host = m1a2/139.147.5.55
STARTUP_MSG:   args = []
STARTUP_MSG:   version = 0.20.203.0
STARTUP_MSG:   build = http://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-203 -r 1099333; compiled by 'oom' on Wed May  4 07:57:50 PDT 2011
************************************************************/
2012-04-11 12:27:29,166 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
2012-04-11 12:27:29,181 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source MetricsSystem,sub=Stats registered.
2012-04-11 12:27:29,183 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled snapshot period at 10 second(s).
2012-04-11 12:27:29,183 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: DataNode metrics system started
2012-04-11 12:27:29,342 INFO org.apache.hadoop.metrics2.impl.MetricsSourceAdapter: MBean for source ugi registered.
2012-04-11 12:27:29,347 WARN org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Source name ugi already exists!
2012-04-11 12:27:29,615 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.io.IOException: Incompatible namespaceIDs in /tmp/hadoop-hadoop/dfs/data: namenode namespaceID = 301052954; datanode namespaceID = 229562149
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.doTransition(DataStorage.java:232)
        at org.apache.hadoop.hdfs.server.datanode.DataStorage.recoverTransitionRead(DataStorage.java:147)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.startDataNode(DataNode.java:354)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.<init>(DataNode.java:268)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.makeInstance(DataNode.java:1480)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.instantiateDataNode(DataNode.java:1419)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.createDataNode(DataNode.java:1437)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.secureMain(DataNode.java:1563)
        at org.apache.hadoop.hdfs.server.datanode.DataNode.main(DataNode.java:1573)

2012-04-11 12:27:29,617 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down DataNode at m1a2/139.147.5.55
************************************************************/

10 个答案:

答案 0 :(得分:47)

此处描述了您在DN日志中收到的错误:http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/#java-io-ioexception-incompatible-namespaceids

从该页面开始:

目前,似乎有两种解决方法,如下所述。

解决方法1:从头开始

我可以证明以下步骤解决了这个错误,但副作用不会让你开心(我也不会)。我找到的原始解决方法是:

  1. 停止群集
  2. 删除有问题的DataNode上的数据目录:该目录由conf / hdfs-site.xml中的dfs.data.dir指定;如果您按照本教程,相关目录是/ app / hadoop / tmp / dfs / data
  3. 重新格式化NameNode(注意:在此过程中所有HDFS数据都会丢失!)
  4. 重新启动群集
  5. 当删除所有HDFS数据并从头开始听起来不是一个好主意(在初始设置/测试期间可能没问题),您可能会尝试第二种方法。

    解决方法2:更新有问题的DataNode的namespaceID

    非常感谢Jared Stehler提出以下建议。我还没有自己测试过,但请随意尝试并向我发送反馈。此解决方法是“微创的”,因为您只需编辑有问题的DataNode上的一个文件:

    1. 停止DataNode
    2. 编辑/ current / VERSION中namespaceID的值以匹配当前NameNode的值
    3. 重新启动DataNode
    4. 如果您按照我的教程中的说明操作,相关文件的完整路径为:

        

      NameNode:/ app / hadoop / tmp / dfs / name / current / VERSION

           

      DataNode:/ app / hadoop / tmp / dfs / data / current / VERSION

           

      (背景:dfs.data.dir默认设置为

           

      $ {hadoop.tmp.dir} / dfs / data,我们设置hadoop.tmp.dir

           本教程中的

      / app / hadoop / tmp)。

      如果你想知道VERSION的内容是什么样的,这是我的一个:

        

      / current / VERSION的内容

           

      namespaceID = 393514426

           

      storageID = DS-1706792599-10.10.10.1-50010-1204306713481

           

      cTime = 1215607609074

           

      storageType = DATA_NODE

           

      layoutVersion = -13

答案 1 :(得分:11)

好的,我再次发布这个:

如果有人需要这个,对于较新版本的Hadoop(基本上我运行的是2.4.0)

  • 在这种情况下,请停止群集sbin/stop-all.sh

  • 然后转到/etc/hadoop获取配置文件。

在文件中:hdfs-site.xml注意与dfs.namenode.name.dir对应的目录路径dfs.namenode.data.dir

  • 递归删除这两个目录(rm -r)。

  • 现在通过bin/hadoop namenode -format

  • 格式化namenode
  • 最后sbin/start-all.sh

希望这有帮助。

答案 2 :(得分:7)

我使用hadoop1.1.2在伪节点上遇到了同样的问题 所以我运行了bin / stop-all.sh来停止集群 然后在hdfs-site.xml

中看到了我的hadoop tmp目录的配置
<name>hadoop.tmp.dir</name>
<value>/root/data/hdfstmp</value>

所以我进入了/ root / data / hdfstmp并使用命令删除了所有文件(你可能会丢失你的数据)

rm -rf *

然后再次格式化namenode

bin/hadoop namenode -format

然后使用

启动集群
bin/start-all.sh

主要原因是bin / hadoop namenode -format没有删除旧数据。所以我们必须手动删除它。

答案 3 :(得分:5)

执行以下步骤:

1. bin/stop-all.sh
2. remove dfs/ and mapred/ folder of hadoop.tmp.dir in core-site.xml
3. bin/hadoop namenode -format
4. bin/start-all.sh
5. jps

答案 4 :(得分:2)

我一直在使用CDH4作为我的hadoop版本,并且一直无法配置它。即使在尝试重新格式化我的名字节点后,我仍然收到错误。

我的VERSION文件位于

/var/lib/hadoop-hdfs/cache/{username}/dfs/data/current/VERSION

您可以通过查找 hadoop.tmp.dir 属性找到HDFS缓存目录的位置:

more /etc/hadoop/conf/hdfs-site.xml 

我发现了

cd /var/lib/hadoop-hdfs/cache/
rm -rf *

然后重新格式化namenode我终于能够解决问题了。感谢第一个回复,帮助我弄清楚我需要炸弹的文件夹。

答案 5 :(得分:2)

尝试格式化datanode并重新启动它。

答案 6 :(得分:2)

我按照Jared Stehler在Chris Shain的回答中尝试使用方法2,我可以确认在完成这些更改后,我能够解决上述问题。

我对名称和数据VERSION文件使用了相同的版本号。意思是说将文件VERSION里面的版本号(/ app / hadoop / tmp / dfs / name / current)复制到VERSION里面(/ app / hadoop / tmp / dfs / data / current)它就像魅力一样

干杯!

答案 7 :(得分:1)

使用未经修改的cloudera quickstart vm 4.4.0-1

时遇到此问题

作为参考,cloudera经理表示我的datanode状况良好,即使DataStreamer stacktrace中的错误消息表明没有数据节点正在运行。

来自https://stackoverflow.com/a/10110369/249538的解决方法#2,但我将详细介绍使用cloudera quickstart vm的具体体验。

具体来说,我做了:
按此顺序停止服务hue1, hive1, mapreduce1, hdfs1 通过cloudera经理http://localhost.localdomain:7180/cmf/services/status

通过以下方式找到我的VERSION文件:
sudo find / -name VERSION

我得到了:

/dfs/dn/current/BP-780931682-127.0.0.1-1381159027878/current/VERSION
/dfs/dn/current/VERSION
/dfs/nn/current/VERSION
/dfs/snn/current/VERSION

我检查了这些文件的内容,但它们都有一个匹配的namespaceID,除了一个文件完全没有它。所以我添加了一个条目。

然后我通过cloudera管理器以相反的顺序重新启动服务。 现在我可以-put填入hdfs。

答案 8 :(得分:0)

就我而言,我错误地为dfs.name.dirdfs.data.dir设置了一个目的地。正确的格式是

 <property>
 <name>dfs.name.dir</name>
 <value>/path/to/name</value>
 </property>

 <property>
 <name>dfs.data.dir</name>
 <value>/path/to/data</value>
 </property>

答案 9 :(得分:0)

我遇到了同样缺少datanode的问题 我按照这个对我有用的步骤

1.找到datanode所在的文件夹。 cd hadoop / hadoopdata / hdfs 2.在文件夹中查看,您将看到hdfs中的文件 的 LS 3.删除datanode文件夹,因为它是datanode的旧版本 rm -rf / datanode / * 4.运行上一个命令后,您将获得新版本 5.启动新的datanode hadoop-daemon.sh启动datanode 6.刷新Web服务。您将看到丢失的节点出现 JS Fiddle