Статьи

Как настроить многоузловой кластер Hadoop на Amazon EC2, часть 2

В  части 1 мы успешно создали, запустили и подключились к инстансам Amazon Ubuntu. В части 2 я покажу, как установить и настроить кластер Hadoop. Если вы видите эту страницу в первый раз, я настоятельно рекомендую вам перейти к части 1.

В этой статье

  • HadoopNameNode будет называться master ,
  • HadoopSecondaryNameNode будет называться SecondaryNameNode или SNN.
  • HadoopSlave1 и HadoopSlave2 будут именоваться , как рабы (где узлы данных будут располагаться)

Итак, начнем.

1. Установка Apache Hadoop и настройка кластера

1.1 Обновите пакеты и зависимости.

Давайте обновим пакеты, начну с master, повторите это для SNN и 2 slave.

$ sudo apt-get update

После его завершения, давайте установим Java

1.2 Установите Java

Добавьте следующий PPA и установите последнюю версию Oracle Java (JDK) 7 в Ubuntu

$ sudo add-apt-repository ppa: webupd8team / java

$ sudo apt-get update && sudo apt-get install oracle-jdk7-installer

Проверьте, использует ли Ubuntu JDK 7

java_installaation

Повторите это для SNN и 2 рабов.

1.3 Скачать Hadoop

Я собираюсь использовать стабильную версию HADDOP 1.2.1 со страницы загрузки Apache, и вот зеркало 1.2.1

выдать команду wget из оболочки

$ wget http://apache.mirror.gtcomm.net/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz

download_hadoop

Разархивируйте файлы и просмотрите содержимое пакета и файлы конфигурации.

$ tar -xzvf hadoop-1.2.1.tar.gz

dir_listing

Для простоты переименуйте каталог ‘hadoop-1.2.1’ в ‘hadoop’ для простоты эксплуатации и обслуживания.

$ mv hadoop-1.2.1 hadoop

dir_listing_2

1.4 Переменная среды установки

Переменная среды установки для пользователя ‘ubuntu’

Обновите файл .bashrc, чтобы добавить важные пути и каталоги Hadoop.

Перейдите в домашний каталог

$ кд

Откройте файл .bashrc в vi edito

$ vi .bashrc

Добавить следующее в конце файла

export HADOOP_CONF = / home / ubuntu / hadoop / conf

export HADOOP_PREFIX = / home / ubuntu / hadoop

# Установить JAVA_HOME

экспорт JAVA_HOME = / usr / lib / jvm / java-7-oracle

# Добавить Hadoop bin / каталог в путь
экспорта PATH = $ PATH: $ HADOOP_PREFIX / bin

Сохранить и выйти.

Чтобы проверить, правильно ли он был обновлен, перезагрузите профиль bash, используйте следующие команды


источник ~ / .bashrc

echo $ HADOOP_PREFIX

echo $ HADOOP_CONF
Повторите 1.3 и 1.4 для оставшихся 3 машин (SNN и 2 подчиненных).

1.5 Настройка SSH без пароля на серверах


Главный сервер удаленно запускает службы на подчиненных узлах, что требует доступа без пароля к подчиненным серверам.
Сервер AWS Ubuntu поставляется с предустановленным сервером OpenSSh.

Быстрое примечание:

Открытая часть ключа, загруженного в агент, должна быть помещена в целевую систему в ~ / .ssh / authorized_keys.
Об этом позаботился процесс создания сервера AWS

Теперь нам нужно добавить идентификатор пары ключей AWS EC2 haddopec2cluster.pem в профиль SSH.
Для этого нам понадобятся следующие утилиты ssh
  • ‘ssh-agent’ — это фоновая программа, которая обрабатывает пароли для закрытых ключей SSH.
  •  Команда ssh-add запрашивает у пользователя пароль закрытого ключа и добавляет его в список, поддерживаемый ssh-agent. После того, как вы добавите пароль в ssh-agent, вас не попросят предоставить ключ при использовании SSH или SCP для подключения к хостам с вашим открытым ключом.

Amazon EC2 Instance уже позаботился о «author_keys» на главном сервере, выполните следующие команды, чтобы разрешить SSH-доступ без пароля к подчиненным серверам.

