вторник, 18 июня 2013 г.

Scala в гостях у Hadoop. Часть 2. Запускаем кластер на Amazon EC2.

В предыдущем посте я рассказвыл о фреймворке Scoobi. В качестве иллюстрации я написал небольшое MapReduce-приложение, которое вычисляет число π/4. Теперь я собираюсь рассказть о том, как запустить его на кластере Amazon EC2. В этом посте описана пошаговая процедура запуска Scoobi-приложения, начиная от аренды сервера на Amazon и заканчивая получением результата Монте-Карло-вычислений.


Для создания Hadoop-кластера будем использовать Apache Whirr. Для работы Whirr требует ssh-клиент, поэтому будем запускать его на Linux-машине. Лично у меня на компьютере стоит Windows, поэтому я арендую на Amazon-е ещё один Linux инстанс, с которого буду управлять Hadoop-кластером с помощью Whirr (ещё одним относительно простым решением было бы создать виртуальную Linux-машину на основе VMWare или VirtualBox).

Создаём машину в Amazon EC2 для админимтрирования кластера Hadoop

Итак, сначала арендуем машину для запуска Whirr. Тут нет ничего сложного. Регистрируемся на Amazon AWS. Затем идём в AWS Management Console, затем выбираем пункт EC2 Virtual Servers in the Cloud:
Жмём на кнопку "Launch instance". Затем выбираем "Classic wizzard" (хотя можно воспользоваться и другим мастером). Затем выбираем Amazon Linux AMI.


Дальше жмём "Continue". Так как нам надо достаточно мало ресурсов, только для администрирования кластера, а не для самих вычислений, из соображений самой низкой цены цены выбираем меняем "T1 Micro" на "M1 Small" в поле Instance Type:


Далее жмём несколько раз "Continue". Доходим до страницы, на которой нам предложат ввести теги (метки) для запускаемого инстанса. Они нужны главным образом для удобства. Не пренебрежём этой возможностью, определим имя инстанса (hadoopmanager):


Жмём ещё раз "Continue". На следующей странице предлагается создать пару ключей. Вводим удобное название (например, у меня - whirrkey) и нажимаем "Create & Download your Key Pair"


Сохраняем сгенерированный файл с расширением "pem", и ни в коем случае его не теряем. На следующей странице предлагается создать "Security group". Security group определяет по каким портам разрешено коннектится к инстансу. Как минимум необходимо открыть порт 22, чтобы можно было соединяться с сервером с помощью SSH. Если я не ошибаюсь, в существующих Security group-ах по умолчанию создаётся группа default, в которой тоже открыт доступ по SSH.
Настройки групп можно поменять потом, открыв нужные или закрыв ненужные порты.



Далее жмём "Continue", затем "Launch". Наблюдаем сообщение: "Your instances are now launching". Жмём "Close". Наблюдаем список запущенных инстансов с только что созданной нами виртуалкой.

Выбрав в списке созданную виртуалку, можно узнать её доменное имя, которое мы будем использовать для доступа к машине по SSH.


Теперь остаётся получить доступ к созданному серверу, например с помощью PuTTY. Для этого нам понадобится ключ whirrkey.pem, который мы сохранили.

Если использовать популярный Windows SSH-клиент PuTTY, то надо сначала запустить PuTTYGen. Запускаем PuTTYGen, загружаем сохранённые pem-файл, нажав кнопку "Load".


После того, как pem-файл загружен, нажимаем "Save private key", и сохраняем ключ в виде файла с расширением ppk (я назвал его whirrkey.ppk). 

Теперь можно использовать PuTTY для доступа к созданному серверу.

Вводим адрес нашей машины в поле "Host name (or IP address)":



Так же указываем наш ключ whirrkey.ppk для аутентификации:



 Жмём Open. Логинимся как пользователь ec2-user. Пароль вводить не потребуется.

Настраиваем окружение для администрирования Hadoop-кластера

В соответствии с документацией Scoobi для запуска нам понадобится Hadoop CDH4, выпускаемый компанией Cloudera. Это по сути тот же Apache Hadoop определённой версии, в который компания Cloudera добавляет наиболее важные багфиксы и фичи из последующих, возможно ещё не выпущеных релизов Hadoop. Дистрибутивы Clouder Hadoop (CDHx) можно скачать с сайта cloudera.com Компания зарабатывает на технической поддержке облачных технологий, основанных на Hadoop.

Разворачивать и конфигурировать кластер "по одной ноде" довольно хлопотно. К счастью, существуют средства вроде Apache Whirr, которые заметно облегчают этот процесс. Необходимо задать сколько и каких hadoop-нод мы хотим в своём кластере, а Whirr сделает всю рутинную работу: арендует под них машины на Amazon, развернёт и сконфигурирует на них hadoop. По этому пути мы и пойдём.

Устанавливаем Hadoop CDH4

>cd ~
>wget http://archive.cloudera.com/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0.x86_64.rpm
>sudo yum --nogpgcheck localinstall cloudera-cdh-4-0.x86_64.rpm
>sudo yum install hadoop-yarn-resourcemanager


Устанавливаем Apache Whirr:

>mkdir ~/opt

>cd ~/opt

>wget http://www.sai.msu.su/apache/whirr/whirr-0.8.2/whirr-0.8.2.tar.gz

>tar -xvf ./whirr-0.8.2.tar.gz

Конфигурируем Apache Whirr:

>export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
>export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY

Значения $AWS_ACCESS_KEY_ID и $AWS_SECRET_ACCESS_KEY  можно узнать здесь: https://portal.aws.amazon.com/gp/aws/securityCredentials. Эти параметры можно указать не только через переменные окружения, но и в файле ...

Генерируем ключи:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa_whirr

Создадим в домашней директории файл hadoop.properties (имя файла может быть и другим, мы его будем указвать явно при вызове следующих команд). В этом файле и будут основные настройки нашего кластера. Вот его содержимое:

whirr.cluster-name=scoobicluster

whirr.instance-templates=1 hadoop-jobtracker+hadoop-namenode+ganglia-monitor+ganglia-metad,3 hadoop-datanode+hadoop-tasktracker+ganglia-monitor

whirr.java.install-function=install_openjdk
whirr.java.install-function=install_oab_java

whirr.hadoop.install-function=install_cdh_hadoop
whirr.hadoop.configure-function=configure_cdh_hadoop
whirr.yarn.configure-function=configure_cdh_yarn
whirr.yarn.start-function=start_cdh_yarn
whirr.mr_jobhistory.start-function=start_cdh_mr_jobhistory
whirr.env.REPO=cdh4
whirr.env.MAPREDUCE_VERSION=2

whirr.provider=aws-ec2
whirr.identity=${env:AWS_ACCESS_KEY_ID}
whirr.credential=${env:AWS_SECRET_ACCESS_KEY}
whirr.hardware-id=m1.small

whirr.cluster-user=whirr
whirr.private-key-file=/home/ec2-user/.ssh/id_rsa_whirr
whirr.public-key-file=/home/ec2-user/.ssh/id_rsa_whirr.pub

Теперь, когда все настройки заданы, остаётся запустить наш кластер:

Запускаем кластер

cd ~/opt/whirr-0.8.1
bin/whirr launch-cluster --config ~/hadoop.properties

В результате будет сгениерированно много вывода в консоль, в самом конце будут видны адреса созданных нод кластера. Убедиться, что у нас запущен кластер можно так же в панели управления AWS:



Теперь нужно собрать непосредственно то, что будем запускать на кластере, то есть вычисление pi/4, о котором я писал раньше.

Устанавливаем  sbt + git, собираем Scoobi-проект


Теперь нам нужно собрать наше Scoobi-приложение, получив в результате jar-файл. Как и для многих других scala-приложений, для сборки Scoobi-программ используется SBT.

Устанавливаем git из репозитория:

>sudo yum install git

Устанавливаем SBT:

>cd ~/opt

>wget http://scalasbt.artifactoryonline.com/scalasbt/sbt-native-packages/org/scala-sbt/sbt//0.12.3/sbt.tgz

>tar -xvf sbt.tgz

>export PATH=$PATH:~/opt/sbt/bin

Скачиваем исходники с помощью git

>cd ~/
>git clone https://github.com/AlexanderSavochkin/MCwithScoobi.git

Теперь собственно сборка jar-файла

>cd ./MCwithScoobi
>sbt assembly

Если всё прошло окей, то в директории проекта появится поддиректория target, в которой поямвитя файл MCwithScoobi-assembly-0.1.jar. Его-то мы и будем запускать в hadoop-кластере.

Запускаем вычисления в кластере

cd target
hadoop jar MCwithScoobi-assembly-0.1.jar

В результате в текущей директории появится поддиректория output, в которой в файле с названием типа ch20out2-r-00000 будет храниться результат вычисления в кластере. Он представлен в примерно таком виде:

(1,ValueEstimator(100000,0.7852700000000121,1.686227133271277E-6,-2.051820047199726E-14))

Здесь число 0.7852700000000121 - наша оценка пи/4, а следующее число - 1.686227133271277E-6 - оценка квадрата отклонения (дисперсии) оценки числа π/4.

Останавливаем кластер

Когда кластер нам больше не нужен, остановить его можно командами:

cd ~/opt/whirr-0.8.2
bin/whirr destroy-cluster --config ~/hadoop.properties


Результат как обычно можно увидеть в панели управления AWS.

Заключение

Было показано, как арендовать машину на Amazon EC2 (с которой осуществлялось администрирование Hadoop-кластера), как запустить и остановить кластер с помощью Apache Whirr и как запустить в этом кластере Scoobi-приложение. Само собой разумеется, есть другие способы сделать то же самое. Например, если ваша локальная машина работает под Linux, вы можете пропустить шаг с арендой Linux-сервера, и запускать Whirr на своей локальной машине. Можно вместо аренды Linux-машины на Amazon использовать виртуальную машину, можно сконфигурировать кластер без Whirr и.т.д. Короче говоря, здесь показан лишь один из возможных путей.

Особенность нашего "игрушечного" MapReduce-приложения было то, что оно не использует входные данные, хранимые в распределённой файловой системы HDFS, и не сохраняет в HDFS результаты, поэтому рассмотрение кластера как именно распределённого хранилища данных осталось за бортом.  Большинство hadoop-приложений всё-таки используют какие-то "большие" входные данные. Возможно, как-нибудь позже я ещё вернусь к этой теме. Кроме этого в будущем хотелось бы коснуться возможности арендовать на Amazon-е машины с процессорами NVIDIA Tesla, которые предоставляют невиданную мощь для решения параллельных числодробительных задач.

Ссылки

Более подробне описание процедуры запуска Hadoop CDH4 с помощью whirr

http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.0/CDH4-Installation-Guide/cdh4ig_topic_4_4.html