32

我正在尝试使用以下指南在伪分布式配置中设置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.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
************************************************************/
4

10 回答 10

51

您在 DN 日志中遇到的错误在此处描述:http: //www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/#java-io-ioexception-不兼容的命名空间 ID

从该页面:

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

解决方法 1:从头开始

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

  1. 停止集群
  2. 删除有问题的DataNode上的数据目录:该目录由conf/hdfs-site.xml中的dfs.data.dir指定;如果您按照本教程进行操作,则相关目录为 /app/hadoop/tmp/dfs/data
  3. 重新格式化 NameNode(注意:在此过程中所有 HDFS 数据都将丢失!)
  4. 重启集群

当删除所有 HDFS 数据并从头开始听起来不是一个好主意时(在初始设置/测试期间可能没问题),您可以尝试第二种方法。

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

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

  1. 停止数据节点
  2. 编辑 /current/VERSION 中 namespaceID 的值以匹配当前 NameNode 的值
  3. 重启数据节点

如果您按照我的教程中的说明进行操作,则相关文件的完整路径为:

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

数据节点:/app/hadoop/tmp/dfs/data/current/VERSION

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

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

在本教程中到 /app/hadoop/tmp)。

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

# /current/VERSION 的内容

命名空间ID=393514426

storageID=DS-1706792599-10.10.10.1-50010-1204306713481

cTime=1215607609074

storageType=DATA_NODE

布局版本=-13

于 2012-04-11T16:47:24.530 回答
12

好的,我再发一次:

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

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

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

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

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

  • 现在通过格式化namenodebin/hadoop namenode -format

  • 最后sbin/start-all.sh

希望这可以帮助。

于 2014-07-30T16:19:52.447 回答
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 没有删除旧数据。所以我们必须手动删除它。

于 2013-07-14T04:39:01.077 回答
6

执行以下步骤:

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
于 2014-01-15T08:28:31.803 回答
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我终于能够解决这个问题。感谢第一个回复帮助我找出我需要轰炸的文件夹。

于 2012-08-29T14:17:07.060 回答
2

尝试格式化您的数据节点并重新启动它。

于 2012-12-07T13:01:26.850 回答
2

我尝试了 Jared Stehler 在 Chris Shain 回答中建议的方法 2,我可以确认在进行这些更改后,我能够解决上述问题。

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

干杯!

于 2013-05-03T06:21:35.427 回答
1

我在使用未修改的 cloudera quickstart vm 4.4.0-1 时遇到了这个问题

作为参考,cloudera 经理说我的数据节点健康状况良好,尽管 DataStreamer 堆栈跟踪中的错误消息说没有数据节点正在运行。

信用来自https://stackoverflow.com/a/10110369/249538的解决方法#2,但我将详细介绍我使用 cloudera 快速入门 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 manager以相反的顺序重新启动了服务。现在我可以-put塞进hdfs了。

于 2014-03-02T18:16:15.710 回答
0

dfs.name.dir就我而言,我错误地为and设置了一个目的地dfs.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>
于 2014-03-24T11:41:21.980 回答
0

我有同样的数据节点丢失问题,我按照这个对我有用的步骤

1.找到datanode所在的文件夹。 cd hadoop/hadoopdata/hdfs 2.查看文件夹,你会看到你在hdfs ls中有什么文件 3.删除 datanode文件夹,因为它是旧版本的datanode rm -rf/ datanode/* 4. 运行上一条命令后你会得到新版本 5. 启动新的datanode hadoop-daemon.sh 启动datanode 6. 刷新web服务。你会看到丢失的节点出现在 我的终端

于 2016-10-10T03:13:31.533 回答