Установка и настройка кластера Hadoop

Thank you for reading this post, don't forget to subscribe!

Hadoop

набор инстру­мен­тов для раз­ра­бот­ки про­грамм и обес­пе­че­ния сре­ды для их запус­ка в рас­пре­де­лен­ной сре­де. Поз­во­ля­ет созда­вать боль­шие кла­сте­ры и упро­ща­ет про­цесс управ­ле­ния ими. Явля­ет­ся одним из эле­мен­тов кон­вей­е­ров обра­бот­ки боль­ших дан­ных. Раз­ра­бо­тан на Java фон­дом Apache Software Foundation.

Состо­ит из модулей:

  • Common — для свя­зи в еди­ное целое дру­гих компонентов.
  • HDFS — рас­пре­де­лён­ная фай­ло­вая система.
  • YARN — пла­ни­ро­ва­ние зада­ний и управ­ле­ние кластером.
  • MapReduce — плат­фор­ма про­грам­ми­ро­ва­ния и выпол­не­ния рас­пре­де­лён­ных MapReduce-вычислений.

Пре­иму­ще­ства Hadoop:

  • Надеж­ность.
  • Машта­би­ру­е­мость.
  • Отка­зо­устой­чи­вость.
  • Пор­ти­ру­е­мость.

Рас­смот­рим уста­нов­ку Hadoop на Linux Ubuntu 20.04, а так­же настрой­ку кла­сте­ра. В нашем при­ме­ре мы будем исполь­зо­вать 3 сервера:

  1. haddop1, 192.168.1.15 (мастер).
  2. haddop2, 192.168.1.20 (слейв).
  3. haddop3, 192.168.1.25 (слейв).

Поша­го­во, мы выпол­ним рабо­ты по пред­ва­ри­тель­ной настрой­ке сер­ве­ров, уста­нов­ке и кон­фи­гу­ри­ро­ва­ния hadoop, а так­же созда­нию кластера.

Подготовка операционной системы

Дан­ные дей­ствия необ­хо­ди­мо выпол­нить на всех узлах кла­сте­ра Hadoop.

1. Обновление пакетов

Как пока­зы­ва­ет прак­ти­ка, не обнов­лен­ный спи­сок паке­тов может при­ве­сти к ошиб­кам при уста­нов­ке про­грамм­но­го обеспечения.

Для обнов­ле­ния спис­ка паке­тов вво­дим команду:

apt update

Так­же, при жела­нии, мы можем обно­вить уста­нов­лен­ные паке­ты (осо­бен­но реко­мен­ду­ет­ся на чистых системах):

apt upgrade

2. Настройка брандмауэра

Для кор­рект­ной рабо­ты кла­сте­ра нам нуж­но открыть сле­ду­ю­щие порты:

iptables -I INPUT -p tcp --dport 9870 -j ACCEPT

iptables -I INPUT -p tcp --dport 8020 -j ACCEPT

iptables -I INPUT -p tcp --match multiport --dports 9866,9864,9867 -j ACCEPT

* где порт:

  • 9870 — веб-интер­фейс для управления.
  • 8020 — RPC адрес для кли­ент­ских подключений.
  • 9866 — DataNode (пере­да­ча данных).
  • 9864 — DataNode (http-сер­вис).
  • 9867 — DataNode (IPC-сер­вис).

Для сохра­не­ния пра­вил исполь­зу­ем ути­ли­ту netfilter-persistent:

apt install iptables-persistent

netfilter-persistent save

3. Настройка hosts.

Узлы наше­го кла­сте­ра долж­ны уметь обра­щать­ся друг к дру­гу по име­ни. В про­дук­тив­ной сре­де для это­го, обыч­но, исполь­зу­ет­ся DNS. Но если такой воз­мож­но­сти нет, то необ­хо­ди­мо на сер­ве­рах доба­вить в файл hosts следующее:

vi /etc/hosts

#127.0.1.1 haddop1

192.168.1.15 haddop1
192.168.1.20 haddop2
192.168.1.25 haddop3

* в дан­ном при­ме­ре мы ука­зы­ва­ем соот­вет­ствия IP-адре­сов и имен для наше­го кон­крет­но­го при­ме­ра. Само собой, в вашем слу­чае это будут дру­гие данные.
** обра­ти­те вни­ма­ние на заком­мен­ти­ро­ван­ную стро­ку 
127.0.1.1. Если это­го не сде­лать, то сер­вер будет запус­кать­ся на локаль­ном адре­се 127.0.1.1 и вто­рич­ные сер­ве­ры не смо­гут под­клю­чить­ся к мастеру.

Установка Java

Hadoop раз­ра­бо­тан на язы­ке про­грам­ми­ро­ва­ния Java, поэто­му на наших сер­ве­рах долж­на быть уста­нов­ле­на дан­ная платформа.

Выпол­ня­ем команду:

apt install default-jdk

Гото­во. Смот­рим вер­сию уста­нов­лен­ной java:

java -version

Мы долж­ны уви­деть что-то на подобие:

Установка Hadoop

Уста­нов­ка выпол­ня­ет­ся вруч­ную — необ­хо­ди­мо ска­чать бинар­ник с сай­та раз­ра­бот­чи­ка и раз­ме­стить на сер­ве­ре, создать фай­лы с пере­мен­ны­ми окру­же­ния и настро­ить авто­за­пуск с помо­щью systemd. Дан­ные дей­ствия выпол­ня­ем на всех сер­ве­рах. Так­же необ­хо­ди­мо обес­пе­чить воз­мож­ность под­клю­че­ния по ssh ко всем сер­ве­рам кластера.

Загрузка исходника

Пере­хо­дим на стра­ни­цу загруз­ки Hadoop и кли­ка­ем по ссыл­ке для ска­чи­ва­ния нуж­ной вер­сии про­грамм­но­го обес­пе­че­ния (в нашем при­ме­ре, самой свежей):

Копи­ру­ем ссыл­ку на загруз­ку архива:

Исполь­зуя ссыл­ку, загру­жа­ем на наши сер­ве­ры архив:

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz

Установка и настройка среды

Созда­дим ката­лог, в кото­рый поме­стим фай­лы приложения:

mkdir /usr/local/hadoop

Рас­па­ко­вы­ва­ем содер­жи­мое загру­жен­но­го архи­ва в создан­ный каталог:

tar -zxf hadoop-*.tar.gz -C /usr/local/hadoop --strip-components 1

Созда­ем поль­зо­ва­те­ля hadoop:

useradd hadoop -m

И зада­дим ему пароль:

passwd hadoop

Зада­ем в каче­стве вла­дель­ца ката­ло­га hadoop создан­но­го пользователя:

chown -R hadoop:hadoop /usr/local/hadoop

Созда­ем файл с профилем:

vi /etc/profile.d/hadoop.sh

* в дан­ном при­ме­ре мы зада­ем систем­ные пере­мен­ные, тре­бу­ю­щи­е­ся для рабо­ты hadoop:

  • HADOOP_HOME путь, где нахо­дят­ся фай­лы hadoop.
  • HADOOP_HDFS_HOME дирек­то­рия рас­пре­де­лен­ной фай­ло­вой систе­мы HDFS.
  • HADOOP_MAPRED_HOME необ­хо­ди­ма для воз­мож­но­сти отправ­ки зада­ния MapReduce с помо­щью MapReduce v2 в YARN.
  • HADOOP_COMMON_HOME путь хра­не­ния фай­лов для моду­ля common.
  • HADOOP_COMMON_LIB_NATIVE_DIR место раз­ме­ще­ния биб­лио­те­ки native-hadoop.
  • HADOOP_OPTS допол­ни­тель­ные опции запуска.
  • YARN_HOME путь раз­ме­ще­ния фай­лов моду­ля YARN.
  • PATH допол­ня­ет общую пере­мен­ную PATH, где хра­нят­ся пути хра­не­ния бинар­ни­ков для запус­ка приложений.

Теперь откро­ем файл:

vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

Нахо­дим:

# export JAVA_HOME=

Меня­ем на:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

* мы про­пи­са­ли акту­аль­ный путь до фай­лов openjdk.

Проверка настройки среды

Захо­дим под поль­зо­ва­те­лем hadoop:

su - hadoop

Попро­бу­ем выпол­нить команду:

$ env | grep -i -E "hadoop|yarn"

Мы долж­ны уви­деть следующее:

Теперь вво­дим:

$ hadoop version

При­мер­но, вывод коман­ды будет таким:

Оста­ем­ся в систе­ме под поль­зо­ва­те­лем hadoop.

Создание сертификатов

Для рабо­ты hadoop нужен сер­ти­фи­кат, так как внут­рен­ние обра­ще­ния выпол­ня­ют­ся с помо­щью запро­сов ssh. Нам нуж­но сге­не­ри­ро­вать его на одном из сер­ве­ров и ско­пи­ро­вать на остальные.

На мастер-сер­ве­ре вво­дим коман­ду, что­бы создать ключи:

$ ssh-keygen

* на все вопро­сы мож­но отве­тить по умол­ча­нию, нажав Enter.

Копи­ру­ем пуб­лич­ный ключ на локаль­ный компьютер:

$ ssh-copy-id localhost

При пер­вом обра­ще­нии по SSH будет запрос на при­ня­тие сертификата:

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Систе­ма запро­сит вве­сти пароль для наше­го поль­зо­ва­те­ля hadoop. После успеш­но­го вво­да, мы долж­ны увидеть:

Теперь ско­пи­ру­ем нуж­ные клю­чи на осталь­ные ноды кластера:

$ scp -r .ssh hadoop@haddop2:~

$ scp -r .ssh hadoop@haddop3:~

* в дан­ном при­ме­ре мы ско­пи­ру­ем ката­лог .ssh на сер­ве­ры haddop2 и haddop3, кото­рые в нашем при­ме­ре исполь­зу­ют­ся в каче­стве слейвов.

Про­ве­рим вход в систе­му по ssh на все сер­ве­ры — мы долж­ны под­клю­чить­ся без запро­са пароля:

$ ssh localhost

После отклю­ча­ем­ся:

$ exit

B так­же под­клю­ча­ем­ся дру­гим двум серверам:

$ ssh haddop2

$ exit

$ ssh haddop3

$ exit

Уста­нов­ка и настрой­ка Hadoop завер­ше­на. Воз­вра­ща­ем­ся в кон­соль пер­вич­но­го пользователя:

$ exit

Настройка и запуск

Отре­дак­ти­ру­ем неко­то­рые кон­фи­гу­ра­ци­он­ные фай­лы (на всех узлах кла­сте­ра), выпол­ним проб­ный запуск и настро­им сер­вис для автозапуска.

Настройка

Откры­ва­ем файл для общих настроек:

vi /usr/local/hadoop/etc/hadoop/core-site.xml

При­ве­дем его к виду:

* где fs.default.name ука­зы­ва­ет на узел и порт обра­ще­ния к внут­рен­ней фай­ло­вой систе­ме. В нашем при­ме­ре на мастер-сер­вер (localhost) пор­ту 9000. Дан­ная настрой­ка долж­на быть такой на всех нодах.

Редак­ти­ру­ем файл с настрой­ка­ми фай­ло­вой систе­мы HDFS:

vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

В ито­ге долж­но получиться:

* где:

  • dfs.replication — коли­че­ство реплик. Не может быть боль­ше узлов кластера.
  • dfs.name.dir — путь хра­не­ния таб­ли­цы имен fsimage. Мож­но перечи
  • dfs.data.dir — ката­лог для хра­не­ния бло­ков фай­ло­вой систе­мой HDFS.

Откры­ва­ем для редак­ти­ро­ва­ния файл для настрой­ки MapReduce:

vi /usr/local/hadoop/etc/hadoop/mapred-site.xml

Зада­ем сле­ду­ю­щие параметры:

* где mapreduce.framework.name — фрейм­ворк для управ­ле­ния кластером.

Откры­ва­ем файл для настрой­ки YARN:

vi /usr/local/hadoop/etc/hadoop/yarn-site.xml

При­во­дим его к виду:

* где yarn.nodemanager.aux-services пере­чис­ля­ет вспо­мо­га­тель­ные клас­сы обслу­жи­ва­ния. По доку­мен­та­ции реко­мен­ду­ют исполь­зо­вать mapreduce_shuffle.

Созда­ем ката­ло­ги, кото­рые мы ука­за­ли для исполь­зо­ва­ния HDFS:

mkdir -p /hadoop/hdfs/{namenode,datanode}

Для ката­ло­га /hadoop выста­вим в каче­стве вла­дель­ца создан­но­го поль­зо­ва­те­ля hadoop:

chown -R hadoop:hadoop /hadoop

Наши сер­ве­ры настроены.

Откры­ва­ем файл с узла­ми кластера:

vi /usr/local/hadoop/etc/hadoop/workers

И пере­чис­лим все slave-узлы:

haddop2
haddop3

Мож­но запус­кать кластер.

Проверка запуска

На мастер-сер­ве­ре захо­дим под поль­зо­ва­те­лем hadoop:

su - hadoop

Созда­ем фай­ло­вую систему:

$ /usr/local/hadoop/bin/hdfs namenode -format

Для запус­ка кла­сте­ра выпол­ня­ем сле­ду­ю­щие команды:

$ /usr/local/hadoop/sbin/start-dfs.sh

$ /usr/local/hadoop/sbin/start-yarn.sh

Ждем еще немно­го (око­ло 10 секунд) для окон­ча­тель­ной загруз­ки java-при­ло­же­ния. После откры­ва­ем в бра­у­зе­ре адрес http://<IP-адрес мастер-сервера>:9870.

Мы долж­ны уви­деть что-то на подобие:

А на вклад­ке Datanodes мы долж­ны уви­деть все наши вто­рич­ные ноды.

Кла­стер работает.

Автозапуск сервиса

И послед­нее — настро­им запуск hadoop в каче­стве сер­ви­са. Это дела­ем на мастер-сервере.

Созда­ем файл:

vi /etc/systemd/system/hadoop.service

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Раз­ре­ша­ем автозапуск:

systemctl enable hadoop

Для про­вер­ки мож­но пере­за­гру­зить сервер.