Ошибка HDFS: может быть реплицирована только на 0 узлов, а не на 1 - PullRequest
66 голосов
/ 14 марта 2011

Я создал кластер hadoop для Ubuntu с одним узлом в EC2.

Тестирование простой загрузки файла в hdfs работает с машины EC2, но не работает с машины за пределами EC2.

Я могу просматривать файловую систему через веб-интерфейс с удаленногомашина, и это показывает один датодан, который сообщается как в обслуживании.Открыли все порты 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 просто выдает ту же ошибку.У других, кажется, нет ничего интересного

Есть идеи?

Приветствия

Ответы [ 16 ]

74 голосов
/ 07 января 2012

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

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

  1. остановить все службы hadoop
  2. удалить каталоги dfs / name и dfs / data
  3. hdfs namenode -format Ответ с большой буквы Y
  4. запускать службы hadoop

Кроме того, проверьте дисковое пространство в вашей системе и убедитесь, что журналы не предупреждают вас об этом.

12 голосов
/ 17 февраля 2014

Это ваша проблема - клиент не может связаться с Датодой. Потому что IP-адрес, полученный клиентом для Datanode, является внутренним, а не общедоступным. Взгляните на это

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's wait a little bit and retry
  retry = true;
}

Ключ к пониманию здесь заключается в том, что Наменоде предоставляет только список Датододов для хранения блоков. Наменоде не записывает данные в Датаноды. Работа Клиента заключается в том, чтобы записать данные в Датододы с использованием DFSOutputStream. Перед началом любой записи вышеуказанный код должен убедиться, что Клиент может обмениваться данными с Datanode (ами), а в случае сбоя связи с Datanode, Datanode добавляется в исключенные узлы.

9 голосов
/ 11 ноября 2011

Посмотрите на следующее:

Видя это исключение (может быть реплицировано только на 0 узлов вместо 1), узел данных недоступен для узла имен.

Это следующиеслучаи Узел данных может быть недоступен для узла имен

  1. Диск узла данных заполнен

  2. Узел данных занят с отчетом о блоке и сканированием блока

  3. Если размер блока имеет отрицательное значение (dfs.block.size в hdfs-site.xml)

  4. , в то время как в процессе записи первичный датодат выключается (Любые н / ж колебания ч / б узла имени и машины узла данных)

  5. , когда когда-либо мы добавляем частичную порцию и синхронизируем вызов для последующих частичных добавок порции, клиент должен сохранять предыдущие данные в буфере.

Например, после добавления «a» я вызвал синхронизацию, и когда я пытаюсь добавить буфер, должен иметь «ab»

и на стороне сервера, когдачанк не кратен 512, то он попытается сделать сравнение Crc для data присутствует в файле блока, а также crc присутствует в метафайле.Но при построении crc для данных, присутствующих в блоке, он всегда сравнивается до начального Offeset или Для дополнительного анализа. Пожалуйста, узел данных регистрирует

Ссылка: http://www.mail -archive.com / hdfs-user @hadoop.apache.org/msg01374.html

8 голосов
/ 08 октября 2011

У меня была похожая проблема при настройке кластера с одним узлом.Я понял, что я не настраивал никакие датододы.Я добавил свое имя хоста в conf / slaves, потом все получилось.Надеюсь, это поможет.

4 голосов
/ 02 сентября 2016

Я постараюсь описать мои настройки и решения: Моя настройка: RHEL 7, hadoop-2.7.3

Я попытался настроить сначала автономную операцию , а затем псевдораспределенную операцию , когда последняя не удалась с той же проблемой.

Хотя, когда я запускаю hadoop с:

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

, который выглядит многообещающе (начиная с датоде .. без сбоев) - но датодан на самом деле не существовало.

Еще одним признаком было то, что в работе нет датодета данных (снимок ниже показывает фиксированное рабочее состояние):

enter image description here

Я исправил эту проблему, выполнив:

rm -rf /tmp/hadoop-<user>/dfs/name
rm -rf /tmp/hadoop-<user>/dfs/data

и затем начните снова:

sbin/start-dfs.sh
...
3 голосов
/ 19 июля 2012

У меня была такая же ошибка в MacOS X 10.7 (hadoop-0.20.2-cdh3u0) из-за не запуска узла данных.
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 вывод изменен на следующий (обратите внимание на начало датодеты):

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/...
2 голосов
/ 12 мая 2017

У меня уходит неделя, чтобы выяснить проблему в моей ситуации.

Когда клиент (ваша программа) запрашивает nameNode для операции с данными, nameNode берет dataNode и переходит к нему клиента,передавая ip dataNode клиенту.

Но когда хост dataNode настроен на использование нескольких ip, а nameNode дает вам тот, к которому ваш клиент НЕ МОЖЕТ ДОСТУПАТЬ, клиент добавит dataNode висключить список и попросить nameNode для нового, и, наконец, все dataNode исключены, вы получите эту ошибку.

Так что проверьте настройки ip узла, прежде чем пытаться все !!!

2 голосов
/ 29 октября 2011

И я думаю, что вы должны убедиться, что все датододы работают, когда вы копируете в dfs. В некоторых случаях это занимает некоторое время. Я думаю, что именно поэтому решение «проверка состояния здоровья» работает, потому что вы переходите на веб-страницу состояния здоровья и ждете, пока все будет, мои пять центов.

1 голос
/ 17 июня 2014

Если все узлы данных работают, еще одна вещь, чтобы проверить, достаточно ли в HDFS места для ваших данных. Я могу загрузить небольшой файл, но не смог загрузить большой файл (30 ГБ) в HDFS. «bin / hdfs dfsadmin -report» показывает, что для каждого узла данных доступно всего несколько ГБ.

0 голосов
/ 04 мая 2017

Выполните следующие шаги:
1. Стоп dfs и yarn.
2. Удалите каталоги datanode и namenode, как указано в core-site.xml.
3. Запустите dfs и yarn следующим образом:

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...