Настройка маленького кластера Hadoop 2.2.0 с нуля

в 9:50, , рубрики: big data, Hadoop, высокая производительность, метки:

Настройка маленького кластера Hadoop 2.2.0 с нуля

В данной статье будет по шагам разобран процесс создания небольшого кластера Hadoop для опытов.

Несмотря на то, что в интернете на иностранных ресурсах есть полно материала про настройку/развертывание Hadoop, большинство из них либо описывают настройку ранних версий (0.X.X и 1.X.X), либо описывают только настройку в режиме single mode/pseudo distributed mode и лишь частично fully distributed mode. На русском языке материала практически нет вовсе.

Когда мне самому понадобился Hadoop, то я далеко не с первого раза смог все настроить. Материал был неактуален, часто попадались конфиги, которые используют deprecated параметры, поэтому использовать их нежелательно. А даже когда все настроил, то задавался многими вопросами, на которые искал ответы. Также встречались похожие вопросы у других людей.

Всем кому интересно, прошу пожаловать по кат.

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

В качестве операционной системы для нашего кластера я предлагаю использовать Ubuntu Server 12.04.3 LTS, но при минимальных изменениях можно будет проделать все шаги и на другой ОС.

Все узлы будут работать на VirtualBox. Системные настройки для виртуальной машины я выставлял небольшие. Всего 8 GB пространства для жёсткого диска, одно ядро и 512 Мб памяти. Виртуальная машина также оснащена двумя сетевыми адаптерами: один NAT, а другой для внутренней сети.

После того, как была скачена и установлена операционная система, необходимо обновиться и установить ssh и rsync:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install ssh
sudo apt-get install rsync

Java

Для работы Hadoop можно использовать либо 6 или 7 версию.
В данной статье будем работать с OpenJDK 7 версии:

$ sudo apt-get install openjdk-7-jdk

Хотя можно использовать версию от Oracle.

И как?

Очищаем ОС от всех зависимостей OpenJDK sudo apt-get purge openjdk*
Устанавливаем python-software-properties который позволит добавлять новые PPA:

sudo apt-get install python-software-properties

Добавляем PPA с launchpad.net/~webupd8team/+archive/java

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Подробнее: INSTALL ORACLE JAVA 7 IN UBUNTU VIA PPA REPOSITORY

Создание отдельной учетной записи для запуска Hadoop

Мы будем использовать выделенную учетную запись для запуска Hadoop. Это не обязательно, но рекомендуется. Также предоставим новому пользователю права sudo, чтобы облегчить себе жизнь в будущем.

sudo addgroup hadoop
sudo adduser --ingroup hadoop hduser
sudo usermod -aG sudo hduser

Во время создания нового пользователя, необходимо будет ввести ему пароль.

/etc/hosts

Нам необходимо, чтобы все узлы могли легко обращаться друг к другу. В большом кластере желательно использовать dns сервер, но для нашей маленькой конфигурации подойдет файл hosts. В нем мы будем описывать соответствие ip-адреса узла к его имени в сети. Для одного узла ваш файл должен выглядеть примерно так:

127.0.0.1       localhost
 
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 
192.168.0.1 master

SSH

Для управления узлами кластера hadoop необходим доступ по ssh. Для созданного пользователя hduser предоставить доступ к master.
Для начала необходимо сгенерировать новый ssh ключ:

ssh-keygen -t rsa -P ""

Во время создания ключа будет запрошен пароль. Сейчас можно его не вводить.

Следующим шагом необходимо добавить созданный ключ в список авторизованных:

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Проверяем работоспособность, подключившись к себе:

ssh master

Отключение IPv6

Если не отключить IPv6, то в последствии можно получить много проблем.
Для отключения IPv6 в Ubuntu 12.04 / 12.10 / 13.04 нужно отредактировать файл sysctl.conf:

sudo vim /etc/sysctl.conf

Добавляем следующие параметры:

# IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Сохраняем и перезагружаем операционную систему.

Но мне нужен IPv6!

Для того, чтобы отключить ipv6 только в hadoop можно добавить в файл etc/hadoop/hadoop-env.sh:

export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true

Установка Apache Hadoop

Скачаем необходимые файлы.
Актуальные версии фреймворка располагаются по адресу: www.apache.org/dyn/closer.cgi/hadoop/common/

На момент декабря 2013 года стабильной версией является 2.2.0.

Создадим папку downloads в корневом каталоге и скачаем последнюю версию:

sudo mkdir /downloads
cd downloads/
sudo wget http://apache-mirror.rbc.ru/pub/apache/hadoop/common/stable/hadoop-2.2.0.tar.gz

Распакуем содержимое пакета в /usr/local/, переименуем папку и выдадим пользователю hduser права создателя:

sudo mv /downloads/hadoop-2.2.0.tar.gz /usr/local/
cd /usr/local/
sudo tar xzf hadoop-2.2.0.tar.gz
sudo mv hadoop-2.2.0 hadoop
chown -R hduser:hadoop hadoop

Обновление $HOME/.bashrc

Для удобства, добавим в .bashrc список переменных:

#Hadoop variables
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-i386
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL

На этом шаге заканчиваются предварительные подготовки.

Настройка Apache Hadoop

Все последующая работа будет вестись из папки /usr/local/hadoop.
Откроем etc/hadoop/hadoop-env.sh и зададим JAVA_HOME.

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

Опишем, какие у нас будут узлы в кластере в файле etc/hadoop/slaves

master

Этот файл может располагаться только на главном узле. Все новые узлы необходимо описывать здесь.

Основные настройки системы располагаются в etc/hadoop/core-site.xml:

<configuration>
            <property>
                       <name>fs.defaultFS</name>
                       <value>hdfs://master:9000</value>
            </property>
