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

Обновлено и опубликовано Опубликовано:

Используемые термины: HadoopUbuntu.

Рассмотрим установку 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

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

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

Установка Hadoop

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

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

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

Переходим на страницу загрузки бинарного файла

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

Копируем ссылку для загрузки архива 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

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"
export YARN_HOME=$HADOOP_HOME
export PATH="$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin"

* в данном примере мы задаем системные переменные, требующиеся для работы 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"

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

MAIL=/var/mail/hadoop
USER=hadoop
HADOOP_COMMON_HOME=/usr/local/hadoop
HOME=/home/hadoop
HADOOP_COMMON_LIB_NATIVE_DIR=/usr/local/hadoop/lib/native
LOGNAME=hadoop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
YARN_HOME=/usr/local/hadoop
HADOOP_MAPRED_HOME=/usr/local/hadoop
HADOOP_HDFS_HOME=/usr/local/hadoop
HADOOP_HOME=/usr/local/hadoop

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

$ hadoop version

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

Hadoop 3.3.1
Source code repository https://github.com/apache/hadoop.git -r a3b9c37a397ad4188041dd80621bdeefc46885f2
Compiled by ubuntu on 2021-06-15T05:13Z
Compiled with protoc 3.7.1
From source with checksum 88a4ddb2299aca054416d6b7f81ca55
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.3.1.jar

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

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

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

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

$ ssh-keygen

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

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

$ ssh-copy-id localhost

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

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

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

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'localhost'"
and check to make sure that only the key(s) you wanted were added.

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

$ 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

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

...
<!-- Put site-specific property overrides in this file. -->

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://hadoop1:9000</value>
   </property>
</configuration>

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

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

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

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

...
<!-- Put site-specific property overrides in this file. -->

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>3</value>
   </property>
   <property>
      <name>dfs.name.dir</name>
      <value>file:///hadoop/hdfs/namenode</value>
   </property>
   <property>
      <name>dfs.data.dir</name>
      <value>file:///hadoop/hdfs/datanode</value>
   </property>
</configuration>

* где:

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

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

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

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

...
<!-- Put site-specific property overrides in this file. -->

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

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

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

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

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

...
<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
</configuration>

* где 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.

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

Стартовая веб-страница управления Hadoop

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

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

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

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

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

vi /etc/systemd/system/hadoop.service

[Unit]
Description=Hdfs service
After=network.target

[Service]
Type=forking
User=hadoop
Group=hadoop
ExecStart=/usr/local/hadoop/sbin/start-all.sh
ExecStop=/usr/local/hadoop/sbin/stop-all.sh
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

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

systemctl daemon-reload

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

systemctl enable hadoop

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

# Серверы # Ubuntu # DevOps
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет