Ошибка HDFS: может быть реплицирована только на 0 узлов, вместо 1
В EC2 я создал одиночный кластер hashop node ubuntu.
Тестирование простой загрузки файла в hdfs работает с компьютера EC2, но не работает с компьютера вне EC2.
Я могу просматривать файловую систему через веб-интерфейс с удаленного компьютера, и он показывает один datanode, который сообщается как в службе. Открыли все TCP-порты в безопасности от 0 до 60000 (!), Поэтому я не думаю, что это так.
Я получаю сообщение об ошибке
java.io.IOException: File /user/ubuntu/pies could only be replicated to 0 nodes, instead of 1
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1448)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:690)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:342)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1350)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1346)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:742)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1344)
at org.apache.hadoop.ipc.Client.call(Client.java:905)
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:198)
at $Proxy0.addBlock(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59)
at $Proxy0.addBlock(Unknown Source)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.locateFollowingBlock(DFSOutputStream.java:928)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:811)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:427)
Протокол namenode просто дает ту же ошибку. У других нет ничего интересного.
Любые идеи?
Приветствия
Ответы
Ответ 1
ПРЕДУПРЕЖДЕНИЕ: Следующие данные уничтожат ВСЕ данные на HDFS. Не выполняйте шаги в этом ответе, если вы не заботитесь об уничтожении существующих данных.
Вы должны сделать это:
- остановить все службы hadoop
- удалить директории dfs/name и dfs/datali >
-
hdfs namenode -format
Ответ с помощью капитала Y
- начать службы hadoop
Кроме того, проверьте дисковое пространство в вашей системе и убедитесь, что журналы не предупреждают вас об этом.
Ответ 2
Это ваша проблема - клиент не может связаться с Datanode. Поскольку IP-адрес, полученный клиентом для Datanode, является внутренним IP-адресом, а не публичным IP-адресом. Взгляните на это
http://www.hadoopinrealworld.com/could-only-be-replicated-to-0-nodes/
Посмотрите на исходный код из DFSClient $DFSOutputStrem (Hadoop 1.2.1)
//
// Connect to first DataNode in the list.
//
success = createBlockOutputStream(nodes, clientName, false);
if (!success) {
LOG.info("Abandoning " + block);
namenode.abandonBlock(block, src, clientName);
if (errorIndex < nodes.length) {
LOG.info("Excluding datanode " + nodes[errorIndex]);
excludedNodes.add(nodes[errorIndex]);
}
// Connection failed. Let wait a little bit and retry
retry = true;
}
Ключом к пониманию здесь является то, что Namenode предоставляет список Datanodes для хранения блоков. Namenode не записывает данные в Datanodes. Задачей клиента является запись данных в Datanodes с использованием DFSOutputStream. Прежде чем любая запись начнется с вышеуказанного кода, убедитесь, что Клиент может обмениваться данными с Datanode (s), и если связь не выполняется в Datanode, Datanode добавляется к исключеннымNodes.
Ответ 3
У меня была аналогичная проблема с настройкой одного кластера node. Я понял, что я не настроил ни одного datanode. Я добавил свое имя хоста для conf/slaves, и тогда это сработало. Надеюсь, что это поможет.
Ответ 4
Посмотрите на следующее:
Увидев это исключение (может быть реплицировано только на 0 узлов, а не 1), datanode недоступен для имени Node..
Это следующие случаи. Данные Node могут быть недоступны для имени Node
-
Диск данных Node Полный
-
Данные Node заняты с блочным отчетом и блочным сканированием
-
Если размер блока отрицательный (dfs.block.size в hdfs-site.xml)
-
во время записи первичный datanode спускается (Любые n/w флуктуации b/w Имя Node и Data Node Машины)
-
Когда мы добавляем какие-либо частичные фрагменты и синхронизацию вызовов для последующего клиентского файла с добавлением частичных фрагментов, он должен хранить предыдущие данные в буфере.
Например, после добавления "a" я вызвал синхронизацию, и когда я пытаюсь добавить буфер, должен быть "ab"
И на стороне сервера, когда кусок не кратен 512, тогда он попытается выполнить сравнение Crc для данных, присутствующих в блочном файле, а также crc, присутствующих в метафайле. Но при построении crc для данных, присутствующих в блоке, он всегда сравнивается до исходного Offeset или для большего анализа. Пожалуйста, данные Node logs
Ссылка: http://www.mail-archive.com/[email protected]/msg01374.html
Ответ 5
У меня была такая же ошибка в MacOS X 10.7 (hadoop-0.20.2-cdh3u0) из-за отсутствия данных node.
start-all.sh
выводится следующий результат:
starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to host localhost port 22: Connection refused
localhost: ssh: connect to host localhost port 22: Connection refused
starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
localhost: ssh: connect to host localhost port 22: Connection refused
После включения входа ssh через System Preferences -> Sharing -> Remote Login
он начал работать.
Выход start-all.sh
изменился на следующий (отметьте начало datanode):
starting namenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting datanode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting secondarynamenode, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
starting jobtracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Password:
localhost: starting tasktracker, logging to /java/hadoop-0.20.2-cdh3u0/logs/...
Ответ 6
Я попытаюсь описать свою установку и решение:
Моя настройка: RHEL 7, hadoop-2.7.3
Я сначала попытался настроить автономную операцию, а затем Pseudo- Распределенная операция, когда последняя не удалась с той же проблемой.
Хотя, когда я начинаю hasoop с:
sbin/start-dfs.sh
Я получил следующее:
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /home/<user>/hadoop-2.7.3/logs/hadoop-<user>-secondarynamenode-localhost.localdomain.out
который выглядит многообещающим (начиная с datanode.. без сбоев), но datanode действительно не существовал.
Другим признаком было видеть, что в работе нет ни одного дейтаноида (нижний снимок показывает фиксированное рабочее состояние):
![введите описание изображения здесь]()
Я исправил эту проблему, выполнив следующие действия:
rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data
а затем снова запустите:
sbin/start-dfs.sh
...
Ответ 7
И я думаю, вы должны убедиться, что все datanodes вставлены, когда вы копируете dfs. В некоторых случаях это занимает некоторое время. Я думаю, что, почему решение "проверки состояния здоровья" работает, потому что вы идете на веб-страницу состояния здоровья и ждать, пока все, мои пять центов.
Ответ 8
Если все узлы данных запущены, еще одна вещь, чтобы проверить, хватает ли HDFS для ваших данных. Я могу загрузить небольшой файл, но не смог загрузить большой файл (30 ГБ) в HDFS. 'bin/hdfs dfsadmin -report' показывает, что для каждой информации node доступно только несколько GB.
Ответ 9
Вы пробовали рекомендацию из wiki http://wiki.apache.org/hadoop/HowToSetupYourDevelopmentEnvironment?
Я получал эту ошибку при помещении данных в dfs. Решение является странным и, вероятно, непоследовательным: я удалил все временные данные вместе с namenode, переформатировал namenode, начал все и посетил страницу работоспособности dfs моего кластера (http://your_host: 50070/dfshealth.jsp). Последний шаг, посещая страницу работоспособности, - это единственный способ обойти эту ошибку. После того, как я посетил страницу, создание и получение файлов в dfs и из них отлично работает!
Ответ 10
Переформатирование node не является решением. Вам нужно будет отредактировать start -all.sh. Запустите dfs, дождитесь, пока он начнется полностью, а затем запустится. Вы можете сделать это, используя сон. В ожидании 1 секунды работало на меня. См. Полное решение здесь http://sonalgoyal.blogspot.com/2009/06/hadoop-on-ubuntu.html.
Ответ 11
Я понимаю, что немного опоздал на вечеринку, но я хотел опубликовать это
для будущих посетителей этой страницы. У меня была очень похожая проблема
когда я копировал файлы из локальных в hdf и переформатировал
namenode не исправил проблему для меня. Оказалось, что мой наменода
в журнале было следующее сообщение об ошибке:
2012-07-11 03:55:43,479 ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeRegistration(127.0.0.1:50010, storageID=DS-920118459-192.168.3.229-50010-1341506209533, infoPort=50075, ipcPort=50020):DataXceiver java.io.IOException: Too many open files
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:883)
at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:491)
at org.apache.hadoop.hdfs.server.datanode.FSDataset$FSVolume.createTmpFile(FSDataset.java:462)
at org.apache.hadoop.hdfs.server.datanode.FSDataset.createTmpFile(FSDataset.java:1628)
at org.apache.hadoop.hdfs.server.datanode.FSDataset.writeToBlock(FSDataset.java:1514)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.<init>(BlockReceiver.java:113)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:381)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:171)
По-видимому, это относительно общая проблема для кластеров хауопа и
Cloudera предлагает увеличить лимит nofile и epoll (если на
ядро 2.6.27), чтобы обойти это. Трудность в том, что установка
nofile и epoll лимиты сильно зависят от системы. Мой Ubuntu 10.04
сервер потребовал немного другую конфигурацию, чтобы это работало
правильно, поэтому вам может потребоваться соответствующим образом изменить ваш подход.
Ответ 12
У меня также была такая же проблема/ошибка. Проблема возникла в первую очередь, когда я форматировал с помощью hasoop namenode -format
Итак, после повторного запуска hadoop с использованием start -all.sh данные node не запускались и не инициализировались. Вы можете проверить это с помощью jps, должно быть пять записей. Если отсутствует datanode, вы можете сделать это:
Процесс Datanode не запущен в Hadoop
Надеюсь, что это поможет.
Ответ 13
Не форматируйте имя node сразу. Попробуйте stop-all.sh и запустите его с помощью start -all.sh. Если проблема не устранена, перейдите для форматирования имени node.
Ответ 14
Выполните следующие шаги:
1. Остановить dfs и пряжу.
2. Удалите каталоги datanode и namenode, как указано в файле core-site.xml.
3. Запустите dfs и пряжу следующим образом:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
Ответ 15
Мне нужна неделя, чтобы выяснить проблему в моей ситуации.
Когда клиент (ваша программа) запрашивает имяNode для операции с данными, имяNode подбирает dataNode и перемещает к нему клиента, предоставляя клиенту dataNode ip.
Но, когда хост dataNode настроен на наличие нескольких ip, а nameNode дает вам тот, который ваш клиент НЕ МОЖЕТ ДОСТУПАТЬ, клиент добавит dataNode для исключения списка и спросит имяNode для нового и наконец, все dataNode исключены, вы получите эту ошибку.
Итак, проверьте настройки node ip, прежде чем пытаться все!!!
Ответ 16
Это о SELINUX. В моих случаях CentOS 6.5
Все node (имя, второе, данные....)
служба iptables stop