我正在运行hadoop集群,ubuntu主机作为主从机,虚拟机作为另一个从机(2节点集群)运行。
似乎这个问题的解决方案应该在没有数据节点启动的情况下解决,但对我来说不起作用。我尝试了两种解决方案。
当我手动将受影响的datanodes的名称空间id等同于name node并启动集群(linked post中的解决方案2)时,似乎仍然会出现相同的错误(datastreamer异常)。接下来,其中一个datanode的日志显示了相同的不兼容namespaceids错误,但日志中显示的data node的namespaceid与当前的tmp/dfs/data/current/version文件不同(该文件未更改,与tmp/dfs/name/current/version文件相同)
经过几个小时的调试,我还是不知所措:(。
附言:
我的主机和从机之间没有连接问题
当我使用start-dfs.sh启动集群时,两个节点上的datanodes都会启动,这是正常的。
当我将文件从本地复制到hdfs时,会遇到这个错误。
我做了一个简单的测试
已删除主服务器上的tmp/dfs/data和tmp/dfs/name文件夹
已删除从机上的tmp/dfs/数据
使用hadoop namenode-format格式化namenode
使用start dfs启动群集。所有节点
它在主节点上正常启动,在从节点上也正常启动
现在运行copyfromlocal命令,它给了我如下相同的错误
但这一次在任何datanode日志master或slave中都没有名称空间不匹配错误
14/05/04 04 04:12:54警告hdfs.dfsclient:数据流异常:org.apache.hadoop.ipc.remoteexception:java.io.ioexception:文件/user/dsingh/mysample只能复制到0个节点,而不是org.apache.hadoop.hdfs.server.namenode.fsnamesystem.getadditionalblock(fsnamesystem)中的1。java:1920)在org.apache.hadoop.hdfs.server.namenode.namenode.addblock(namenode。java:783)在sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在org.apache.hadoop.ipc.rpc$server.call(rpc。java:587)在org.apache.hadoop.ipc.server$handler$1.run(server。java:1432)在org.apache.hadoop.ipc.server$handler$1.run(server。java:1428)在javax.security.auth.subject.doas(主题)中的java.security.accesscontroller.doprivileged(本机方法)。java:415)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1190)在org.apache.hadoop.ipc.server$handler.run(server。java:1426)
在org.apache.hadoop.ipc.client.call(client。java:1113)在org.apache.hadoop.ipc.rpc$invoker.invoke(rpc。java:229)位于com.sun.proxy.$proxy1.addblock(未知源),位于sun.reflect.nativemethodaccessorimpl.invoke0(本机方法),位于sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在org.apache.hadoop.io.retry.retryinvocationhandler.invokemethod(retryinvocationhandler。java:85)在org.apache.hadoop.io.retry.retryinvocationhandler.invoke(retryinvocationhandler。java:62)在com.sun.proxy.$proxy1.addblock(未知源),位于org.apache.hadoop.hdfs.dfsclient$dfsoutputstream.locatefollowBlock(dfsclient)。java:3720)在org.apache.hadoop.hdfs.dfsclient$dfsoutputstream.nextblockoutputstream(dfsclient。java:3580)在org.apache.hadoop.hdfs.dfsclient$dfsoutputstream.access$2600(dfsclient。java:2783)在org.apache.hadoop.hdfs.dfsclient$dfsoutputstream$datastreamer.run(dfsclient。java:3023)
14/05/04 04:12:54 warn hdfs.dfsclient:null bad datanode[0]节点的错误恢复==null 14/05/04 04:12:54 warn hdfs.dfsclient:无法获取块位置。源文件“/user/dsingh/mysample”-正在中止。。。put:java.io.ioexception:file/user/dsingh/mysample只能复制到0节点,而不是1 14/05/04 04:12:54 error hdfs.dfsclient:failed to close file/user/dsingh/mysample org.apache.hadoop.ipc.remoteexception:java.io.ioexception:file/user/dsingh/mysample只能复制到0节点,而不是org.apache.hadoop.hdfs.server.namenode.fsnamesystem.getadditionalblock(fsnamesystem)中的1。java:1920)在org.apache.hadoop.hdfs.server.namenode.namenode.addblock(namenode。java:783)在sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在org.apache.hadoop.ipc.rpc$server.call(rpc。java:587)在org.apache.hadoop.ipc.server$handler$1.run(server。java:1432)在org.apache.hadoop.ipc.server$handler$1.run(server。java:1428)在javax.security.auth.subject.doas(主题)中的java.security.accesscontroller.doprivileged(本机方法)。java:415)在org.apache.hadoop.security.usergroupinformation.doas(usergroupinformation。java:1190)在org.apache.hadoop.ipc.server$handler.run(server。java:1426)
在org.apache.hadoop.ipc.client.call(client。java:1113)在org.apache.hadoop.ipc.rpc$invoker.invoke(rpc。java:229)位于com.sun.proxy.$proxy1.addblock(未知源),位于sun.reflect.nativemethodaccessorimpl.invoke0(本机方法),位于sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在org.apache.hadoop.io.retry.retryinvocationhandler.invokemethod(retryinvocationhandler。java:85)在org.apache.hadoop.io.retry.retryinvocationhandler.invoke(retryinvocationhandler。java:62)在com.sun.proxy.$proxy1.addblock(未知源),位于org.apache.hadoop.hdfs.dfsclient$dfsoutputstream.locatefollowBlock(dfsclient)。java:3720)在org.apache.hadoop.hdfs.dfsclient$dfsoutputstream.nextblockoutputstream(dfsclient。java:3580)在org.apache.hadoop.hdfs.dfsclient$dfsoutputstream.access$2600(dfsclient。java:2783)在org.apache.hadoop.hdfs.dfsclient$dfsoutputstream$datastreamer.run(dfsclient。java:3023)
任何线索都能帮我。
3条答案
按热度按时间44u64gxh1#
我也面临同样的问题。这完全是因为hdfs空间不足。我有10个虚拟机(vmware)节点,hdfs的平均存储空间为3.5gb。
您可以通过访问“\u hadoop\u location/etc/hadoop/hdfs site.xml”(适用于hadoop 2.6)配置文件的“dfs.replication”属性值来减少复制的数量。您可以减少到较小的数量(如1或2),然后尝试使文件小于总空间。
如果显示相同的问题,请尝试使用比上次使用的文件大小小的文件,或使用更大的磁盘大小重新创建计算机。
可能会迟到,但可能会帮助其他面临同样问题的人:)谢谢。
ewm0tg9j2#
在执行-copyfromlocal之后,似乎datanode将获得写入文件的请求。但是,它无法分配文件所需的块。请检查datanode日志以查看到底发生了什么。另外,运行“hdfs dfsadmin-report”以确保datanode上有足够的空间。
50few1ms3#
在这个问题上工作了几个小时之后。我终于放弃了,但在我的知识世界里它仍然没有解决。]
但好的是,我没有在同一台机器上使用虚拟机作为从机,而是将另一台ubuntu机器与我的主机连接起来,每件事都很有魅力:)我想问题可能与虚拟机中存储的有限虚拟内存分配有关(它小于500mb),我在某个地方读到,每一个虚拟机群集中的节点应该至少有10gb的可用空间,以使hdfs满意。
如果可能的话,请尝试在两台不同的机器上使用hadoop集群,而不是在同一台主机上使用虚拟机