Apache Hadoop ( / hə ˈ d uː p / ) — это набор программных утилит с открытым исходным кодом , которые облегчают использование сети из множества компьютеров для решения задач, связанных с большими объемами данных и вычислений. [ неопределенно ] Он предоставляет программную среду для распределенного хранения и обработки больших данных с использованием модели программирования MapReduce . Первоначально Hadoop был разработан для компьютерных кластеров, построенных на основе стандартного оборудования , что до сих пор является общепринятым применением. [3] С тех пор он также нашел применение в кластерах более высокопроизводительного оборудования. [4] [5] Все модули в Hadoop разработаны с фундаментальным предположением, что отказы оборудования являются обычным явлением и должны автоматически обрабатываться средой. [6]
Ядро Apache Hadoop состоит из части хранения, известной как Hadoop Distributed File System (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]
Компоненты Apache Hadoop MapReduce и HDFS были вдохновлены документами Google по MapReduce и Google File System . [14]
Сама структура Hadoop в основном написана на языке программирования Java , с некоторым собственным кодом на C и утилитами командной строки , написанными как скрипты оболочки . Хотя код MapReduce Java является распространенным, любой язык программирования может быть использован с Hadoop Streaming для реализации частей map и reduce пользовательской программы. [15] Другие проекты в экосистеме Hadoop предоставляют более богатые пользовательские интерфейсы.
По словам его соучредителей, Дуга Каттинга и Майка Кафареллы , истоки Hadoop лежат в статье Google File System, опубликованной в октябре 2003 года. [16] [17] Эта статья породила еще одну от Google — «MapReduce: упрощенная обработка данных в больших кластерах». [18] Разработка началась с проекта Apache Nutch , но была перенесена в новый подпроект Hadoop в январе 2006 года. [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 Runtime Environment (JRE) 1.6 или выше. Стандартные сценарии запуска и выключения требуют, чтобы Secure Shell (SSH) был настроен между узлами в кластере. [35]
В более крупном кластере узлы HDFS управляются через выделенный сервер NameNode для размещения индекса файловой системы и вторичный NameNode, который может генерировать снимки структур памяти namenode, тем самым предотвращая повреждение файловой системы и потерю данных. Аналогично, автономный сервер JobTracker может управлять планированием заданий по узлам. Когда Hadoop MapReduce используется с альтернативной файловой системой, архитектура NameNode, вторичный NameNode и DataNode HDFS заменяется эквивалентами, специфичными для файловой системы.
Распределенная файловая система Hadoop ( HDFS) — это распределенная, масштабируемая и переносимая файловая система, написанная на Java для фреймворка Hadoop. Некоторые считают ее хранилищем данных из- за отсутствия соответствия POSIX , [36] но она предоставляет команды оболочки и методы интерфейса программирования приложений Java (API) , которые похожи на методы других файловых систем. [37] Экземпляр Hadoop делится на HDFS и MapReduce. HDFS используется для хранения данных, а MapReduce — для обработки данных. HDFS имеет пять служб, как указано ниже:
Верхние три — это главные службы/демоны/узлы, а нижние два — подчиненные службы. Главные службы могут общаться друг с другом, и таким же образом подчиненные службы могут общаться друг с другом. Узел имени — это главный узел, а узел данных — это соответствующий ему подчиненный узел, и они могут общаться друг с другом.
Узел имени: HDFS состоит только из одного узла имени, который называется главным узлом. Главный узел может отслеживать файлы, управлять файловой системой и имеет метаданные всех хранящихся в нем данных. В частности, узел имени содержит сведения о количестве блоков, местоположении узла данных, в котором хранятся данные, где хранятся репликации и другие сведения. Узел имени имеет прямой контакт с клиентом.
Узел данных: Узел данных хранит данные в нем в виде блоков. Он также известен как подчиненный узел и хранит фактические данные в HDFS, которая отвечает за чтение и запись клиентом. Это подчиненные демоны. Каждый узел данных отправляет сообщение Heartbeat узлу Name каждые 3 секунды и сообщает, что он активен. Таким образом, когда узел Name не получает сообщение Heartbeat от узла данных в течение 2 минут, он считает этот узел данных мертвым и запускает процесс репликации блоков на каком-то другом узле данных.
Вторичный узел имени: Он предназначен только для обработки контрольных точек метаданных файловой системы, которые находятся в узле имени. Он также известен как узел контрольной точки. Это вспомогательный узел для узла имени. Вторичный узел имени инструктирует узел имени создать и отправить файл fsimage и editlog, после чего вторичный узел имени создает сжатый файл fsimage. [38]
Job Tracker: Job Tracker получает запросы на выполнение Map Reduce от клиента. Job Tracker обращается к Name Node, чтобы узнать о местоположении данных, которые будут использоваться при обработке. Name Node отвечает метаданными требуемых данных обработки.
Task Tracker: это подчиненный узел для Job Tracker, и он берет задачу из Job Tracker. Он также получает код из 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 , вводящий в заблуждение термин, который некоторые могут неправильно интерпретировать как резервный namenode, когда основной namenode отключается. Фактически, вторичный namenode регулярно подключается к первичному namenode и создает снимки информации каталога первичного namenode, которые система затем сохраняет в локальных или удаленных каталогах. Эти контрольные образы можно использовать для перезапуска неисправного первичного namenode без необходимости воспроизводить весь журнал действий файловой системы, а затем редактировать журнал для создания актуальной структуры каталогов. Поскольку namenode является единой точкой для хранения и управления метаданными, он может стать узким местом для поддержки огромного количества файлов, особенно большого количества небольших файлов. HDFS Federation, новое дополнение, направлено на решение этой проблемы в определенной степени, разрешая несколько пространств имен, обслуживаемых отдельными namenode. Более того, в HDFS есть некоторые проблемы, такие как проблемы с небольшими файлами, проблемы масштабируемости, единая точка отказа (SPoF) и узкие места в больших запросах метаданных. Одним из преимуществ использования HDFS является осведомленность о данных между трекером заданий и трекером задач. Трекер заданий планирует задания map или reduce для трекеров задач с учетом местоположения данных. Например: если узел A содержит данные (a, b, c), а узел X содержит данные (x, y, z), трекер заданий планирует узел A для выполнения задач map или reduce на (a, b, c), а узел X будет запланирован для выполнения задач map или reduce на (x, y, z). Это уменьшает объем трафика, проходящего по сети, и предотвращает ненужную передачу данных. Когда Hadoop используется с другими файловыми системами, это преимущество не всегда доступно. Это может оказать существенное влияние на время выполнения заданий, как показано на примере заданий с интенсивным использованием данных. [43]
HDFS была разработана в основном для неизменяемых файлов и может не подходить для систем, требующих одновременных операций записи. [41]
HDFS можно монтировать напрямую с помощью виртуальной файловой системы Filesystem in Userspace (FUSE) в Linux и некоторых других системах Unix .
Доступ к файлам может быть достигнут через собственный API Java, API Thrift (генерирует клиент на нескольких языках, например, 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 Engine, который состоит из одного 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 или планировщик Capacity , описанные далее). [54]
Справедливый планировщик был разработан Facebook . [55] Цель справедливого планировщика — обеспечить быстрое время отклика для небольших заданий и качество обслуживания (QoS) для производственных заданий. Справедливый планировщик имеет три основных концепции. [56]
По умолчанию задания, не имеющие категории, попадают в пул по умолчанию. Пулы должны указывать минимальное количество слотов карты, слоты сокращения, а также ограничение на количество запущенных заданий.
Планировщик мощностей был разработан Yahoo. Планировщик мощностей поддерживает несколько функций, которые похожи на функции справедливого планировщика. [57]
После выполнения задания приоритет отсутствует .
Наибольшее различие между Hadoop 1 и Hadoop 2 — это добавление YARN (Yet Another Resource Negotiator), который заменил движок MapReduce в первой версии Hadoop. YARN стремится эффективно распределять ресурсы между различными приложениями. Он запускает два демона, которые выполняют две разные задачи: менеджер ресурсов , который отслеживает задания и распределяет ресурсы между приложениями, мастер приложений , который отслеживает ход выполнения.
Hadoop 3 предоставляет важные функции. Например, хотя в Hadoop 2 есть один узел имен , Hadoop 3 позволяет иметь несколько узлов имен, что решает проблему единой точки отказа.
В Hadoop 3 есть контейнеры, работающие по принципу Docker , что сокращает время, затрачиваемое на разработку приложений.
Одним из самых больших изменений является то, что Hadoop 3 снижает накладные расходы на хранение данных с помощью стирающего кодирования .
Кроме того, Hadoop 3 позволяет использовать аппаратное обеспечение GPU в кластере, что является весьма существенным преимуществом для выполнения алгоритмов глубокого обучения в кластере Hadoop. [58]
HDFS не ограничивается заданиями MapReduce. Его можно использовать для других приложений, многие из которых находятся в стадии разработки в Apache. Список включает базу данных HBase , систему машинного обучения Apache Mahout и хранилище данных Apache Hive . Теоретически Hadoop можно использовать для любой рабочей нагрузки, ориентированной на пакетную обработку, а не на обработку в реальном времени, с большим объемом данных и преимуществами параллельной обработки . Его также можно использовать для дополнения системы реального времени, такой как архитектура lambda , 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 год [обновлять]внедрение Hadoop стало широко распространенным: более половины компаний из списка Fortune 50 использовали Hadoop. [66]
Hadoop можно развернуть как в традиционном локальном центре обработки данных, так и в облаке . [67] Облако позволяет организациям разворачивать Hadoop без необходимости приобретения оборудования или специальных навыков настройки. [68]
Ряд компаний предлагают коммерческие реализации или поддержку Hadoop. [69]
Apache Software Foundation заявил, что только программное обеспечение, официально выпущенное Apache Hadoop Project, может называться Apache Hadoop или Дистрибутивами Apache Hadoop . [70] Наименование продуктов и производных работ от других поставщиков, а также термин «совместимый» являются несколько спорными в сообществе разработчиков Hadoop. [71]
Некоторые статьи повлияли на рождение и развитие Hadoop и обработки больших данных. Вот некоторые из них:
Lucene PMC проголосовал за разделение части Nutch на новый подпроект под названием Hadoop
HDFS не является файловой системой в традиционном смысле и обычно не монтируется напрямую для просмотра пользователем.
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite web}}
: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )