Распределенные вычисления с помощью Linux и Hadoop

Введение и архитектура

Каждый день мы пользуемся поисковыми системами для нахождения нужной информации среди множества терабайт данных, содержащихся Интернете. Но задавались ли вы когда-нибудь вопросом, как на самом деле выполняется поиск? Одним из решений, предназначенных для этой цели, является программная платформа Apache Hadoop, позволяющая выполнять распределенную обработку огромного количества данных. Одним из применений Hadoop является параллельное индексирование Web-страниц Интернета. Hadoop – это проект сообщества разработчиков Apache, поддерживаемый Yahoo!, Google, IBM и другими организациями. Эта статья познакомит вас с платформой Hadoop, и вы узнаете, почему Hadoop является одной из самых важных Linux®-платформ, предназначенных для распределенных вычислений.

Кен Манн, разработчик программного обеспечения, Независимый разработчик

Кен Манн (Ken Mann) – разработчик встроенного программного обеспечения, живущий в окрестностях Денвера. Кен имеет более 20 лет опыта в разработке ПО – от систем моделирования и численного анализа, написанных на языке Fortran 77, до встроенного ПО для проводных и беспроводных телекоммуникационных приложений.



М. Тим Джонс, инженер-консультант, Emulex

M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



02.04.2009

Проект Hadoop был представлен миру осенью 2005 года как часть проекта Nutch, являющегося, в свою очередь, подпроектом системы Lucene группы Apache Software Foundation. Hadoop был представлен в виде проектов MapReduce и Google File System, изначально разработанных компанией Google Labs. В марте 2006 года реализация MapReduce и файловая система Nutch Distributed File System (NDFS) вошли в состав собственного проекта Apache под названием Hadoop.

Платформа Hadoop наиболее популярна в качестве средства классификации Интернет-контента (по ключевым словам поиска), но ее также можно использовать для широкого круга задач, требующих высокой масштабируемости. Например, что произойдет, если вы захотите выполнить команду grep над файлом размером в 10 ТБ? В обычной системе на ее выполнение потребовалось бы невероятно большое количество времени. Однако платформа Hadoop была разработана именно для таких задач и достаточно эффективно справляется с ними.

Предварительные требования

Другие статьи Тима Джонса на сайте developerWorks

Hadoop – это программная платформа (software framework), позволяющая выполнять распределенную обработку огромных массивов данных. При этом Hadoop обеспечивает надежность, эффективность и масштабируемость. Надежность достигается за счет того, что Hadoop предусматривает возможность выхода из строя вычислительных узлов и узлов хранения информации, и поэтому поддерживает несколько рабочих копий данных, обработка которых может быть перераспределена на другие узлы. Эффективность достигается за счет того, что работа Hadoop основана на принципе параллельной обработки данных, позволяющей увеличить скорость работы. Кроме того, платформа Hadoop масштабируема, что позволяет выполнять обработку петабайтных объемов данных. Наконец, Hadoop работает на массовых серверах, что делает ее недорогим и доступным для широкого круга продуктом.

Как можно было предположить, платформа Hadoop, написанная на языке Java™, идеально подходит для работы в среде Linux. Приложения для Hadoop можно разрабатывать с использованием других языков, таких как C++.


Архитектура Hadoop

Платформа Hadoop состоит из нескольких элементов. В основании лежит распределенная файловая система Hadoop Distributed File System (HDFS), распределяющая файлы по нескольким узлам хранения в кластере Hadoop. Над файловой системой HDFS (в рамках рассмотрения этой статьи) располагается механизм MapReduce, состоящий из узлов типов JobTracker и TaskTracker.


HDFS

Для внешнего клиента HDFS выглядит как обычная иерархическая файловая система. Вы можете создавать, удалять, перемещать, переименовывать файлы и так далее. Однако в силу особенностей HDFS архитектура этой файловой системы основана на наборе специальных узлов (см. рисунок 1). Это узел типа NameNode (существует в единственном экземпляре), выполняющий роль служб метаданных HDFS, и узлы типа DataNode, служащие блоками хранения данных HDFS. Существование всего одного узла типа NameNode является проблемой HDFS (единичная точка отказа).

Рисунок 1. Упрощенный вид кластера Hadoop
Упрощенный вид кластера Hadoop

Хранящиеся в HDFS файлы разделены на блоки, которые реплицируются на несколько компьютеров (узлы DataNode). Это отличается от традиционных RAID-архитектур. Размер блока (обычно 64 МБ) и количество его реплик определяются клиентом в момент создания файла. Все файловые операции управляются узлом NameNode. Все взаимодействия внутри HDFS основаны на стандартном протоколе TCP/IP.

Узел NameNode

Узел NameNode представляет собой программный код, обычно выполняющийся на выделенной машине экземпляра HDFS. Этот узел отвечает за управление пространством имен файловой системы и за управление доступом со стороны внешних клиентов. Узел NameNode определяет соответствие между файлами и реплицированными на узлах DataNode блоками. При общепринятой тройной репликации вторая реплика хранится на отдельном узле, расположенном в той же стойке, а третья – на узле, расположенном в другой стойке. Обратите внимание на то, что для понимания этого материала вы должны обладать знаниями о кластерной архитектуре.

