Настройка маленького кластера 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/ 

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

ссылка на оригинал статьи http://habrahabr.ru/post/206196/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *