Hadoop

22 Февраль 2008 13 Comments Иван Блинков

Hadoop Logo
Hadoop представляет собой платформу для построения приложений, способных обрабатывать огромные объемы данных. Система основывается на распределенном подходе к вычислениям и хранению информации, основными ее особенностями являются:

  • Масштабируемость: с помощью Hadoop возможно надежное хранение и обработка огромных объемов данных, которые могут измеряться петабайтами;
  • Экономичность: информация и вычисления распределяются по кластеру, построенному на самом обыкновенном оборудовании. Такой кластер может состоять из тысяч узлов;
  • Эффективность: распределение данных позволяет выполнять их обработку параллельно на множестве компьютеров, что существенно ускоряет этот процесс;
  • Надежность: при хранении данных возможно предоставление избыточности, благодаря хранению нескольких копий. Такой подход позволяет гарантировать отсутствие потерь информации в случае сбоев в работе системы;
  • Кроссплатформенность: так как основным языком программирования, используемым в этой системе является Java, развернуть ее можно на базе любой операционной системы, имеющей JVM.

HDFS

В основе всей системы лежит распределенная файловая система под незамысловатым названием Hadoop Distributed File System. Представляет она собой вполне стандартную распределенную файловую систему, но все же она обладает рядом особенностей:

  • Устойчивость к сбоям, разработчики рассматривали сбои в оборудовании скорее как норму, чем как исключение;
  • Приспособленность к развертке на самом обыкновенном ненадежном оборудовании;
  • Предоставление высокоскоростного потокового доступа ко всем данным;
  • Настроена для работы с большими файлами и наборами файлов;
  • Простая модель работы с данными: один раз записали — много раз прочли;
  • Следование принципу: переместить вычисления проще, чем переместить данные;

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

Проще всего ее демонстрирует схема, позаимствованная с официального сайта проекта и переведенная мной на руский:
Архитектура HDFS

Действующие лица:

Namenode
Этот компонент системы осуществляет всю работу с метаданными. Он должен быть запущен только на одном компьютере в кластере. Именно он управляет размещением информации и доступом ко всем данным, расположенным на ресурсах кластера. Сами данные проходят с остальных машин кластера к клиенту мимо него.
Datanode
На всех остальных компьютерах системы работает именно этот компонент. Он располагает сами блоки данных в локальной файловой системе для последующей передачи или обработки их по запросу клиента. Группы узлов данных принято называть Rack, они используются, например, в схемах репликации данных.
Клиент
Просто приложение или пользователь, работающий с файловой системой. В его роли может выступать практически что угодно.

Пространство имен HDFS имеет классическую иерархическую структуру: пользователи и приложения имеют возможность создавать директории и файлы. Файлы хранятся в виде блоков данных произвольной (но одинаковой, за исключением последнего; по-умолчанию 64 mb) длины, размещенных на Datanode‘ах. Для обеспечения отказоустойчивости блоки хранятся в нескольких экземплярах на разных узлах, имеется возможность настройки количества копий и алгоритма их распределения по системе. Удаление файлов происходит не сразу, а через какое-то время после соответствующего запроса, так как после получения запроса файл перемещается в директорию /trash и хранится там определенный период времени на случай если пользователь или приложение передумают о своем решении. В этом случае информацию можно будет восстановить, в противном случае — физически удалить.

Для обнаружения возникновения каких-либо неисправностей, Datanode периодически отправляют Namenode‘у сигналы о своей работоспособности. При прекращении получения таких сигналов от одного из узлов Namenode помечает его как «мертвый», и прекращает какой-либо с ним взаимодействие до возвращения его работоспособности. Данные, хранившиеся на «умершем» узле реплицируются дополнительный раз из оставшихся «в живых» копий и система продолжает свое функционирование как ни в чем не бывало.

Все коммуникации между компонентами файловой системы проходят по специальным протоколам, основывающимся на стандартном TCP/IP. Клиенты работают с Namenode с помощью так называемого ClientProtocol, а передача данных происходит по DatanodeProtocol, оба они обернуты в Remote Procedure Call (RPC).

Система предоставляет несколько интерфейсов, среди которых командная оболочка DFSShell, набор ПО для администрирования DFSAdmin, а также простой, но эффективный веб-интерфейс. Помимо этого существуют несколько API для языков программирования: Java API, C pipeline, WebDAV и так далее.

MapReduce

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

