Библиотека сайта rus-linux.net
Кластерные вычисления на 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 тысячами узлов. Можно начать с малого и все увеличивать и увеличивать свой кластер.