Подтвердить что ты не робот

Ошибка 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 просто дает ту же ошибку. У других нет ничего интересного.

Любые идеи?

Приветствия

4b9b3361

Ответ 1

ПРЕДУПРЕЖДЕНИЕ: Следующие данные уничтожат ВСЕ данные на HDFS. Не выполняйте шаги в этом ответе, если вы не заботитесь об уничтожении существующих данных.

Вы должны сделать это:

  • остановить все службы hadoop
  • удалить директории dfs/name и dfs/data​​li >
  • 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