Map
Целью этого этапа является представление произвольных данных (на практике чаще всего просто пары ключ-значение) в виде промежуточных пар ключ-значение. Результаты сортируются и групируются по ключу и передаются на следующий этап.
Reduce
Полученные после map значения используются для финального вычисления требуемых данных. Практические любые данные могут быть получены таким образом, все зависит от требований и функционала приложения.

Задания выполняются, подобно файловой системе, на всех машинах в кластере (чаще всего одних и тех же). Одна из них выполняет роль управления работой остальных — JobTracker, остальные же ее бесприкословно слушаются — TaskTracker. В задачи JobTracker‘а входит составление расписания выполняемых работ, наблюдение за ходом выполнения, и перераспределение в случае возникновения сбоев.

В общем случае каждое приложение, работающее с этим framework’ом, предоставляет методы для осуществления этапов map и reduce, а также указывает расположения входных и выходных данных. После получения этих данных JobTracker распределяет задание между остальными машинами и предоставляет клиенту полную информацию о ходе работ.

Помимо основных вычислений могут выполняться вспомогательные процессы, такие как составление отчетов о ходе работы, кэширование, сортировка и так далее.

HBase

HBase Logo
В рамках Hadoop доступна еще и система хранения данных, которую правда сложно назвать СУБД в традиционном смысле этого слова. Чаще проводят аналогии с проприетарной системой этого же плана от GoogleBigTable.

HBase представляет собой распределенную систему хранения больших объемов данных. Подобно реляционным СУБД данные хранятся в виде таблиц, состоящих из строк и столбцов. И даже для доступа к ним предоставляется язык запросов HQL (как ни странно — Hadoop Query Language), отдаленно напоминающий более распространенный SQL. Помимо этого предоставляется итерирующмй интерфейс для сканирования наборов строк.

Одной из основных особенностей хранения данных в HBase является возможность наличия нескольких значений, соответствующих одной комбинации таблица-строка-столбец, для их различения используется информация о времени добавления записи. На концептуальном уровне таблицы обычно представляют как набор строк, но физически же они хранятся по столбцам, достаточно важный факт, который стоит учитывать при разработки схемы хранения данных. Пустые ячейки не отображаются каким-либо образом физически в хранимых данных, они просто отсутствуют. Существуют конечно и другие нюансы, но я постарался упомянуть лишь основные.

HQL очень прост по своей сути, если Вы уже знаете SQL, то для изучения его Вам понадобится лишь просмотреть по диагонали коротенький вывод команды help;, занимающий всего пару экранов в консоли. Все те же SELECT, INSERT, UPDATE, DROP и так далее, лишь со слегка измененным синтаксисом.

Помимо обычно командной оболочки HBase Shell, для работы с HBase также предоставлено несколько API для различных языков программирования: Java, Jython, REST и Thrift.

Заключение

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

