Apache Hadoop ( / h ə ˈ d uː p / ) — это набор программных утилит с открытым исходным кодом , которые облегчают использование сети из множества компьютеров для решения задач, связанных с огромными объемами данных и вычислений. [ неопределенно ] Он предоставляет программную среду для распределенного хранения и обработки больших данных с использованием модели программирования MapReduce . Изначально Hadoop был разработан для компьютерных кластеров , построенных на обычном оборудовании , которое до сих пор широко используется. [3] С тех пор он также нашел применение в кластерах высокопроизводительного оборудования. [4] [5] Все модули Hadoop разработаны с фундаментальным предположением, что аппаратные сбои являются обычным явлением и должны автоматически обрабатываться платформой. [6]
Ядро Apache Hadoop состоит из части хранения, известной как распределенная файловая система Hadoop (HDFS), и части обработки, которая представляет собой модель программирования MapReduce. Hadoop разбивает файлы на большие блоки и распределяет их по узлам кластера. Затем он передает упакованный код в узлы для параллельной обработки данных. Этот подход использует преимущества локальности данных [7] , когда узлы манипулируют данными, к которым у них есть доступ. Это позволяет обрабатывать набор данных быстрее и эффективнее, чем это было бы в более традиционной архитектуре суперкомпьютера , основанной на параллельной файловой системе , где вычисления и данные распределяются через высокоскоростную сеть. [8] [9]
Базовая платформа Apache Hadoop состоит из следующих модулей:
Термин Hadoop часто используется как для базовых модулей , так и для подмодулей, а также для экосистемы [12] или набора дополнительных программных пакетов, которые могут быть установлены поверх или вместе с Hadoop, таких как Apache Pig , Apache Hive , Apache HBase , Apache Phoenix , Apache Spark , Apache ZooKeeper , Apache Impala , Apache Flume , Apache Sqoop , Apache Oozie и Apache Storm . [13]
Компоненты MapReduce и HDFS Apache Hadoop были вдохновлены документами Google о MapReduce и файловой системе Google . [14]
Сама платформа Hadoop в основном написана на языке программирования Java , с некоторым собственным кодом на C и утилитами командной строки , написанными в виде сценариев оболочки . Хотя Java-код MapReduce является распространенным, любой язык программирования можно использовать с Hadoop Streaming для реализации карты и сокращения частей пользовательской программы. [15] Другие проекты в экосистеме Hadoop предоставляют более богатые пользовательские интерфейсы.
По словам его соучредителей Дуга Каттинга и Майка Кафареллы , Hadoop возник из статьи о файловой системе Google, опубликованной в октябре 2003 года. [16] [17] Эта статья породила еще одну статью от Google — «MapReduce: упрощенная обработка данных». о больших кластерах». [18] Разработка началась с проекта Apache Nutch , но в январе 2006 года была перенесена в новый подпроект Hadoop . [19] Дуг Каттинг, работавший в Yahoo! в то время назвал его в честь игрушечного слона своего сына. [20] Первоначальный код, выделенный из Nutch, состоял примерно из 5000 строк кода для HDFS и около 6000 строк кода для MapReduce.
В марте 2006 года Оуэн О'Мэлли стал первым коммиттером, присоединившимся к проекту Hadoop; [21] Hadoop 0.1.0 был выпущен в апреле 2006 года. [22] Он продолжает развиваться благодаря вкладам, вносимым в проект. [23] Самый первый проектный документ для распределенной файловой системы Hadoop был написан Дхрубой Бортакуром в 2007 году. [24]
Hadoop состоит из пакета Hadoop Common , который предоставляет абстракции уровня файловой системы и операционной системы, механизма MapReduce (либо MapReduce/MR1, либо YARN/MR2) [32] и распределенной файловой системы Hadoop (HDFS). Пакет Hadoop Common содержит файлы Java Archive (JAR) и сценарии, необходимые для запуска Hadoop.
Для эффективного планирования работы каждая файловая система, совместимая с Hadoop, должна обеспечивать информацию о местоположении, то есть имени стойки, в частности сетевого коммутатора, где находится рабочий узел. Приложения Hadoop могут использовать эту информацию для выполнения кода на узле, где находятся данные, а в противном случае — на той же стойке/коммутаторе для уменьшения трафика по магистральной сети. HDFS использует этот метод при репликации данных для обеспечения избыточности данных в нескольких стойках. Такой подход снижает последствия отключения электроэнергии в стойке или отказа коммутатора; если произойдет какой-либо из этих аппаратных сбоев, данные останутся доступными. [33]
Небольшой кластер Hadoop включает один главный и несколько рабочих узлов. Главный узел состоит из Job Tracker, Task Tracker, NameNode и DataNode. Подчиненный или рабочий узел действует как DataNode и TaskTracker, хотя можно иметь рабочие узлы только для данных и только для вычислений. Обычно они используются только в нестандартных приложениях. [34]
Для Hadoop требуется среда выполнения Java (JRE) 1.6 или выше. Стандартные сценарии запуска и завершения работы требуют установки Secure Shell (SSH) между узлами кластера. [35]
В более крупном кластере узлы HDFS управляются через выделенный сервер NameNode, на котором размещается индекс файловой системы, и вторичный NameNode, который может создавать снимки структур памяти узла name, тем самым предотвращая повреждение файловой системы и потерю данных. Аналогично, автономный сервер JobTracker может управлять планированием заданий между узлами. Когда Hadoop MapReduce используется с альтернативной файловой системой, архитектура HDFS NameNode, вторичного NameNode и DataNode заменяется эквивалентами, специфичными для файловой системы.
Распределенная файловая система Hadoop ( HDFS) — это распределенная, масштабируемая и переносимая файловая система , написанная на Java для платформы Hadoop. Некоторые считают, что это вместо этого хранилище данных из-за отсутствия совместимости с POSIX , [36] но оно предоставляет команды оболочки и методы интерфейса прикладного программирования Java (API) , которые аналогичны другим файловым системам. [37] Экземпляр Hadoop разделен на HDFS и MapReduce. HDFS используется для хранения данных, а MapReduce — для обработки данных. HDFS имеет пять следующих служб:
Три верхних — это главные службы/демоны/узлы, а две нижние — ведомые службы. Главные службы могут взаимодействовать друг с другом, и подчиненные службы могут взаимодействовать друг с другом точно так же. Узел имени является главным узлом, а узел данных — соответствующим подчиненным узлом и может взаимодействовать друг с другом.
Узел имени: HDFS состоит только из одного узла имени, который называется главным узлом. Главный узел может отслеживать файлы, управлять файловой системой и хранить в себе метаданные всех хранящихся данных. В частности, узел имени содержит сведения о количестве блоков, местоположении узла данных, в котором хранятся данные, где хранятся репликации, и другие сведения. Узел имени имеет прямой контакт с клиентом.
Узел данных: Узел данных хранит в себе данные в виде блоков. Он также известен как подчиненный узел и сохраняет фактические данные в HDFS, которая отвечает за чтение и запись клиента. Это рабы-демоны. Каждый узел данных отправляет сообщение Heartbeat узлу имени каждые 3 секунды и сообщает, что он активен. Таким образом, если узел имени не получает контрольного сигнала от узла данных в течение 2 минут, он будет считать этот узел данных мертвым и запускает процесс репликации блоков на каком-либо другом узле данных.
Узел вторичного имени: предназначен только для проверки контрольных точек метаданных файловой системы, которые находятся в узле имени. Это также известно как контрольно-пропускной узел. Это вспомогательный узел для узла имени. Узел вторичного имени дает указание узлу имени создать и отправить файл fsimage и editlog, после чего сжатый файл fsimage создается узлом вторичного имени. [38]
Job Tracker: Job Tracker получает запросы на выполнение Map сокращения от клиента. Трекер заданий связывается с узлом имени, чтобы узнать о местоположении данных, которые будут использоваться при обработке. Узел имени отвечает метаданными необходимых данных обработки.
Трекер задач: это подчиненный узел для трекера заданий, который принимает задачи от трекера заданий. Он также получает код от Job Tracker. Task Tracker возьмет код и применит его к файлу. Процесс применения этого кода к файлу известен как Mapper. [39]
Кластер Hadoop номинально имеет один узел имени и кластер узлов данных, хотя для узла имени доступны варианты резервирования из-за его критичности. Каждый узел данных обслуживает блоки данных по сети, используя блочный протокол, специфичный для HDFS. Файловая система использует для связи сокеты TCP/IP . Клиенты используют удаленные вызовы процедур (RPC) для связи друг с другом.
HDFS хранит большие файлы (обычно от гигабайт до терабайт [40] ) на нескольких машинах. Он обеспечивает надежность за счет репликации данных на несколько хостов и, следовательно, теоретически не требует резервного массива независимых дисков (RAID) для хранения на хостах (но для повышения производительности ввода-вывода (I/O) некоторые конфигурации RAID все еще полезны). При значении репликации по умолчанию, равном 3, данные хранятся на трех узлах: два в одной стойке и один в другой стойке. Узлы данных могут взаимодействовать друг с другом, чтобы сбалансировать данные, перемещать копии и поддерживать высокий уровень репликации данных. HDFS не полностью совместима с POSIX, поскольку требования к файловой системе POSIX отличаются от целевых целей приложения Hadoop. Компромисс отсутствия полностью совместимой с POSIX файловой системы заключается в повышении производительности при пропускной способности данных и поддержке операций, не относящихся к POSIX, таких как Append. [41]
В мае 2012 года в HDFS были добавлены возможности высокой доступности, [42] позволяющие основному серверу метаданных, называемому NameNode, вручную переключаться на резервную копию. В рамках проекта также началась разработка автоматического аварийного переключения .
Файловая система HDFS включает в себя так называемый вторичный узел имени — вводящий в заблуждение термин, который некоторые могут неправильно интерпретировать как резервный узел имени, когда основной узел имени переходит в автономный режим. Фактически, вторичный узел имен регулярно соединяется с основным узлом имен и создает снимки информации каталога первичного узла имен, которые система затем сохраняет в локальных или удаленных каталогах. Эти образы с контрольными точками можно использовать для перезапуска отказавшего основного узла без необходимости воспроизведения всего журнала действий файловой системы, а затем для редактирования журнала для создания актуальной структуры каталогов. Поскольку namenode является единой точкой хранения и управления метаданными, он может стать узким местом для поддержки огромного количества файлов, особенно большого количества небольших файлов. HDFS Federation, новое дополнение, направлено на решение этой проблемы в определенной степени, позволяя использовать несколько пространств имен, обслуживаемых отдельными узлами имен. Кроме того, в HDFS есть некоторые проблемы, такие как проблемы с небольшими файлами, проблемы масштабируемости, единая точка отказа (SPoF) и узкие места в огромных запросах метаданных. Одним из преимуществ использования HDFS является обмен данными между системой отслеживания заданий и системой отслеживания задач. Планировщик заданий сопоставляет или сокращает задания с помощью трекеров задач с учетом местоположения данных. Например: если узел A содержит данные (a, b, c), а узел X содержит данные (x, y, z), средство отслеживания заданий планирует узел A для выполнения задач сопоставления или сокращения на (a, b, c), а узел X будет запланирован для выполнения задач по отображению или сокращению на (x, y, z). Это уменьшает объем трафика, проходящего по сети, и предотвращает ненужную передачу данных. Когда Hadoop используется с другими файловыми системами, это преимущество не всегда доступно. Это может оказать существенное влияние на время выполнения заданий, как показано на примере заданий с интенсивным использованием данных. [43]
HDFS была разработана в основном для неизменяемых файлов и может не подходить для систем, требующих одновременных операций записи. [41]
HDFS можно смонтировать непосредственно с виртуальной файловой системой « Файловая система в пространстве пользователя » (FUSE) в Linux и некоторых других системах Unix .
Доступ к файлам может быть обеспечен через собственный Java API, Thrift API (создает клиент на нескольких языках, например C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa , Smalltalk и OCaml ), интерфейс командной строки , веб-приложение HDFS-UI через HTTP или через сторонние сетевые клиентские библиотеки. [44]
HDFS предназначена для переносимости на различные аппаратные платформы и совместимости с различными базовыми операционными системами. Конструкция HDFS накладывает ограничения на переносимость, которые приводят к некоторым узким местам в производительности, поскольку реализация Java не может использовать функции, эксклюзивные для платформы, на которой работает HDFS. [45] Из-за широкой интеграции в инфраструктуру уровня предприятия мониторинг производительности HDFS в масштабе становится все более важной проблемой. Мониторинг сквозной производительности требует отслеживания показателей узлов данных, узлов имен и базовой операционной системы. [46] В настоящее время существует несколько платформ мониторинга для отслеживания производительности HDFS, включая Hortonworks , Cloudera и Datadog .
Hadoop работает напрямую с любой распределенной файловой системой, которую можно смонтировать базовой операционной системой, просто используя file://
URL-адрес; однако за это приходится платить — потерю локальности. Чтобы сократить сетевой трафик, Hadoop необходимо знать, какие серверы находятся ближе всего к данным. Эту информацию могут предоставить мосты файловой системы, специфичные для Hadoop.
В мае 2011 года список поддерживаемых файловых систем в комплекте с Apache Hadoop был:
Также был написан ряд сторонних мостов файловых систем, ни один из которых в настоящее время не присутствует в дистрибутивах Hadoop. Однако некоторые коммерческие дистрибутивы Hadoop поставляются с альтернативной файловой системой по умолчанию, в частности IBM и MapR .
Над файловыми системами находится механизм MapReduce, который состоит из одного JobTracker , которому клиентские приложения отправляют задания MapReduce. JobTracker передает работу на доступные узлы TaskTracker в кластере, стремясь максимально приблизить работу к данным. Благодаря файловой системе с поддержкой стойки JobTracker знает, какой узел содержит данные и какие другие машины находятся поблизости. Если работу невозможно разместить на фактическом узле, где находятся данные, приоритет отдается узлам в той же стойке. Это снижает сетевой трафик в основной магистральной сети. Если TaskTracker дает сбой или истекает время ожидания, эта часть задания переносится. TaskTracker на каждом узле запускает отдельный процесс виртуальной машины Java (JVM), чтобы предотвратить сбой самого TaskTracker, если выполняемое задание приведет к сбою его JVM. Контрольный сигнал отправляется из TaskTracker в JobTracker каждые несколько минут для проверки его статуса. Статус и информация Job Tracker и TaskTracker предоставляются Jetty и их можно просмотреть в веб-браузере.
Известные ограничения этого подхода:
По умолчанию Hadoop использует планирование FIFO и дополнительно 5 приоритетов планирования для планирования заданий из рабочей очереди. [53] В версии 0.19 планировщик заданий был переработан из JobTracker с добавлением возможности использования альтернативного планировщика (например, планировщика Fair или планировщика емкости , описанного ниже). [54]
Планировщик ярмарки был разработан Facebook . [55] Целью справедливого планировщика является обеспечение быстрого ответа для небольших заданий и качества обслуживания (QoS) для производственных заданий. Планировщик ярмарки имеет три основные концепции. [56]
По умолчанию задания, не отнесенные к категориям, попадают в пул по умолчанию. В пулах необходимо указать минимальное количество слотов карты, сократить слоты, а также ограничить количество запущенных заданий.
Планировщик емкости был разработан Yahoo. Планировщик емкости поддерживает несколько функций, аналогичных функциям справедливого планировщика. [57]
При выполнении задания вытеснение отсутствует .
Самая большая разница между Hadoop 1 и Hadoop 2 — это добавление YARN (еще одного переговорщика ресурсов), который заменил механизм MapReduce в первой версии Hadoop. YARN стремится эффективно распределять ресурсы для различных приложений. Он запускает два демона, которые выполняют две разные задачи: менеджер ресурсов , который отслеживает задания и выделяет ресурсы приложениям, и мастер приложений , который отслеживает ход выполнения.
Hadoop 3 предоставляет важные функции. Например, хотя в Hadoop 2 имеется один единственный узел имен , Hadoop 3 позволяет иметь несколько узлов имен, что решает проблему единой точки отказа.
В Hadoop 3 есть контейнеры, работающие по принципу Docker , что сокращает время, затрачиваемое на разработку приложений.
Одним из самых больших изменений является то, что Hadoop 3 снижает нагрузку на хранилище за счет стирающего кодирования .
Кроме того, Hadoop 3 позволяет использовать аппаратное обеспечение графического процессора внутри кластера, что является очень существенным преимуществом для выполнения алгоритмов глубокого обучения в кластере Hadoop. [58]
HDFS не ограничивается заданиями MapReduce. Его можно использовать для других приложений, многие из которых находятся в стадии разработки в Apache. В список вошли база данных HBase , система машинного обучения Apache Mahout и хранилище данных Apache Hive . Теоретически Hadoop можно использовать для любой рабочей нагрузки, которая ориентирована на пакетную обработку, а не на работу в режиме реального времени, требует большого объема данных и получает преимущества от параллельной обработки . Его также можно использовать для дополнения систем реального времени, таких как лямбда-архитектура , Apache Storm , Flink и Spark Streaming . [59]
Коммерческие приложения Hadoop включают: [60]
19 февраля 2008 г. Yahoo! Inc. запустила, как они утверждали, крупнейшее в мире производственное приложение Hadoop. Yahoo! Search Webmap — это приложение Hadoop, которое работает в кластере Linux с более чем 10 000 ядер и генерирует данные, которые используются в каждом Yahoo! поисковый запрос в сети. [61] На Yahoo! существует несколько кластеров Hadoop. и никакие файловые системы HDFS или задания MapReduce не распределяются по нескольким центрам обработки данных. Каждый узел кластера Hadoop загружает образ Linux, включая дистрибутив Hadoop. Известно, что работа, которую выполняют кластеры, включает в себя расчеты индексов Yahoo! поисковый движок. В июне 2009 года Yahoo! предоставила исходный код своей версии Hadoop обществу открытого исходного кода. [62]
В 2010 году Facebook заявил, что у них самый большой кластер Hadoop в мире с 21 ПБ хранилища. [63] В июне 2012 года они объявили, что объем данных вырос до 100 ПБ [64] , а позже в том же году они объявили, что объем данных растет примерно на половину ПБ в день. [65]
По состоянию на 2013 год [update]внедрение Hadoop стало широко распространенным: более половины компаний из списка Fortune 50 использовали Hadoop. [66]
Hadoop можно развернуть как в традиционном центре обработки данных, так и в облаке . [67] Облако позволяет организациям развертывать Hadoop без необходимости приобретения оборудования или специальных знаний по настройке. [68]
Ряд компаний предлагают коммерческое внедрение или поддержку Hadoop. [69]
Apache Software Foundation заявил, что только программное обеспечение, официально выпущенное в рамках проекта Apache Hadoop, может называться Apache Hadoop или дистрибутивами Apache Hadoop . [70] Названия продуктов и производных продуктов других поставщиков, а также термин «совместимый» вызывают некоторые споры в сообществе разработчиков Hadoop. [71]
Некоторые статьи повлияли на рождение и развитие Hadoop и обработки больших данных. Некоторые из них:
Компания Lucene PMC проголосовала за разделение части Nutch на новый подпроект под названием Hadoop.
HDFS не является файловой системой в традиционном смысле и обычно не монтируется напрямую для просмотра пользователем.
{{cite journal}}
: Требуется цитировать журнал |journal=
( помощь ){{cite web}}
: CS1 maint: bot: original URL status unknown (link)