尝试写入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
这是怎么回事:
PartitionTextFileWriter
线程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)
可能是导致此错误的原因是什么?
谢谢
此错误是由HDFS的块复制系统引起的,因为它无法在聚焦文件中设置特定块的任何副本。常见原因:
还请:
参考:https://wiki.apache.org/hadoop/CouldOnlyBeReplicatedTo
另外,请检查:Writing to HDFS from Java, getting "could only be replicated to 0 nodes instead of minReplication"
检查运行数据节点的计算机上的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.xml
,slave
和tmp
文件的变化(无论主人的旧别名发生在何处)。
从hadoop位置删除旧的hdfs文件以及netstat -ntlp
文件夹并重新启动所有节点后,问题就解决了。
现在,tcp 0 0 192.168.1.1:9000 0.0.0.0:* LISTEN ...
...
在启动DFS后返回
[SSD]file:///path/to/data/dir
我最近遇到过类似的问题。由于我的datanodes(仅)有SSD存储,我把dfs.datanode.data.dir
用于unavailableStorages=[DISK]
配置。由于包含[SSD]
的日志,我删除了[DISK]
标签,这解决了问题。
显然,Hadoop使用[DISK]
作为默认存储类型,如果没有可用的storage policy标记存储位置,则不会使用SSD“后退”(或者更确切地说是“fallup”)。我找不到关于这种行为的任何文件。
我有同样的错误,重新启动hdfs服务解决了这个问题。即重新启动NameNode和DataNode服务。
在我的例子中,它是输出路径的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存储),问题就消失了。
您可以保留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
在我的情况下,问题是hadoop临时文件
日志显示以下错误:
sudo rm -r /tmp/hadoop-*
我解决了删除hadoop tmp文件
qazxswpoi
另一个原因可能是您的Datanode机器没有暴露端口(默认情况下为50010)。在我的例子中,我试图将Machine1中的文件写入在Machine2上托管的Docker容器C1上运行的HDFS。要使主机将请求转发到容器上运行的服务,应该注意端口转发。将端口50010从主机转发到客户机后,我可以解决此问题。
我也有同样的错误,然后我改变了块大小。这解决了这个问题。