В данной статье будет по шагам разобран процесс создания небольшого кластера 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.
Устанавливаем 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
Сохраняем и перезагружаем операционную систему.
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.
Сгенерируйте на узлах новые SSH-ключи и добавьте их все в список авторизованных на узле master.
На каждом узле кластера изменим значения параметра dfs.replication в etc/hadoop/hdfs-site.xml. Например, выставим везде значение 3.
<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