13 comments

  • Спасибо за статью. Действительно инетерсный фраймворк.

  • Единственный недостаток имхо в медленности программ на java. Кпд будет заметно ниже чем, если бы система была написана на тех же С++. При построении высоконагрузочной системы можно забить на кроссплатформенность, т.к. оборудование скорее всего будет использоваться специально под проект и можно создавать систему сразу на одной платформе.

  • G0dSha:

    А если умрет Namenode?

  • [quote comment="239"]Спасибо за статью. Действительно инетерсный фраймворк.[/quote]Рад, что Вам понравилось!
    [quote comment="240"]Единственный недостаток имхо в медленности программ на java. Кпд будет заметно ниже чем, если бы система была написана на тех же С++. При построении высоконагрузочной системы можно забить на кроссплатформенность, т.к. оборудование скорее всего будет использоваться специально под проект и можно создавать систему сразу на одной платформе.[/quote]Чисто в теории я бы конечно согласился, но этот продукт медлительным назвать сложно. Вчера я успел только развернуть эту систему у себя дома и запустить демонстрационные вычисления, которые были в комплекте. Но даже при более чем скромной вычислительной мощности моего «кластера» оно выполняло вычисления вроде подсчета количества экземпляров каждого слова для нескольких книг в .txt буквально за пару секунд.
    [quote comment="242"]А если умрет Namenode?[/quote]
    Да, на данный момент это основное узкое место в плане надежности. Метаданные конечно тоже реплицируются, но автоматическое перехватывание его роли другим компьютером в кластере в случае сбоя Namenode разработчики еще только пишут, к релизу по идее должно быть и это воплощено в жизнь.

  • johnjoy:

    G0dSha писал:
    А если умрет Namenode?

    Все умрет =)
    На самом деле, в продакшн он ставится в failover стандартными средствами — 2 сервера+shared storage.
    Также замечу, что у GoogleFS/BigTable тоже есть центральный нод, который тоже может упасть.

    Про яву тоже мои 5 копеек:
    Конечно, было бы быстрее, только не на порядок, а раза в 2, что уже не так критично. В любом случае, гораздо больший прирост производительности дает доработка архитектуры и кода, а не смена языка.
    С другой стороны, на яве разарабатывать быстрее, и поддерживать код проще (а хадуп уже оч большой проект, особенно если приплюсовать к нему lucene и nutch).
    К тому же, использование c/c++ (с их отсутствием защиты от дурака) для написания map/reduce задач было бы весьма проблемным делом (и явовские-то писать нелегко, стоит только слегка отклониться от данных хадупом классов для использования)

  • [quote comment="273"]G0dSha писал:
    А если умрет Namenode?

    Все умрет =)
    [/quote]Скорее не умрет, а упадет; просто-напросто понадобится ручное вмешательство для возвращения системы к жизни. Репликацию-то своих данных оно умеет делать…
    [quote comment="273"]Конечно, было бы быстрее, только не на порядок, а раза в 2, что уже не так критично. В любом случае, гораздо больший прирост производительности дает доработка архитектуры и кода, а не смена языка.
    С другой стороны, на яве разарабатывать быстрее, и поддерживать код проще (а хадуп уже оч большой проект, особенно если приплюсовать к нему lucene и nutch).
    К тому же, использование c/c++ (с их отсутствием защиты от дурака) для написания map/reduce задач было бы весьма проблемным делом (и явовские-то писать нелегко, стоит только слегка отклониться от данных хадупом классов для использования)[/quote]
    А тут сложно не согласиться, на C следовать принципу «keep it simple» было бы существенно сложнее. Только вот все предположения насчет «на С было быстрее» взяты, по-моему, с потолка… Да и при желании никто не мешает использовать в качестве обработчиков данных любые подходящие скрипты и исполняемые файлы.

  • [...] Ивана Блинкова “Hadoop для разработчика” и “Hadoop“. —> Вы можете Оставить комментарий (0) или [...]

  • vezhnind:

    Почему это Java работает медленнее C++?
    Преимущества Java:
    1 Runtime-компиляция под текущий процессор.
    2 Работа с памятью более эффективная чем в C++ (но не C#)
    3 Повышает производительность разработчика при разработке больших продуктов. А на деньги сэкономленные с одного разработчика можно докпить пару серверов в кластер.

    Я бы сказал, что в целом ситуация такова:
    если 100 программистов пишут приложение/сервис, который будет где-то исполнятся в единственно экземпляре — то нужно экономить на людях и покупать больше серверов. Поэтому Java очень подходит для серверных систем

  • Анонимный посетитель:

    vezhnind,
    С каких это пор в Java работа с памятью эффективнее чем в C++??? Я на C++ так могу заоптимайзить работу с памятью, что работать это будет на два порядка быстрее. Да да, именно на два — не меньше! Проверено ни раз!

  • [quote comment="408"]vezhnind,
    С каких это пор в Java работа с памятью эффективнее чем в C++??? Я на C++ так могу заоптимайзить работу с памятью, что работать это будет на два порядка быстрее. Да да, именно на два — не меньше! Проверено ни раз![/quote]Я был бы рад, если бы Вы представились.

    А если по теме, то не забываем, что:
    1) это opensource — пишется далеко не одним человеком, оптимизация работы с памятью на C могло бы довести и до массы memory leak’ов благодаря мелкой ошибке одного из программистов. На Java шанс чего-то подобного существенно ниже.
    2) это Apache — они активно сотрудничают с Sun во многих отношениях, а Java используется достаточно активно в их проектах — чего стоят только Tomcat, Lucene и Solr.

  • [...] меня подтолкнул вовсе не этот список. В комментариях к одной из предыдущих моих записей читатели подняли тему о целесообразности [...]

  • [...] данных будут на платформе с открытым исходным кодом Apache Hadoop, а также и другое программное обеспечение open [...]

  • [...] данных будут на платформе с открытым исходным кодом Apache Hadoop, а также и другое программное обеспечение open [...]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>