Мы часто осуществляем развертывание различных кластерных систем, поэтому хорошие инструкции на вес золота. Сегодня мы предлагаем хорошую инструкцию по развертыванию кластера Hadoop, подходящего для разработки и малых кластеров без требований к высокой доступности.
Введение
В данной статье представлена подробная инструкция по установке кластера Hadoop на ОС CentOS 7. Статья расчитана на читателя, уже имееющего представление о Hadoop и ОС Linux.
Топология развертывания
----------------|----------|-------------------------------------------------------------------------
IP адрес | Имя узла | Роль
----------------|----------|-------------------------------------------------------------------------
192.168.171.132 | master | NameNode, ResourceManager
192.168.171.133 | slave1 | SecondaryNameNode, DataNode, NodeManager
192.168.171.134 | slave2 | DataNode, NodeManager
----------------|----------|-------------------------------------------------------------------------
Подготовка CentOS
Все действия данного раздела выполняются на каждом узле конфигурации, если иное не указано.
В качестве исходной системы для развертывания будем использовать минимальную установку CentOS 7. После установки системы необходимо добавить несколько программных пакетов:
sudo yum install -y net-tools openssh-server wget epel-release
Задание имени для каждого узла. Данный шаг необязательный, но важный для упрощения идентификации узлов.
Например, на узле master команда будет следующая:
sudo hostnamectl set-hostname master
Чтобы увидеть результат, необходимо повторно авторизоваться. Данную операцию необходимо выполнить на каждом узле с указанием корректного hostname узла.
Мы будем использовать OpenJDK 1.8, поскольку этот пакет включен в стандартный репозиторий CentOS 7.
sudo yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
Создайте файл /etc/profile.d/java.sh со следующим содержимым:
export JAVA_HOME=/usr/lib/jvm/java-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:.
export PATH=$PATH:$JAVA_HOME/bin
Для того, чтобы убедиться в корректности настройки завершите сессию и войдите в систему снова. По команде env
вы должны увидеть корректные переменные окружения. Команда java -version
должна выдать корректную версию java.
Создайте пользователя и группу пользователей для Hadoop:
sudo groupadd hadoop
sudo useradd -d /home/hadoop -g hadoop hadoop
sudo passwd hadoop
Внесите изменения в файл hosts для взаимной идентификации узлов по имени:
echo '192.168.171.132 master' >> /etc/hosts
echo '192.168.171.133 slave1' >> /etc/hosts
echo '192.168.171.134 slave2' >> /etc/hosts
Проверьте, что узлы идентифицируются верно:
ping master
ping slave1
ping slave2
Настройте доступ по SSH без пароля на каждый узел с каждого узла:
su - hadoop
ssh-keygen -t rsa
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
Проверьте, что все узлы взаимно доступны по ключам SSH, без ввода пароля.
Остановите и отключите брандмауэр:
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
Установка Hadoop
Все действия данного шага выполняются на узле master. Кроме того, все операции выполняются под пользователем hadoop.
su - hadoop
Скачайте и распакуйте дистрибутив:
wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
tar -xvf hadoop-2.7.7.tar.gz
rm hadoop-2.7.7.tar.gz
chmod 775 hadoop-2.7.7
Добавьте переменные окружения Hadoop в сценарий инициализаци сессии bash ~/.bashrc
:
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
Примените данные переменные окружения, чтобы они стали доступны:
source ~/.bashrc
Теперь отредактируем файлы конфигурации Hadoop для нашей трехузловой топологии.
Добавьте имя узла slave в файл $HADOOP_HOME/etc/hadoop/slaves
:
echo slave1 > $HADOOP_HOME/etc/hadoop/slaves
echo slave2 >> $HADOOP_HOME/etc/hadoop/slaves
Добавьте имя вторичного узла в файл $HADOOP_HOME/etc/hadoop/masters
:
echo slave1 > $HADOOP_HOME/etc/hadoop/masters
Отредактируйте $HADOOP_HOME/etc/hadoop/core-site.xml
:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000/</value>
<description>namenode settings</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadoop-2.7.7/tmp/hadoop-${user.name}</value>
<description> temp folder </description>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
</configuration>
Отредактируйте $HADOOP_HOME/etc/hadoop/hdfs-site.xml
:
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
<description> fetch NameNode images and edits </description>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
<description> fetch SecondNameNode fsimage </description>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
<description> replica count </description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/hadoop/hadoop-2.7.7/hdfs/name</value>
<description> namenode </description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/hadoop-2.7.7/hdfs/data</value>
<description> DataNode </description>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:///home/hadoop/hadoop-2.7.7/hdfs/namesecondary</value>
<description> check point </description>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.stream-buffer-size</name>
<value>131072</value>
<description> buffer </description>
</property>
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
<description> duration </description>
</property>
</configuration>
Если требуется отключить проверки безопасности в Hadoop, что часто используется при разработке, добавьте в файл следующую секцию:
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
Отредактируйте $HADOOP_HOME/etc/hadoop/mapred-site.xml
:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobtracker.address</name>
<value>hdfs://trucy:9001</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
<description>MapReduce JobHistory Server host:port, default port is 10020.</description>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
<description>MapReduce JobHistory Server Web UI host:port, default port is 19888.</description>
</property>
</configuration>
Отредактируйте $HADOOP_HOME/etc/hadoop/yarn-site.xml
:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<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.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</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>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>
Создайте директории, необходимые Hadoop:
mkdir -p $HADOOP_HOME/tmp
mkdir -p $HADOOP_HOME/hdfs/name
mkdir -p $HADOOP_HOME/hdfs/data
Скопируйте дерево Hadoop и файлы параметров окружения на slave-узлы:
scp ~/.bashrc slave1:~/
scp ~/.bashrc slave2:~/
scp -r ~/hadoop-2.7.7 slave1:~/
scp -r ~/hadoop-2.7.7 slave2:~/
Запуск кластера Hadoop
Отформатируйте HDFS:
hdfs namenode -format
Запустите распределенную файловую систему DFS:
start-dfs.sh
Запустите распределенную вычислительную систему YARN:
start-yarn.sh
Для остановки кластера Hadoop выполните:
stop-yarn.sh
stop-dfs.sh
Проверка состояния кластера
На каждом узле запустите команду jps. Убедитесь, что возвращается успешный ответ.
Успешный ответ jps на узле master:
# jps
32967 NameNode
33225 Jps
32687 ResourceManager
На узле slave1:
# jps
28227 SecondaryNameNode
28496 Jps
28179 DataNode
28374 NodeManager
На узле slave2:
# jps
27680 DataNode
27904 Jps
27784 NodeManager
Для детального мониторинга состояния кластера воспользуйтесь веб-интерфейсами Hadoop:
192.168.171.132:50070
— для просмотра состояния хранилища HDFS.192.168.171.132:8088
— для просмотра ресурсов YARN и состояния приложений.
Заключение
Это все, что необходимо для того, чтобы развернуть базовый кластер Hadoop с поддержкой репликации данных на 3х узлах.
В рамках данного развертывания используется Hadoop с единой точкой отказа NameNode. Несмотря на то, что используется Secondary NameNode, кластер не является отказоустойчивым и должен применяться для целей разработки или малых установок. В больших установках необходимо применять более сложное развертывание с отказоустойчивыми NameNode. Мы расскажем об этом в будущих статьях.
Если вы обнаружили ошибку, вам непонятны некоторые инструкции, или есть предложения по улучшению статьи, будем рады, если вы свяжетесь с нами. Успехов в работе с Hadoop.
Если вам понравился этот пост, поделитесь им с друзьями.