Мы делимся своим опытом об установке Apache Hadoop на компьютерах под управлением Linux (Multi-Node). Здесь мы также поделимся опытом по устранению неисправностей и сделаем обновление в будущем.
Шаг создания пользователя и других настроек —
- Мы начнем с добавления выделенного пользователя системы Hadoop в каждый кластер.
1
2
|
$ sudo addgroup hadoop $ sudo adduser –ingroup hadoop hduser |
- Затем мы настраиваем SSH (Secure Shell) на всем кластере, чтобы обеспечить безопасный обмен данными.
1
2
|
user@node1:~$ su – hduser hduser@node1:~$ ssh -keygen -t rsa -P “” |
Вывод будет примерно таким:
1
2
3
4
5
6
7
8
|
Generating public /private rsa key pair. Enter file in which to save the key ( /home/hduser/ . ssh /id_rsa ): Created directory '/home/hduser/.ssh' . Your identification has been saved in /home/hduser/ . ssh /id_rsa . Your public key has been saved in /home/hduser/ . ssh /id_rsa .pub. The key fingerprint is: 9b:82:ea:58:b4:e0:35:d7:ff:19:66:a6:ef:ae:0e:d2 hduser@ubuntu ..... |
- Далее нам нужно включить SSH-доступ к локальной машине с помощью этого вновь созданного ключа:
1
|
hduser@node1:~$ cat $HOME/. ssh /id_rsa .pub >> $HOME/. ssh /authorized_keys |
Повторите вышеупомянутые шаги во всех узлах кластера и протестируйте, выполнив следующую инструкцию
1
|
hduser@node1:~$ ssh localhost |
Этот шаг также необходим для сохранения отпечатка ключа хоста локального компьютера в файле known_hosts пользователя hduser.
Далее нам нужно отредактировать файл / etc / hosts, в который мы поместили IP-адреса и имена каждой системы в кластере.
В нашем сценарии у нас есть один ведущий (с IP 192.168.0.100) и один ведомый (с IP 192.168.0.101)
1
|
$ sudo vi /etc/hosts |
и мы помещаем значения в файл хоста как пару ключ-значение.
1
2
|
192.168.0.100 master 192.168.0.101 slave |
- Предоставление доступа по SSH
Пользователь hduser на главном узле должен иметь возможность подключения
- в свою собственную учетную запись на ведущем через ssh master в этом контексте не обязательно ssh localhost.
- на учетную запись hduser подчиненного (-ых) через пароль без пароля SSH.
Таким образом, мы раздаем открытый ключ SSH hduser @ master всем подчиненным (в нашем случае у нас только один подчиненный. Если вам нужно выполнить больше, выполните следующую инструкцию, изменяя имя машины, т.е. slave, slave1, slave2).
1
|
hduser@master:~$ ssh -copy- id -i $HOME/. ssh /id_rsa .pub hduser@slave |
Попробуйте подключить master к master и master к slave (s) и проверить, все ли в порядке.
Конфигурирование Hadoop
- Давайте отредактируем conf / masters (только в узле master)
и мы вводим мастер в файл.
Делая это, мы сказали Hadoop, что запускаем Namenode и вторичные NameNodes в нашем многоузловом кластере на этой машине.
Основной NameNode и JobTracker всегда будут на компьютере, на котором мы запускаем bin / start-dfs.sh и bin / start-mapred.sh .
- Давайте теперь отредактируем conf / slaves (только в узле master)
1
2
|
master slave |
Это означает, что мы пытаемся запустить процесс датоде также на главной машине — там, где также работает наменоде. Мы можем оставить хозяина в роли раба, если в нашем распоряжении будет больше машин в качестве датоде.
если у нас есть больше подчиненных, то добавьте один хост в строку, как показано ниже:
1
2
3
4
|
master slave slave2 slave3 |
и т.д….
Теперь давайте отредактируем два важных файла ( во всех узлах нашего кластера):
- конф / ядро-site.xml
- конф / ядро-hdfs.xml
1) conf / core-site.xml
Мы должны изменить параметр fs.default.para, который указывает имя узла и порт. (В нашем случае это мастер машины)
1
2
3
4
5
6
7
8
|
< property > < name >fs.default.name</ name > < value >hdfs://master:54310</ value > …..[Other XML Values] </ property > |
Создайте каталог, в который Hadoop будет хранить свои данные —
1
|
$ mkdir /app/hadoop |
Мы должны убедиться, что каталог доступен для записи любому пользователю:
1
|
$ chmod 777 /app/hadoop |
Измените core-site.xml еще раз, чтобы добавить следующее свойство:
1
2
3
4
|
< property > < name >hadoop.tmp.dir</ name > < value >/app/hadoop</ value > </ property > |
2) conf / core-hdfs.xml
Мы должны изменить параметр dfs.replication, который указывает репликацию блоков по умолчанию. Он определяет, на сколько машин должен быть реплицирован один файл, прежде чем он станет доступным. Если мы установим это значение выше, чем количество доступных подчиненных узлов (точнее, число узлов данных), мы начнем видеть много ошибок типа «(Обнаружено нулевое количество целей, запрещено1.size = 1)» в журнале. файлы.
Значение по умолчанию для dfs.replication равно 3. Однако, поскольку у нас есть только два доступных узла (в нашем сценарии), поэтому мы установили для dfs.replication значение 2.
1
2
3
4
5
|
< property > < name >dfs.replication</ name > < value >2</ value > …..[Other XML Values] </ property > |
- Давайте отформатируем файловую систему HDFS через NameNode.
Запустите следующую команду на master
1
|
bin /hadoop namenode - format |
- Давайте запустим многоузловой кластер:
Запустите команду: (в нашем случае мы будем работать на компьютере с именем master)
1
|
bin /start-dfs .sh |
Проверка статуса Hadoop —
После того, как все началось, запустите команду jps на всех узлах, чтобы убедиться, что все работает нормально или нет.
В главном узле желаемый результат будет —
1
2
3
4
5
6
|
$ jps 14799 NameNode 15314 Jps 14880 DataNode 14977 SecondaryNameNode |
В раб (ы):
1
2
3
|
$ jps 15314 Jps 14880 DataNode |
Конечно, идентификаторы процессов могут отличаться от машины к машине.
Поиск проблемы
Вполне возможно, что Datanode может начать работу не во всех наших узлах. На данный момент, если мы видим
1
|
logs /hadoop-hduser-datanode- .log |
на произведенных узлах за исключением —
1
|
java.io.IOException: Incompatible namespaceIDs |
В этом случае нам нужно сделать следующее —
- Остановите полный кластер, то есть слои MapReduce и HDFS.
- Удалите каталог данных на проблемном узле данных: этот каталог указан dfs.data.dir в файле conf / hdfs-site.xml. В нашем случае соответствующий каталог / app / hadoop / tmp / dfs / data
- Переформатируйте NameNode. Все данные HDFS будут потеряны во время обработки формата.
- Перезагрузите кластер.
Или же
Мы можем вручную обновить namespaceID проблемных узлов данных:
- Остановите проблемный DataNode.
- Отредактируйте значение namespaceID в $ {dfs.data.dir} / current / VERSION, чтобы сопоставить соответствующее значение текущего NameNode в $ {dfs.name.dir} / current / VERSION.
- Перезапустите фиксированные DataNode.
В разделе Работа с Map-Reduce в Apache Hadoop (Multinode Cluster) мы поделимся своим опытом работы с Map Reduce Job в соответствии с примером Apache Hadoop.
Ресурсы
- http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
- http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/
- http://hadoop.apache.org/docs/current/