Hadoop:...被复制到0个节点而不是minReplication(= 1)。有1个数据节点在运行,并且在此操作中不排除任何节点

问题描述 投票:22回答:9

尝试写入HDFS作为我的多线程应用程序的一部分时,我收到以下错误

could only be replicated to 0 nodes instead of minReplication (=1).  There are 1 datanode(s) running and no node(s) are excluded in this operation.

我在这里尝试了最重要的答案,重新格式化,但这对我不起作用:HDFS error: could only be replicated to 0 nodes, instead of 1

这是怎么回事:

  1. 我的应用程序包含2个线程,每个线程配置有自己的Spring Data PartitionTextFileWriter
  2. 线程1是第一个处理数据的,它可以成功写入HDFS
  3. 但是,一旦线程2开始处理数据,我在尝试刷新文件时会收到此错误

线程1和2不会写入同一文件,尽管它们在我的目录树的根目录下共享一个父目录。

我的服务器上的磁盘空间没有问题。

我也在我的名称 - 节点日志中看到了这一点,但不确定它的含义:

2016-03-15 11:23:12,149 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to place enough replicas, still in need of 1 to reach 1 (unavailableStorages=[], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) For more information, please enable DEBUG log level on org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy
2016-03-15 11:23:12,150 WARN org.apache.hadoop.hdfs.protocol.BlockStoragePolicy: Failed to place enough replicas: expected size is 1 but only 0 storage types can be selected (replication=1, selected=[], unavailable=[DISK], removed=[DISK], policy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]})
2016-03-15 11:23:12,150 WARN org.apache.hadoop.hdfs.server.blockmanagement.BlockPlacementPolicy: Failed to place enough replicas, still in need of 1 to reach 1 (unavailableStorages=[DISK], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}, newBlock=true) All required storage types are unavailable:  unavailableStorages=[DISK], storagePolicy=BlockStoragePolicy{HOT:7, storageTypes=[DISK], creationFallbacks=[], replicationFallbacks=[ARCHIVE]}
2016-03-15 11:23:12,151 INFO org.apache.hadoop.ipc.Server: IPC Server handler 8 on 9000, call org.apache.hadoop.hdfs.protocol.ClientProtocol.addBlock from 10.104.247.78:52004 Call#61 Retry#0
java.io.IOException: File /metrics/abc/myfile could only be replicated to 0 nodes instead of [2016-03-15 13:34:16,663] INFO [Group Metadata Manager on Broker 0]: Removed 0 expired offsets in 1 milliseconds. (kafka.coordinator.GroupMetadataManager)

可能是导致此错误的原因是什么?

谢谢

hadoop configuration hdfs
9个回答
17
投票

此错误是由HDFS的块复制系统引起的,因为它无法在聚焦文件中设置特定块的任何副本。常见原因:

  1. 只有NameNode实例正在运行且它不处于安全模式
  2. 没有DataNode实例启动并运行,或者有些实例已经死亡。 (检查服务器)
  3. Namenode和Datanode实例都在运行,但它们无法相互通信,这意味着DataNode和NameNode实例之间存在连接问题。
  4. 由于基于hadoop的问题的某些网络,运行DataNode实例无法与服务器通信(检查包含datanode信息的日志)
  5. 在DataNode实例的已配置数据目录中没有指定硬盘空间,或者DataNode实例的空间不足。 (检查dfs.data.dir //删除旧文件,如果有的话)
  6. dfs.datanode.du.reserved中DataNode实例的指定保留空间大于可用空间,这使得DataNode实例无法理解没有足够的可用空间。
  7. DataNode实例没有足够的线程(检查datanode日志和dfs.datanode.handler.count值)
  8. 确保dfs.data.transfer.protection不等于“authentication”,dfs.encrypt.data.transfer等于true。

还请:

  • 验证NameNode和DataNode服务的状态,并检查相关日志
  • 验证core-site.xml是否具有正确的fs.defaultFS值,并且hdfs-site.xml具有有效值。
  • 验证hdfs-site.xml是否具有dfs.namenode.http-address ..适用于PHD HA配置情况下指定的所有NameNode实例。
  • 验证目录的权限是否正确

参考:https://wiki.apache.org/hadoop/CouldOnlyBeReplicatedTo

参考:https://support.pivotal.io/hc/en-us/articles/201846688-HDFS-reports-Configured-Capacity-0-0-B-for-datanode

另外,请检查:Writing to HDFS from Java, getting "could only be replicated to 0 nodes instead of minReplication"


2
投票

检查运行数据节点的计算机上的jps命令是否显示数据节点正在运行。如果它们正在运行,则意味着它们无法与namenode连接,因此namenode认为hadoop系统中没有datanode。

在这种情况下,运行start-dfs.sh后,在主节点中运行netstat -ntlp。 9000是大多数教程告诉您在core-site.xml中指定的端口号。所以如果你在netstat的输出中看到这样的一行

tcp        0      0 120.0.1.1:9000        0.0.0.0:*               LISTEN       4209/java

那么你的主机别名有问题。我遇到了同样的问题,所以我将说明它是如何解决的。

这是我的core-site.xml的内容

<configuration>
   <property>
       <name>fs.default.name</name>
       <value>hdfs://vm-sm:9000</value>
   </property>
</configuration>

因此主计算机中的vm-sm别名映射到127.0.1.1。这是因为我的/etc/hosts文件的设置。

127.0.0.1       localhost
127.0.1.1       vm-sm
192.168.1.1     vm-sm
192.168.1.2     vm-sw1
192.168.1.3     vm-sw2

看起来主系统的core-site.xml似乎映射在120.0.1.1:9000上,而工作节点的192.168.1.1:9000试图通过/etc/hosts连接。

所以我不得不在127.0.0.1 localhost 127.0.1.1 vm-sm 192.168.1.1 vmsm 192.168.1.2 vm-sw1 192.168.1.3 vm-sw2 文件中更改hadoop系统的主节点的别名(只是删除了连字符)

core-site.xml

并反映了mapred-site.xmlslavetmp文件的变化(无论主人的旧别名发生在何处)。

从hadoop位置删除旧的hdfs文件以及netstat -ntlp文件夹并重新启动所有节点后,问题就解决了。

现在,tcp 0 0 192.168.1.1:9000 0.0.0.0:* LISTEN ... ... 在启动DFS后返回

[SSD]file:///path/to/data/dir

1
投票

我最近遇到过类似的问题。由于我的datanodes(仅)有SSD存储,我把dfs.datanode.data.dir用于unavailableStorages=[DISK]配置。由于包含[SSD]的日志,我删除了[DISK]标签,这解决了问题。

显然,Hadoop使用[DISK]作为默认存储类型,如果没有可用的storage policy标记存储位置,则不会使用SSD“后退”(或者更确切地说是“fallup”)。我找不到关于这种行为的任何文件。


1
投票

我有同样的错误,重新启动hdfs服务解决了这个问题。即重新启动NameNode和DataNode服务。


1
投票

在我的例子中,它是输出路径的hdfs storagepolicies -getStoragePolicy -path my_path 设置为COLD。

如何检查文件夹的设置:

The storage policy of my_path
BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]}   

在我的情况下它返回

hdfs dfsadmin -safemode forceExit

我将数据转储到其他地方(到HOT存储),问题就消失了。


1
投票

您可以保留HDFS安全模式:

2019-02-27 13:52:01,079 INFO org.apache.hadoop.hdfs.server.common.Storage: Lock on /tmp/hadoop-i843484/dfs/data/in_use.lock acquired by nodename 28111@slel00681841a
2019-02-27 13:52:01,087 WARN org.apache.hadoop.hdfs.server.common.Storage: java.io.IOException: Incompatible clusterIDs in /tmp/hadoop-i843484/dfs/data: namenode clusterID = CID-38b0104b-d3d2-4088-9a54-44b71b452006; datanode clusterID = CID-8e121bbb-5a08-4085-9817-b2040cd399e1

1
投票

在我的情况下,问题是hadoop临时文件

日志显示以下错误:

sudo rm -r /tmp/hadoop-*

我解决了删除hadoop tmp文件

qazxswpoi

1
投票

另一个原因可能是您的Datanode机器没有暴露端口(默认情况下为50010)。在我的例子中,我试图将Machine1中的文件写入在Machine2上托管的Docker容器C1上运行的HDFS。要使主机将请求转发到容器上运行的服务,应该注意端口转发。将端口50010从主机转发到客户机后,我可以解决此问题。


0
投票

我也有同样的错误,然后我改变了块大小。这解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.