Реальные операции ввода/вывода не обращаются к узлу NameNode – через этот узел передаются только метаданные о сопоставлениях между узлами типа DataNode и файловыми блоками. Когда внешний клиент посылает запрос на создание файла, узел NameNode отвечает ему, посылая в ответ идентификационные данные файлового блока и IP-адрес узла DataNode, который будет хранить первую копию этого блока. Также узел NameNode информирует те узлы DataNode, которые будут получать копии данного файлового блока.

Узел NameNode хранит всю информацию о пространстве имен файловой системы в файле с именем FsImage. Этот файл вместе с журналом всех транзакций (файл с именем EditLog) хранится в локальной файловой системе узла NameNode. Файлы FsImage и EditLog также реплицируются с целью их защиты от повреждения или утраты в случае выхода из строя самого узла NameNode.

Узел DataNode

Узел DataNode также представляет собой программный код, обычно выполняющийся на выделенной машине экземпляра HDFS. Кластер Hadoop содержит один узел типа NameNode и сотни или тысячи узлов типа DataNode. Узлы DataNode обычно устанавливаются в стойки, в которых все они подключены к коммутатору. При использовании Hadoop предполагается, что сетевая пропускная способность между узлами одной стойки выше, чем между узлами, установленными в разных стойках.

Узлы DataNode обрабатывают запросы на чтение и запись, поступающие от клиентов файловой системы HDFS. Также они отвечают на команды создания, удаления и реплицирования блоков, полученные от узла NameNode. Узел NameNode получает периодические сообщения о состоянии (т. н. heartbeat-сообщения) от каждого узла DataNode. Каждое такое сообщение содержит отчет, из которого узел NameNode может получить информацию о сопоставлении блоков и о других метаданных файловой системы. Если узлу DataNode не удается отправить сообщение о состоянии, узел NameNode может предпринять корректирующие действия для реплицирования блоков, располагавшихся на отказавшем узле, на другие узлы кластера.

Файловые операции

Теперь вам должно быть понятно, что HDFS не является файловой системой общего назначения. HDFS была специально разработана для поддержки потокового доступа к файлам большого объема, которые записываются однократно. Когда клиенту необходимо записать файл в системе HDFS, этот процесс начинается с кэширования файла во временное локальное хранилище клиента. Когда объем кэшируемых данных превышает заданный размер блока HDFS, узлу NameNode посылается запрос на создание файла. Узел NameNode отвечает клиенту, посылая в ответ идентификатор узла DataNode и блок назначения. Также уведомляются те узлы DataNode, которые будут содержать реплики этого файлового блока. Когда клиент начинает передачу своего временного файла первому узлу DataNode, содержимое файлового блока немедленно ретранслируется узлам реплики с использованием конвейерной технологии. Кроме того, клиенты отвечают за создание файлов, содержащих контрольные суммы, которые также сохраняются в том же самом пространстве имен HDFS. После передачи последнего файлового блока узел NameNode фиксирует факт создания файла в своем постоянном хранилище метаданных (в файлах EditLog и FsImage).

Linux-кластер

Платформу Hadoop можно развернуть на одиночной Linux-системе (в целях разработки и отладки), но реальная ее мощь проявляется при использовании нескольких стоек серверов на массовых компонентах, объединенных в кластер Hadoop. Чтобы принять решение о том, как распределять задания и файлы в кластере, необходимо обладать знаниями о кластерной топологии. Hadoop предполагает возможность выхода из строя узлов кластера и поэтому имеет встроенные методы борьбы с отказами отдельных компьютеров и даже целых стоек.


Приложения Hadoop

Одним из самых распространенных применений Hadoop является Web-поиск. Хотя это не единственное применение этой платформы, эта функция в полной мере проявляет всю ее мощь в качестве механизма параллельной обработки данных. Один из самых интересных аспектов – это процесс Map и Reduce, который был представлен компанией Google. Этот процесс, называемый индексацией, получает от поискового Web-агента текстовые Web-страницы, а в качестве результата сообщает частоту повторения слов, найденных на этих страницах. Затем эти результаты могут быть использованы для Web-поиска содержимого на основании заданных параметров поиска.

Платформа MapReduce

В простейшем приближении приложение платформы MapReduce состоит как минимум из трех частей: функция map, функция reduce и главная функция, которая объединяет управление заданиями и файловым вводом/выводом. В этом отношении Hadoop содержит большое количество интерфейсов и абстрактных классов, предоставляя в распоряжение разработчиков приложений Hadoop большой набор инструментов, начиная с отладчиков, и заканчивая средствами измерения производительности.

MapReduce представляет собой программную платформу (framework) для параллельной обработки больших объемов данных. MapReduce содержит элементы функционального программирования, формально унаследованные от функций map и reduce, характерных для языков функционального программирования. Процесс MapReduce состоит из двух операций, которые могут, в свою очередь, состоять из множества экземпляров (множество операций map, множество операций reduce). Функция Map получает на вход набор данных и преобразует его в список пар ключ/значение – одна пара для каждого элемента входящего набора. Функция Reduce получает на вход данный список и "сворачивает" пары ключ/значение, группируя их по ключам (в результате получается одна пара ключ/значение для каждого ключа).