</configuration>

Настройки HDFS лежат в etc/hadoop/hdfs-site.xml:

<configuration>
            <property>
                       <name>dfs.replication</name>
                       <value>1</value>
            </property>
            <property>
                       <name>dfs.namenode.name.dir</name>
                       <value>file:/usr/local/hadoop/tmp/hdfs/namenode</value>
            </property>
            <property>
                       <name>dfs.datanode.data.dir</name>
                       <value>file:/usr/local/hadoop/tmp/hdfs/datanode</value>
            </property>
</configuration>

Здесь параметр dfs.replication задает количество реплик, которые будут хранится на файловой системе. По умолчанию его значение равно

3. Оно не может быть больше, чем количество узлов в кластере.
Параметры dfs.namenode.name.dir и dfs.datanode.data.dir задают пути, где будут физически располагаться данные и информация в HDFS. Необходимо заранее создать папку tmp.

Сообщим нашему кластеру, что мы желаем использовать YARN. Для этого изменим etc/hadoop/mapred-site.xml:

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

Все настройки по работе YARN описываются в файле etc/hadoop/yarn-site.xml:

<configuration>
            <property>
                       <name>yarn.nodemanager.aux-services</name>
                       <value>mapreduce_shuffle</value>
            </property>
            <property>
                       <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
                       <value>org.apache.hadoop.mapred.ShuffleHandler</value>
            </property>
            <property>
                       <name>yarn.resourcemanager.scheduler.address</name>
                       <value>master:8030</value>
            </property>
            <property>
                       <name>yarn.resourcemanager.address</name>
                       <value>master:8032</value>
            </property>
            <property>
                       <name>yarn.resourcemanager.webapp.address</name>
                       <value>master:8088</value>
            </property>
            <property>
                       <name>yarn.resourcemanager.resource-tracker.address</name>
                       <value>master:8031</value>
            </property>
            <property>
                       <name>yarn.resourcemanager.admin.address</name>
                       <value>master:8033</value>
            </property>
</configuration>

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

Отформатируем HDFS:

bin/hdfs namenode –format

Запустим hadoop службы:

sbin/start-dfs.sh
sbin/start-yarn.sh

*В предыдущей версии Hadoop использовался скрипт sbin/start-all.sh, но с версии 2.*.* он объявлен устаревшим.

Необходимо убедиться, что запущены следующие java-процессы:

hduser@master:/usr/local/hadoop$ jps
4868 SecondaryNameNode
5243 NodeManager
5035 ResourceManager
4409 NameNode
4622 DataNode
5517 Jps

Протестировать работу кластера можно при помощи стандартных примеров:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar

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

Далее можно создать требуемое количество копий нашего образа.

На копиях необходимо настроить сеть. Необходимо сгенерировать новые MAC-адреса для сетевых интерфейсов и выдать и на них необходимые ip-адреса. В моем примере я работаю с адресами вида 192.168.0.X.

Поправить файл /etc/hosts на всех узлах кластера так, чтобы в нем были прописаны все соответствия.

Пример

127.0.0.1       localhost
 
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 
192.168.0.1 master
192.168.0.2 slave1
192.168.0.3 slave2

Для удобства, изменить имена новых узлов на slave1 и slave2.

Как?

Необходимо изменить два файла: /etc/hostname и /etc/hosts.

Сгенерируйте на узлах новые SSH-ключи и добавьте их все в список авторизованных на узле master.

На каждом узле кластера изменим значения параметра dfs.replication в etc/hadoop/hdfs-site.xml. Например, выставим везде значение 3.

etc/hadoop/hdfs-site.xml

<configuration>
            <property>
                       <name>dfs.replication</name>
                       <value>3</value>
            </property>
</configuration>

Добавим на узле master новые узлы в файл etc/hadoop/slaves:

master
slave1
slave2

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

bin/hdfs namenode –format
sbin/start-dfs.sh
sbin/start-yarn.sh

На slave-узлах должны запуститься следующие процессы:

hduser@slave1:/usr/local/hadoop$ jps
1748 Jps
1664 NodeManager
1448 DataNode

Теперь у нас есть свой мини-кластер.

Давайте запустим задачу Word Count.
Для этого нам потребуется загрузить в HDFS несколько текстовых файлов.
Для примера, я взял книги в формате txt с сайта Free ebooks — Project Gutenberg.

Тестовые файлы

cd /home/hduser
mkdir books
cd books
wget http://www.gutenberg.org/cache/epub/20417/pg20417.txt
wget http://www.gutenberg.org/cache/epub/5000/pg5000.txt
wget http://www.gutenberg.org/cache/epub/4300/pg4300.txt
wget http://www.gutenberg.org/cache/epub/972/pg972.txt
wget http://www.gutenberg.org/cache/epub/132/pg132.txt
wget http://www.gutenberg.org/cache/epub/1661/pg1661.txt
wget http://www.gutenberg.org/cache/epub/19699/pg19699.txt

Перенесем наши файлы в HDFS:

cd /usr/local/hadoop
bin/hdfs dfs -mkdir /in
bin/hdfs dfs -copyFromLocal /home/hduser/books/* /in
bin/hdfs dfs -ls /in

Запустим Word Count:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /in /out

Отслеживать работу можно через консоль, а можно через веб-интерфейс ResourceManager'а по адресу master:8088/cluster/apps/

По завершению работы, результат будет располагаться в папке /out в HDFS.
Для того, чтобы скачать его на локальную файловую систему выполним:

bin/hdfs dfs -copyToLocal /out /home/hduser/

Если у вас возникнут вопросы, то задавайте их в комментариях.

Автор: martsen

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js