Прежде всего нам нужно защитить наши файлы пар ключей, если права доступа к файлам слишком открыты (см. Ниже), вы получите ошибку

ssh_error

Чтобы решить эту проблему, нам нужно выполнить следующие команды

$ chmod 644 авторизованных ключа

Совет: если вы установите права доступа ‘chmod 644’, вы получите файл, который вы можете записать сами, но только для остального мира.

$ chmod 400 haddoec2cluster.pem

Совет : chmod 400 — очень строгая настройка, предоставляющая только файл с доступом только для чтения. Никаких возможностей записи / выполнения для владельца и никаких разрешений ни для кого другого.

Для использования  ssh-agent и  ssh-addвыполните следующие действия:

  1. В командной строке Unix введите: eval `ssh-agent` Примечание:  убедитесь, что вы используете backquote (  ` ), расположенную под тильдой (  ~ ), а не одинарную кавычку (  ' ).
  2. Введите команду: ssh-add hadoopec2cluster.pem

Если вы заметили, что файл .pem теперь имеет разрешение «только для чтения», и на этот раз он работает для нас.

ssh_success

Имейте в виду, что сессия ssh будет потеряна при выходе из оболочки, и у вас будут повторные команды ssh-agent и ssh-add.

Удаленный SSH

Давайте проверим, что мы можем подключиться к SNN и подчиненным узлам от мастера

ssh_remote_connection


$ ssh ubuntu @ <your-amazon-ec2-public URL>

При успешном входе в систему IP-адрес на оболочке изменится.

1.6 Настройка кластера Hadoop

В этом разделе описывается конфигурация кластера hadoop. Мы должны будем изменить

  • hadoop-env.sh — Этот файл содержит некоторые настройки переменных среды, используемые Hadoop. Вы можете использовать их, чтобы повлиять на некоторые аспекты поведения демона Hadoop, такие как, где хранятся файлы журнала, максимальный объем используемой кучи и т. Д. Единственная переменная, которую вам нужно изменить на этом этапе, находится в этом файле — JAVA_HOME, который определяет путь к установке Java 1.7.x, используемой Hadoop.
  • core-site.xml — ключевое свойство fs.default.name — для настройки namenode, например, hdfs: // namenode/
  • hdfs-site.xml — свойство ключа — dfs.replication — по умолчанию 3
  • mapred-site.xml  — ключевое свойство mapred.job.tracker для конфигурации Jobtracker, например  jobtracker: 8021

Сначала мы начнем с master (NameNode), а затем скопируем указанные выше изменения xml в оставшиеся 3 узла (SNN и slave).

Наконец, в разделе 1.6.2 нам нужно будет настроить conf / master и conf / slaves.

  • masters — определяет, на каких машинах Hadoop будет запускать вторичные NameNodes в нашем многоузловом кластере.
  • slaves — определяет списки хостов, по одному на строку, где будут запускаться подчиненные демоны Hadoop (датододы и треккеры).

Давайте пройдемся по одному. Начните с мастеров (наменоде).

hadoop-env.sh

$ vi $ HADOOP_CONF / hadoop-env.sh и добавьте JAVA_HOME, показанный ниже, и сохраните изменения.

hadoop_env.sh

ядро-site.xml

Этот файл содержит параметры конфигурации для Hadoop Core (например, для ввода-вывода), общие для HDFS, и свойство конфигурации файловой системы MapReduce Default. Fs.default.name указывается здесь, например, для hdfs / s3, который будет использоваться клиентами.

$ sudo $ HADOOP_CONF / core-site.xml

Мы собираемся добавить два свойства

  • fs.default.name будет указывать на URL-адрес и порт NameNode (обычно 8020)
  • hadoop.tmp.dir — База для других временных каталогов. Важно отметить, что каждому узлу нужен каталог hadoop tmp. Я собираюсь создать новый каталог «hdfstmp», как показано ниже, во всех 4 узлах. В идеале вы можете написать сценарий оболочки, чтобы сделать это для вас, но пока идем ручным способом.

$ cd

$ mkdir hdfstmp

Совет:  некоторые важные каталоги: dfs.name.dir, dfs.data.dir в hdfs-site.xml. Значение по умолчанию для  dfs.name.dir is  ${hadoop.tmp.dir}/dfs/data и  dfs.data.dir is ${hadoop.tmp.dir}/dfs/data. Крайне  важно,  чтобы вы правильно выбрали местоположение каталога в производственной среде.

<configuration>

<property>
<name>fs.default.name</name>
<value>hdfs://ec2-54-209-221-112.compute-1.amazonaws.com:8020</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/home/ubuntu/hdfstmp</value>
</property>

</configuration>

HDFS-site.xml

Этот файл содержит конфигурацию для демонов HDFS, NameNode, SecondaryNameNode и узлов данных.

Мы собираемся добавить 2 свойства

  • dfs.permissions.enabled  со значением false. Это означает, что любой пользователь, а не только пользователь «hdfs», может делать с HDFS все, что он хочет, поэтому не делайте этого в рабочей среде, если у вас нет веских причин. если «true», включите проверку разрешений в HDFS. Если «false», проверка прав доступа отключена, но все остальное поведение не изменяется. Переключение с одного значения параметра на другое не меняет режим, владельца или группу файлов или каталогов. Будьте очень осторожны, прежде чем установить это
  • dfs.replication   — по умолчанию для блока репликации задано 3. Фактическое количество репликаций может быть указано при создании файла. По умолчанию используется, если репликация не указана во время создания. Поскольку у нас есть 2 подчиненных узла, мы установим это значение на 2.
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>

HDFS-сайт

mapred-site.xml

Этот файл содержит параметры конфигурации для демонов MapReduce; трекер работы и трекеры задач.
Параметр mapred.job.tracker — это имя хоста (или IP-адрес) и пара портов, по которым Job Tracker прослушивает соединение RPC. Этот параметр указывает местоположение отслеживания заданий для клиентов отслеживания заданий и MapReduce.

JobTracker будет работать на главном сервере (NameNode)

<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://ec2-54-209-221-112.compute-1.amazonaws.com:8021</value>
</property>
</configuration>

1.6.1 Переместить файлы конфигурации в подчиненные

Теперь мы закончили с мастером настройки файлов hadoop xml, давайте скопируем файлы на оставшиеся 3 узла, используя безопасное копирование (scp)

начните с SNN, если вы начинаете новый сеанс, следуйте ssh-add согласно разделу 1.5

из командной строки unix выпуска мастера под командой

$ scp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml ubuntu@ec2-54-209-221-47.compute-1.amazonaws.com: / home / ubuntu / hadoop / conf

повторите это для подчиненных узлов

scp_configurations

1.6.2 Настройка главного и подчиненного

Каждый дистрибутив hadoop поставляется с основными и подчиненными файлами. По умолчанию он содержит одну запись для localhost, мы должны изменить эти 2 файла на машинах «master» (HadoopNameNode) и «slave» (HadoopSlave1 и HadoopSlave2) — у нас есть выделенный компьютер для HadoopSecondaryNamdeNode.

masters_slaves

slaves_file

1.6.3 Изменение файла мастера на главной машине

conf/masters Файл определяет, на каких машинах Hadoop запускает вторичные NameNodes  в нашем многоузловом кластере. В нашем случае будет две машины HadoopNameNode и HadoopSecondaryNameNode

Руководство пользователя Hadoop HDFS  : «Вторичный NameNode периодически объединяет файлы fsimage и файлы редактирования и сохраняет размер журнала изменений в пределах лимита. Обычно он запускается на другом компьютере, чем основной NameNode, поскольку его требования к памяти находятся в том же порядке, что и основной NameNode. Вторичный NameNode запускается с помощью «bin / start-dfs.sh» на узлах, указанных в файле «conf / masters». «

$ vi $ HADOOP_CONF / masters и укажите запись для хост-имени, где вы хотите запустить демон SecondaryNameNode. В нашем случае HadoopNameNode и HadoopSecondaryNameNode

m1

1.6.4 Изменить файл ведомых на главном компьютере

Файл slaves используется для запуска DataNodes и TaskTrackers

$ vi $ HADOOP_CONF / slaves

slaves_config

1.6.5 Копирование мастеров и подчиненных в SecondaryNameNode

Поскольку конфигурация SecondayNameNode будет такой же, как и NameNode, нам нужно скопировать master и slave в HadoopSecondaryNameNode.

copy_master_slaves

1.6.7 Настройка главного и подчиненного на узле «Ведомые»

Поскольку мы настраиваем подчиненные (HadoopSlave1 и HadoopSlave2), файл master на подчиненном компьютере будет пустым

$ vi $ HADOOP_CONF / мастера

master_file_on_slaves

Затем обновите файл «ведомые» на подчиненном сервере (HadoopSlave1), указав IP-адрес подчиненного узла. Обратите внимание, что файл «ведомых» на подчиненном узле содержит только собственный IP-адрес, а не любой другой узел данных в кластере.

$ vi $ HADOOP_CONF / slaves

slaves_file_on_slave

Аналогичным образом обновите мастеров и рабов для HadoopSlave2

1.7 Запуск Hadoop Daemon

Первым шагом к запуску установки Hadoop является форматирование файловой системы Hadoop, которая работает поверх вашей, которая реализована поверх локальной файловой системы вашего кластера. Это необходимо сделать при первой установке Hadoop. Не форматируйте работающую файловую систему Hadoop, это приведет к удалению всех ваших данных.

Форматировать наменоде

$ hadoop namenode format

namenode_format

Позволяет запустить все демоны hadoop из HadoopNameNode

$ cd $ HADOOP_CONF

$ start-all.sh

Это начнется

  • Демоны NameNode, JobTracker и SecondaryNameNode в HadoopNameNode

страт-все

  • Демоны SecondaryNameNode в HadoopSecondaryNameNode

ПНЧ

  • и демоны DataNode и TaskTracker на подчиненных узлах HadoopSlave1 и HadoopSlave2

Снимок экрана 2014-01-13 в 9.59.38 утра

Снимок экрана 2014-01-13 в 9.59.56 утра

Мы можем проверить статус namenode с http: // ec2-54-209-221-112.compute-1.amazonaws.com : 50070 / dfshealth.jsp

namenode_stattus

Проверьте статус Jobtracker: http: // ec2-54-209-221-112.compute-1.amazonaws.com : 50030 / jobtracker.jsp

jobtracker_status

Состояние подчиненного узла для HadoopSlave1: http: // ec2-54-209-223-7.compute-1.amazonaws.com : 50060 / tasktracker.jsp

tasktracker1_status


Состояние подчиненного узла для HadoopSlave2: http: //
ec2-54-209-219-2.compute-1.amazonaws.com : 50060 / tasktracker.jsp

tasktracker2_status

Чтобы быстро проверить наши настройки, запустите пример hadoop pi

ubuntu @ ec2-54-209-221-112: ~ / hadoop $ hadoop jar hadoop-examples-1.2.1.jar pi 10 1000000

Количество карт = 10
Образцы на карту = 1000000

Написал вход для карты № 0

Написал вход для карты № 1

Написал вход для карты № 2

Написал вход для карты № 3

Написал вход для карты № 4

Написал вход для карты № 5

Написал вход для карты № 6

Написал вход для карты № 7

Написал вход для карты № 8

Написал вход для карты № 9

Начало работы

14.01.13 15:44:12 INFO mapred.FileInputFormat: Всего путей ввода для обработки: 10

14.01.13 15:44:13 INFO mapred.JobClient: Выполнение задания: job_201401131425_0001

14.01.13 15:44:14 ИНФОРМАЦИЯ mapred.JobClient: карта 0% уменьшить 0%

14.01.13 15:44:32 ИНФОРМАЦИЯ mapred.JobClient: карта 20% уменьшить 0%

14.01.13 15:44:33 ИНФОРМАЦИЯ mapred.JobClient: карта 40% уменьшить 0%

14.01.13 15:44:46 ИНФОРМАЦИЯ mapred.JobClient: карта 60% уменьшить 0%

14.01.13 15:44:56 ИНФОРМАЦИЯ mapred.JobClient: карта 80% уменьшить 0%

14.01.13 15:44:58 ИНФОРМАЦИЯ mapred.JobClient: карта 100% уменьшить на 20%

14.01.13 15:45:03 ИНФОРМАЦИЯ mapred.JobClient: карта 100% уменьшить 33%

14.01.13 15:45:06 ИНФОРМАЦИЯ mapred.JobClient: карта 100% уменьшить 100%

14.01.13 15:45:09 INFO mapred.JobClient: Работа завершена: job_201401131425_0001

14.01.13 15:45:09 INFO mapred.JobClient: Счетчиков: 30

14.01.13 15:45:09 ИНФОРМАЦИЯ mapred.JobClient: Работа счетчиков

14.01.13 15:45:09 INFO mapred.JobClient: Запущено сокращение задач = 1

14.01.13 15:45:09 INFO mapred.JobClient: SLOTS_MILLIS_MAPS = 145601

14.01.13 15:45:09 INFO mapred.JobClient: общее время, затраченное всеми, уменьшает время ожидания после резервирования слотов (мс) = 0

14.01.13 15:45:09 INFO mapred.JobClient: Общее время, потраченное всеми картами, ожидающими после резервирования слотов (мс) = 0

14.01.13 15:45:09 INFO mapred.JobClient: Запущены задачи карты = 10

14.01.13 15:45:09 ИНФОРМАЦИЯ mapred.JobClient: задачи локальной карты данных = 10

14.01.13 15:45:09 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES = 33926

14.01.13 15:45:09 INFO mapred.JobClient: Счетчики форматов ввода файлов

14.01.13 15:45:09 ИНФОРМАЦИЯ mapred.JobClient: Bytes Read = 1180

14.01.13 15:45:09 INFO mapred.JobClient: Счетчики формата выходного файла

14.01.13 15:45:09 INFO mapred.JobClient: Bytes Written = 97

14.01.13 15:45:09 INFO mapred.JobClient: FileSystemCounters

14.01.13 15:45:09 INFO mapred.JobClient: FILE_BYTES_READ = 226

14.01.13 15:45:09 INFO mapred.JobClient: HDFS_BYTES_READ = 2740

14.01.13 15:45:09 INFO mapred.JobClient: FILE_BYTES_WRITTEN = 622606

14.01.13 15:45:09 INFO mapred.JobClient: HDFS_BYTES_WRITTEN = 215

14.01.13 15:45:09 ИНФОРМАЦИЯ mapred.JobClient: Map-Reduce Framework

14.01.13 15:45:09 INFO mapred.JobClient: Вывод на карту материализованных байтов = 280

14.01.13 15:45:09 INFO mapred.JobClient: входные записи карты = 10

14.01.13 15:45:09 INFO mapred.JobClient: Уменьшить количество перемешиваемых байтов = 280

14.01.13 15:45:09 INFO mapred.JobClient: Разлитые записи = 40

14.01.13 15:45:09 INFO mapred.JobClient: Выходные байты карты = 180

14/01/13 15:45:09 INFO mapred.JobClient: общее использование выделенной кучи (в байтах) =
2039111680

14.01.13 15:45:09 INFO mapred.JobClient: затраченное время процессора (мс) = 9110

14.01.13 15:45:09 INFO mapred.JobClient: входные байты карты = 240

14.01.13 15:45:09 INFO mapred.JobClient: SPLIT_RAW_BYTES = 1560

14.01.13 15:45:09 INFO mapred.JobClient: Объединить входные записи = 0

14.01.13 15:45:09 INFO mapred.JobClient: сокращение входных записей = 20

14.01.13 15:45:09 INFO mapred.JobClient: сокращение групп ввода = 20

14.01.13 15:45:09 INFO mapred.JobClient: Объединить выходные записи = 0

14.01.13 15:45:09 INFO mapred.JobClient: Снимок физической памяти (в байтах) = 1788379136

14.01.13 15:45:09 INFO mapred.JobClient: уменьшить количество выходных записей = 0

14.01.13 15:45:09 INFO mapred.JobClient: снимок виртуальной памяти (в байтах) = 10679681024

14.01.13 15:45:09 INFO mapred.JobClient: Карта выходных записей = 20

Работа завершена за 57.825 секунд

Расчетное значение Pi составляет 3,14158440000000000000

Вы можете проверить страницу статуса отслеживания работы, чтобы посмотреть полный статус работы
complete_job

Детализируйте выполненную работу, и вы сможете увидеть больше деталей о задачах Map Reduce.
detail_job_output

Наконец, не забудьте прекратить работу ваших экземпляров amazon ec2, иначе вас продолжат списывать со счетов.
terminate_ec2

Вот и все для этой статьи, надеюсь, вы найдете это полезным

С Новым Годом!