Ниже приведен пример, помогающий вам понять, что это означает. Предположим, что у вас имеется следующий входящий набор данных: one small step for man, one giant leap for mankind. В результате выполнения над ним функции Map мы получим следующий список пар ключ/значение:

	(one, 1)  (small, 1)  (step, 1)  (for, 1)  (man, 1)
	(one, 1)  (giant, 1)  (leap, 1)  (for, 1)  (mankind, 1)

Теперь выполним над этим списком функцию Reduce, в результате чего получим следующий набор пар ключ/значение:

	(one, 2)    (small, 1)  (step, 1)     (for, 2)  (man, 1)
	(giant, 1)  (leap, 1)   (mankind, 1)

В результате мы получили счетчик слов во входящем наборе, который очевидно является полезным для процесса индексации. Представьте теперь, что ваш входящий набор на самом деле представляет собой два входящих набора данных: one small step for man (первый набор) и one giant leap for mankind (второй набор). Вы можете применить функции Map и Reduce к каждому из этих наборов, а затем еще раз выполнить для двух полученных списков ключ/значение функцию Reduce, получив тот же самый результат, что и в вышеприведенном примере. Другими словами, вы можете распараллелить операции над входящим набором и получить тот же результат, но только намного быстрее. В этом и заключается мощь процесса MapReduce – в его основе лежит возможность распараллеливания на любое количество систем. На рисунке 2 эта идея изображена в терминах сегментации и итерирования

Рисунок 2. Концептуальная схема процесса MapReduce
Концептуальная схема процесса MapReduce

Как эта функциональность реализована в Hadoop? Приложение MapReduce запускается по требованию клиента на единственном управляющем узле, который называется JobTracker. Как и узел NameNode, это единственный узел данного типа в кластере Hadoop, а его задачей является управление приложениями MapReduce. Когда приложение запущено, ему предоставляются входные и выходные директории, содержащиеся в файловой системе HDFS. Узел JobTracker использует информацию о файловых блоках (количество блоков и их месторасположение), чтобы решить, сколько подчиненных задач необходимо создать на узлах типа TaskTracker. Приложение MapReduce копируется на каждый узел, содержащий входные файловые блоки. Для каждого файлового блока заданного узла создается отдельная подчиненная задача. Каждый узел TaskTracker докладывает о статусе работы и о завершении задачи узлу JobTracker. На рисунке 3 показан пример распределенной работы в кластере.

Рисунок 3. Пример кластера Hadoop, показывающий физическое распределение задач обработки и хранения
Пример кластера Hadoop, показывающий физическое распределение задач обработки и хранения

Это является важным аспектом работы Hadoop, поскольку вместо переноса устройств хранения в зону обработки данных, Hadoop переносит задачи обработки в зону хранения данных. Такое масштабирование задач обработки на количество узлов в кластере способствует эффективной обработке данных.


Другие области применения Hadoop

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

Hadoop помогает решать широкий круг задач, включая сортировку огромных объемов данных и разбор содержимого чрезвычайно больших файлов. Кроме того, Hadoop используется в качестве ядра различных поисковых систем, например, A9 от Amazon и система поиска информации о винах Vertical от Able Grape. Страница Hadoop Wiki содержит большой список приложений и компаний, использующих Hadoop в самых различных целях (см. раздел Ресурсы).

В настоящий момент компания Yahoo! имеет самую большую промышленную систему Hadoop под управлением Linux, состоящую из 10 000 ядер и более пяти петабайт дискового пространства, распределенного по узлам DataNode. Web-индекс этой компании содержит приблизительно один триллион ссылок. Однако для ваших задач такой размах может не потребоваться, и в этом случае вы можете использовать Web-сервис Amazon Elastic Compute Cloud (EC2) для построения виртуального кластера из 20 узлов. Например, газета New York Times использовала Hadoop и EC2 для преобразования четырех терабайт TIFF-изображений (включая TIFF-изображения размером в 405 КБ, SGML-статьи размером в 3.3 МБ и XML-файлы размером в 405 КБ) в изображения PNG-формата размером по 800 КБ, и на это ушло 36 часов. Эта концепция, известная как вычислительное облако (cloud computing), является уникальным способом продемонстрировать возможности Hadoop.


Что дальше

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

Ресурсы

Научиться

Получить продукты и технологии

  • Концепцию MapReduce, впервые представленную в языках функционального программирования много десятилетий назад, можно найти в форме плагина. Корпорация IBM создала плагин для Eclipse, упрощающий создание и развертывание приложений MapReduce.
  • Используйте в своем следующем проекте разработки для Linux ознакомительные версии программного обеспечения IBM, которые можно скачать непосредственно с developerWorks (EN).

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=379870
ArticleTitle=Распределенные вычисления с помощью Linux и Hadoop
publish-date=04022009