Hadoop:... будет реплицироваться на 0 узлов вместо minReplication (= 1). Работает 1 datanode (s), и в этой операции исключаются node (s)
Я получаю следующую ошибку при попытке записать в 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: может быть реплицирована только на 0 узлов, а не 1
Что происходит:
- Мое приложение состоит из 2 потоков, каждый из которых настроен со своими Spring данными
PartitionTextFileWriter
- Thread 1 является первым, кто обрабатывает данные, и это может успешно записать в HDFS
- Однако, как только Thread 2 начнет обрабатывать данные, я получаю эту ошибку, когда она пытается сбросить файл.
Темы 1 и 2 не будут записываться в один и тот же файл, хотя они совместно используют родительский каталог в корне моего дерева каталогов.
На моем сервере нет проблем с дисковым пространством.
Я также вижу это в моем имени - node журналы, но не уверен, что это означает:
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)
Что может быть причиной этой ошибки?
Спасибо
Ответы
Ответ 1
Эта ошибка вызвана системой репликации блоков HDFS, так как она не смогла сделать какие-либо копии определенного блока в фокусированном файле. Общие причины этого:
- Только экземпляр NameNode работает и не находится в безопасном режиме
- Нет экземпляров DataNode, запущенных или работающих, или некоторые из них мертвы. (Проверьте серверы)
- Оба экземпляра Namenode и Datanode работают, но они не могут взаимодействовать друг с другом, что означает, что существует проблема соединения между экземплярами DataNode и NameNode.
- Запущенные экземпляры DataNode не могут общаться с сервером из-за некоторых проблем с сетью, связанных с Hadoop (проверьте журналы, которые содержат информацию о датодах)
- В настроенных каталогах данных для экземпляров DataNode или DataNode не осталось свободного места на жестком диске. (проверьте dfs.data.dir//удалите старые файлы, если они есть)
- Заданные зарезервированные пространства для экземпляров DataNode в dfs.datanode.du.reserved - это больше, чем свободное пространство, которое заставляет экземпляры DataNode понять, что свободного места недостаточно.
- Для экземпляров DataNode недостаточно потоков (проверьте журналы датоделей и значение dfs.datanode.handler.count)
- Убедитесь, что dfs.data.transfer.protection не равно "аутентификации", а dfs.encrypt.data.transfer равно true.
Также, пожалуйста:
- Проверьте состояние сервисов NameNode и DataNode и проверьте соответствующие журналы
- Убедитесь, что для core-site.xml указано правильное значение fs.defaultFS, а для hdfs-site.xml указано правильное значение.
- Убедитесь, что hdfs-site.xml имеет dfs.namenode.http-address.. для всех экземпляров NameNode, указанных в случае конфигурации PHD HA.
- Проверьте правильность разрешений для каталогов
Ссылка: https://wiki.apache.org/hadoop/CouldOnlyBeReplicatedTo
Ссылка: https://support.pivotal.io/hc/en-us/articles/201846688-HDFS-reports-Configured-Capacity-0-0-B-for-datanode
Также, пожалуйста, проверьте: при записи в HDFS из Java, получение "может быть реплицировано только на 0 узлов вместо minReplication"
Ответ 2
Недавно у меня была аналогичная проблема. Поскольку у моих datanodes (только) были SSD для хранения, я положил [SSD]file:///path/to/data/dir
для конфигурации dfs.datanode.data.dir
. Из-за журналов, содержащих unavailableStorages=[DISK]
, я удалил тег [SSD]
, который решил проблему.
По-видимому, Hadoop использует [DISK]
как тип хранилища по умолчанию и не использует "резервный" (или, скорее, "fallup" ) для использования SSD, если не существует тега хранения [DISK]
. Однако я не мог найти никакой информации о таком поведении.
Ответ 3
Проверьте, jps
ли команда jps
на компьютерах, на которых выполняются узлы данных, действующие. Если они работают, то это означает, что они не могли соединиться с namenode, и, следовательно, namenode думает, что в системе hadoop отсутствуют датододы.
В таком случае после запуска start-dfs.sh
запустите netstat -ntlp
в главном узле. 9000 - это номер порта, который в большинстве уроков core-site.xml
указывать в 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
.
Поэтому мне пришлось изменить псевдоним главного узла для системы hadoop (только что удалил дефис) в /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
и отразил изменение в core-site.xml
, mapred-site.xml
и slave
(везде, где встречался старый псевдоним мастера).
После удаления старых файлов hdfs из папки hadoop, а также из папки tmp
и перезапуска всех узлов проблема была решена.
Теперь netstat -ntlp
после запуска DFS возвращает
tcp 0 0 192.168.1.1:9000 0.0.0.0:* LISTEN ...
...
Ответ 4
У меня была такая же ошибка, перезапуск сервисов hdfs решил эту проблему. т.е. перезапущенные сервисы NameNode и DataNode.
Ответ 5
В моем случае это была политика хранения выходного пути, установленная на COLD.
Как проверить настройки вашей папки:
hdfs storagepolicies -getStoragePolicy -path my_path
В моем случае это вернулось
The storage policy of my_path
BlockStoragePolicy{COLD:2, storageTypes=[ARCHIVE], creationFallbacks=[], replicationFallbacks=[]}
Я сбросил данные еще где (в ГОРЯЧЕЕ хранилище) и проблема ушла.
Ответ 6
Вы можете выйти из безопасного режима HDFS:
hdfs dfsadmin -safemode forceExit