01. Подготовка к установке кластера Cloudera CDH 6.3.2
2021-06-10
1. Введение
Номер последней версии Cloudera CDH, которая умеет работать без лицензии, это 6.3.2. Версия Cloudera Manager (CM), которая умеет работать с CDH 6.3.2, является 6.3.1. В конце 2020 года Cloudera закрыла свободный доступ к любым версиям CDH и CM в своём репозитории. К счастью, на корпоративном Nexus Repository Manager есть hosted-репозитории для Cloudera CM 6.3.1 и Cloudera CDH 6.3.2.
Перед выполнением этой инструкции, предполагается, что:
- имеется настроенный FreeIPA-сервер с поднятым доменом;
- все узлы будущего Hadoop-кластера введены в домен;
- имеется одна командная машина, через bash-оболочку которой, мы имеем доступ на все узлы будущего кластера через ssh.
Сейчас мы подготовим на командной машине отдельный каталог с файлами, где с помощью ansible развернём новый Hadoop-кластер.
2. Преднастройка и подготовка к проверкам
На командной машине в каталоге ~/hadoop
подготовим файлы для ансибла с ip-адресами машин будущего кластера:
mkdir hadoop && cd hadoop
printf '[defaults]\nhost_key_checking=false\n' > ansible.cfg
printf '[all:var]\nansible_user=jenkins\n#ansible_password=\n' > cluster.inv
printf 'ansible_python_interpreter=/usr/bin/python2\n\n[cluster]\n' >> cluster.inv
cat << EOF | tee -a cluster.inv > cluster.ips
10.1.4.1
10.1.4.2
10.1.4.3
10.1.4.5
10.1.4.6
10.1.4.7
10.1.4.8
10.1.4.9
10.1.4.10
EOF
cluster.inv
— inventory-файл для ансибла;cluster.ips
— простой список ip-адресов узлов будущего кластера.
3. Обновление и перезагрузка машин
Перед началом проверки обязательная перезагрузка машин! Этот шаг выполняется для применения всех постоянных настроек и отмены всех временных настроек машины.
Выполняем обновление и перезагрузку всех машин:
ansible all -i cluster.inv -m yum -a "name=* state=latest" --become
ansible all -i cluster.inv -m reboot --become
4. Настройка и проверка сетевых настроек
Необходимо проверить и привести к надлежащему виду сетевые настройки в следующих местах:
/etc/sysconfig/network-scripts/ifcfg-ens32
/etc/sysconfig/network
/etc/resolv.conf
4.1. Файл /etc/sysconfig/network-scripts/ifcfg-ens32
При наличии строк в этом файле с указанием серверов DNS, они могут заместить рабочие записи в /etc/resolv.conf
.
# Generated by VMWare customization engine.
HWADDR=00:50:56:a2:0e:29
NAME=ens32
DEVICE=ens32
ONBOOT=yes
USERCTL=no
BOOTPROTO=static
NETMASK=255.255.255.128
IPADDR=10.1.4.1
GATEWAY=10.1.4.254
PEERDNS=no
check_link_down() {
return 1;
}
- Строка
PEERDNS=no
отвечает за отсутствие изменений в/etc/resolv.conf
при использовании DHCP. - Функция check_link_down() в конце файла является обходным способом решения vmware-проблемы (https://kb.vmware.com/s/article/977).
Проверку и, если необходимо, удаление лишних строк производим командами:
# Смотрим
ansible all -i cluster.inv -m shell -a "cat /etc/sysconfig/network-scripts/ifcfg-ens32" --become
# Удаляем записи DNS
ansible all -i cluster.inv -m lineinfile -a "path=/etc/sysconfig/network-scripts/ifcfg-ens32 regexp='^DNS=' state=absent" --become
# Удаляем запись DOMAIN
ansible all -i cluster.inv -m lineinfile -a "path=/etc/sysconfig/network-scripts/ifcfg-ens32 regexp='^DOMAIN=' state=absent" --become
4.2. Файл /etc/sysconfig/network
Информация из этого файла — /etc/sysconfig/network
— используется скриптами при запуске машины, или перезапуске демона network, и частично замещает/добавляет информацию в файле /etc/resolv.conf
. Поэтому необходимо сделать этот файл пустым.
# Смотрим
ansible all -i cluster.inv -m shell -a "cat /etc/sysconfig/network" --become
# Очищаем
ansible all -i cluster.inv -m shell -a "> /etc/sysconfig/network" --become
4.3. Автоматически обновляемый файл /etc/resolv.conf
Информация в этом файле может добавляться/замещаться данными полученными из двух предыдущих файлов, а так же из DHCP при отсутствии параметра “PEERDNS=no” в файле /etc/sysconfig/network-scripts/ifcfg-ens32
.
options rotate timeout:1 attempts:1
search example.org
nameserver 10.1.85.5
nameserver 10.1.85.6
nameserver 10.1.85.7
- опция
rotate
заставляет отправлять dns-запросы по очереди к каждому dns-серверу по кругу; - опция
timeout:1
уменьшает ожидание ответа dns-сервера с дефолтных трёх секунд до одной секунды; - опция
attempts:1
разрешают только один запрос к DNS-серверу; - параметр
search
включает автоматическое добавление имени домена к коротким именам в отправляемых dns-запросах, например,ping dev-mgm01p
преобразуется вping dev-mgm01p.example.org
.
Проверку и, если необходимо, добавление опций производим командами:
# Смотрим
ansible all -i cluster.inv -m shell -a "cat /etc/resolv.conf"
# Обновляем resolv.conf
ansible all -i cluster.inv -m shell -a "echo 'options rotate timeout:1 attempts:1' > /etc/resolv.conf" --become
ansible all -i cluster.inv -m systemd -a "name=network state=restarted" --become
5. Проверка обратного разрешения dns-имён
С пульта управления, при помощи ансибла, пытаемся выполнить обратное разрешение dns-имён:
while read line; \
do ansible all -i cluster.inv -m shell -a "host $line"; \
done < cluster.ips
6. Проверка настроек и работы сервиса точного времени
Визуально проверяем наличие синхронизации с серверами точного времени:
ansible all -i cluster.inv -m shell -a "chronyc sources" --become
7. Подготовка файла /etc/hosts
Проверку и, если необходимо, обновление файла производим командами:
# Смотрим
ansible all -i cluster.inv -m shell -a "cat /etc/hosts" --become
# Обновляем /etc/hosts на всех узлах через следующие команды...
# Подготавливаем скрипт
cat << EOF > updatehosts.sh
#!/bin/bash
echo '127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4' > /etc/hosts
while read line; do
TMPNAME=\$(host \$line | awk '{print \$5}') # prod-01.example.org.
LONGNAME=\${TMPNAME%.} # prod-01.example.org
SHORTNAME=\${TMPNAME%%.*} # prod-01
echo "\${line} \${LONGNAME} \${SHORTNAME}" >> /etc/hosts
done < /root/tmp/cluster.ips
EOF
# список ip-адресов и подготовленный скрипт забрасываем на все узлы
ansible all -i cluster.inv -m copy -a "src=cluster.ips dest=/root/tmp/" --become
ansible all -i cluster.inv -m copy -a "src=updatehosts.sh dest=/root/tmp/" --become
# запускаем выполнение скрипта на всех узлах
ansible all -i cluster.inv -m shell -a "/bin/bash /root/tmp/updatehosts.sh" --become
8. Создание tmp-каталога для дампов java-машин
По умолчанию, в настройках сервисов указан каталог /tmp
, который используется для создания дампов java-машин, в случае их падения при ошибке “OutOfMemoryError”. Cоздадим новый каталог для этих целей на большем разделе, так как корневой раздел обычно слишком мал, чтобы разместить полный дамп java-машины:
ansible all -i cluster.inv -m file -a 'path=/data/tmp state=directory mode=1777' --become
9. Заключительная перезагрузка машин
Если были изменения на узлах будущего кластера, то обязательная перезагрузка машин. Этот шаг выполняется для применения всех постоянных настроек и отмены всех временных настроек машины.
ansible all -i cluster.inv -m reboot --become
Если есть какие-либо подозрения на счёт правильности настроек, то повторяем проверки.