Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Аппаратное обеспечение

Кластерные вычисления на Hadoop

Оригинал: Hands-on Hadoop for cluster computing
Автор: Amit Kumar Saha
Дата: 22 октября 2008
Перевод: Александр Тарасов aka oioki
Дата перевода: 30 октября 2008

Hadoop - это платформа для распределенных вычислений. Она предоставляет собой фреймворк для хранения и обработки данных объемом до нескольких петабайт. Эта платформа основана на Java, поэтому может работать под управлением всех популярных операционных систем: Linux, Windows, Solaris, BSD и Mac OS X. Hadoop широко используется в проектах, для которых требуется масштабируемая, экономичная (читай - используются обычные компьютеры), эффективная и надежная платформа для обработки больших объемов данных.

Для хранения таких объемов данных Hadoop задействует специальную распределенную файловую систему (Hadoop Distributed File System, HDFS). Архитектура ведущий/ведомый (master/slave) файловой системы HDFS - это основа кластерных функций Hadoop. Есть один ведущий сервер, который называют NameNode, управляющий метаданными файловой системы, и множество серверов DataNode, которые по сути хранят данные.

NameNode - это потенциальная точка отказа, поэтому в Hadoop может присутствовать вторичный NameNode, периодически сохраняющий пространство имен (namespace) и поддерживающий размер файла журнала модификаций HDFS в определенных пределах на NameNode. В документации проекта есть диаграмма архитектуры, а в HDFS User Guide дан полный обзор HDFS с точки зрения пользователя.

Для распределенной обработки данных в Hadoop используется программная модель MapReduce от компании Google. В реализации Hadoop процесс JobTracker на одном из узлов играет роль планировщика задач и распределителя кластера. Он распределяет задачи по TaskTracker'ам каждого узла кластера. JobTracker - это ведущий сервер MapReduce, а TaskTracker'ы - это ведомые узлы MapReduce.

Функциональные единицы кластера Hadoop - NameNode, узлы DataNode, JobTracker и TaskTracker - реализованы как демоны. На всех узлах работают встроенные веб-серверы, что позволяет с легкостью определить текущее состояние кластера. Веб-сервер на узле NameNode дает доступ к состояниям узлов DataNode, а именно позволяет узнать количество живых и мертвых узлов, емкость распределенной файловой системы и другую полезную информацию. Аналогично, с веб-сервера на JobTracker'е можно видеть состояние TaskTracker'ов и задачи, выполняемые на них.

Изначально Hadoop строился как инфраструктура для проекта Nutch, который лазил по вебу и строил индекс поискового движка по посещенным страницам. Именно подобные задачи, связанные с обработкой больших объемов данных, хорошо подходят для решения на Hadoop.

Hadoop поддерживает три режима функционирования. По умолчанию, Hadoop работает в нераспределенном режиме как единственный Java-процесс. Для реальной работы это бесполезно, однако позволяет вам лучше понять, что из себя представляет Hadoop без задействования дополнительных компьютеров. Можно запустить его в псевдо-распределенном режиме, в котором все демоны Hadoop будут работать на одной и той же машине, причем каждый демон реализован в виде отдельного Java-процесса. В полностью распределенном режиме Hadoop работает с нескольких узлов с распределенными NameNode, JobTracker, узлами DataNode и TaskTracker. Для работы Hadoop в этом режиме необходимо как минимум три узла.

Установка полностью распределенного кластера Hadoop

Для проверки Hadoop я установил кластер из трех узлов на обыкновенных Linux-машинах. На каждом был установлен дистрибутив Debian "Lenny" beta 2, пакет Sun JDK 1.6 и Hadoop 0.17.2.1. Также были настроены SSH-клиенты и сервера на всех этих узлах.

Распакуйте tar-архив Hadoop в любой каталог, в который у вас есть права записи. Этот каталог в дальнейшем будем обозначать как HADOOP_HOME. Обычно делают так, чтобы на всех машинах кластера был одинаковый путь HADOOP_HOME. Неплохая идея - экспортировать переменную HADOOP_HOME в один из стартовых скриптов, например .bashrc.

Конфигурация Hadoop основана на двух конфигурационных файлах в каталоге HADOOP_HOME/conf/. Настройки по умолчанию хранятся в файле hadoop-default.xml, доступном только для чтения, в то время как настройки, относящиеся к конкретному узлу, хранятся в файле hadoop-site.xml. Содержимое последнего файла зависит от роли узла в кластере. Настройки, указанные в этом файле, перебивают соответствующие настройки из файла по умолчанию. В исходном tar-архиве содержится пустой файл hadoop-site.xml, его нужно наполнить в соответствии с вашими нуждами.

Другой важный файл - conf/slaves. На узле JobTracker в этом файле содержится список хостов, на которых должен быть запущен демон TaskTracker. Аналогично, на NameNode в этом файле перечислены хосты, на которых должен быть запущен демон DataNode. Этот файл нужно редактировать и поддерживать вручную, даже если узлов в кластере становится очень много.

Наконец, в файле conf/chadoop-env.sh содержатся настройки, такие как JAVA_HOME, место расположения логов и каталог, в котором будут храниться идентификаторы работающих процессов (PID-файлы).

В моей пробной установке я поднял NameNode и JobTracker на двух отдельных узлах, а DataNode и TaskTracker на одном (третьем) узле. Файлы conf/slaves на первых двух компьютерах содержали лишь IP-адрес третьего узла. Все четыре демона использовали одинаковый файл conf/hadoop-site.xml, а именно вот этот. Для подробных разъяснений, что значат все эти параметры в файле conf/hadoop-site.xml, обратитесь к онлайн-документации.

Также между всеми узлами кластера необходимо настроить беспарольный доступ по SSH. Если хотите, чтобы обращение к узлам кластера происходило по именам, необходимо править файлы /etc/hosts на каждом из узлов, записывая в них нужное соответствие имен и IP-адресов.

Запуск Hadoop

Для запуска кластера Hadoop нужно запустить HDFS и MapReduce. На узле NameNode идем в каталог HADOOP_HOME и форматируем новую распределенную файловую систему, с помощью команды bin/hadoop namenode -format. Далее можно запустить HDFS с помощью следующей команды, выполняемой на узле NameNode:

Скрипт bin/start-dfs.sh также просматривает файл conf/slaves на NameNode и запускает демонов DataNode на всех ведомых узлах.

MapReduce запускается на узле JobTracker с помощью следующей команды:

Аналогично, скрипт bin/start-mapred.sh просматривает файл conf/slaves и запускает демонов TaskTracker на всех ведомых узлах.

Чтобы проверить, исправно ли работает кластер, посмотрите на список процессов на каждом узле, с помощью команды jps. На узле NameNode вы должны увидеть процессы Jps, NameNode, а если у вас кластер из трех компьютеров (как у меня) еще и SecondaryNameNode. На узле JobTracker должны работать Jps и JobTracker. На узлах TaskTracker/DataNode вы должны видеть процессы Jps, DataNode и TaskTracker.

Запуск заданий MapReduce

Итак, кластер Hadoop запущен, теперь можно попробовать его в действии. Попробуем запустить один из тестовых Java-классов MapReduce, поставляемых в архиве с Hadoop. К примеру, запустим Grep (пишется с большой буквы), извлекающий из текстовых файлов строки, совпадающие с шаблоном и считающий их количество.

Для начала нужно создать набор входных данных для Grep. В этом случае входными данными будет просто набор файлов в каталоге conf/. Grep извлечет из всех поданных на вход строк те, которые удовлетворяют регулярному выражению. Параметрами программы является вход, выход (каталог на DFS, в котором будут храниться выходные файлы) и регулярное выражение.

После выполнения программы скопируйте выходной файл на свой компьютер; исследуем его. В Hadoop данные хранятся в виде блоков файловой системы DFS и невидимы для обычных команд Unix:

Можно следить за состоянием HDFS и JobTracker'ов через встроенные веб-приложения. В админстративную панель DHFS можно зайти по адресу http://IP.адрес.NameNode:5070 (см. скриншот). Также можно смотреть текущие выполняемые задания и историю выполненных и неудачных заданий - по адресу http://IP.адрес.JobTracker:50030 (см. скриншот).

Остановить HDFS кластера можно отдачей команды bin/stop-dfs.sh на узле NameNode, а остановить систему MapReduce - с помощью команды bin/stop-mapred.sh на узле JobTracker.

Известно, что Hadoop может работать с 4 тысячами узлов. Можно начать с малого и все увеличивать и увеличивать свой кластер.