Настройка базового кластера Hadoop 2.7.7 в CentOS7

Мы часто осуществляем развертывание различных кластерных систем, поэтому хорошие инструкции на вес золота. Сегодня мы предлагаем хорошую инструкцию по развертыванию кластера 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.

Если вам понравился этот пост, поделитесь им с друзьями.