Я создал небольшой кластер Hadoop для тестирования. Настройка прошла довольно хорошо с NameNode (1 машина), SecondaryNameNode (1) и всеми DataNodes (3). Машины имеют имена "master", "secondary" и "data01", "data02" и "data03". Все DNS настроены правильно, и SSH без пароля был настроен от master/secondary ко всем машинам и обратно.
Я отформатировал кластер с помощью bin/hadoop namenode -format
, а затем запустил все службы с помощью bin/start-all.sh
. Все процессы на всех узлах были проверены на работоспособность с помощью jps
. Мои основные конфигурационные файлы выглядят примерно так:
<!-- conf/core-site.xml -->
<configuration>
<property>
<name>fs.default.name</name>
<!--
on the master it's localhost
on the others it's the master's DNS
(ping works from everywhere)
-->
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<!-- I picked /hdfs for the root FS -->
<value>/hdfs/tmp</value>
</property>
</configuration>
<!-- conf/hdfs-site.xml -->
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
# conf/masters
secondary
# conf/slaves
data01
data02
data03
Сейчас я просто пытаюсь заставить HDFS работать должным образом.
Я создал каталог для тестирования hadoop fs -mkdir testing
, затем попытался скопировать в него некоторые файлы с помощью hadoop fs -copyFromLocal /tmp/*.txt testing
. В этот момент произошел сбой hadoop, выдав мне примерно следующее:
WARN hdfs.DFSClient: DataStreamer Exception: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/hd/testing/wordcount1.txt could only be replicated to 0 nodes, instead of 1
at ... (such and such)
WARN hdfs.DFSClient: Error Recovery for block null bad datanode[0] nodes == null
at ...
WARN hdfs.DFSClient: Could not get block locations. Source file "/user/hd/testing/wordcount1.txt" - Aborting...
at ...
ERROR hdfs.DFSClient: Exception closing file /user/hd/testing/wordcount1.txt: org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /user/hd/testing/wordcount1.txt could only be replicated to 0 nodes, instead of 1
at ...
И так далее. Аналогичная проблема возникает, когда я пытаюсь запустить hadoop fs -lsr .
с машины DataNode, то получаю следующее:
12/01/02 10:02:11 INFO ipc.Client: Retrying connt to server master/192.162.10.10:9000. Already tried 0 time(s).
12/01/02 10:02:12 INFO ipc.Client: Retrying connt to server master/192.162.10.10:9000. Already tried 1 time(s).
12/01/02 10:02:13 INFO ipc.Client: Retrying connt to server master/192.162.10.10:9000. Already tried 2 time(s).
...
Я говорю, что это похоже, потому что подозреваю, что это проблема доступности порта. Выполнение telnet master 9000
показывает, что порт закрыт. Я где-то читал, что это может быть проблемой столкновения IPv6, и поэтому определил следующее в conf/hadoop-env.sh:
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
Но это не помогло. Запуск netstat
на мастере показывает примерно следующее:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost:9000 localhost:56387 ESTABLISHED
tcp 0 0 localhost:56386 localhost:9000 TIME_WAIT
tcp 0 0 localhost:56387 localhost:9000 ESTABLISHED
tcp 0 0 localhost:56384 localhost:9000 TIME_WAIT
tcp 0 0 localhost:56385 localhost:9000 TIME_WAIT
tcp 0 0 localhost:56383 localhost:9000 TIME_WAIT
На данный момент я почти уверен, что проблема в порте (9000), но я не уверен, что я упустил в конфигурации. Есть идеи? Спасибо.
Я обнаружил, что жесткое кодирование имен DNS в /etc/hosts
не только помогает решить эту проблему, но и ускоряет соединения. Недостатком является то, что вам придется делать это на всех машинах в кластере, и снова при добавлении новых узлов. Или вы можете просто настроить DNS-сервер, чего я не делал.
Вот пример моего одного узла в моем кластере (узлы называются hadoop01
, hadoop02
и т.д., причем главный и вторичный - 01 и 02). Узел, большинство из которых генерируются ОС:
# this is a sample for a machine with dns hadoop01
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastrprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allroutes
# --- Start list of nodes
192.168.10.101 hadoop01
192.168.10.102 hadoop02
192.168.10.103 hadoop03
192.168.10.104 hadoop04
192.168.10.105 hadoop05
192.168.10.106 hadoop06
192.168.10.107 hadoop07
192.168.10.108 hadoop08
192.168.10.109 hadoop09
192.168.10.110 hadoop10
# ... and so on
# --- End list of nodes
# Auto-generated hostname. Please do not remove this comment.
127.0.0.1 hadoop01 localhost localhost.localdomain
Надеюсь, это поможет.