С чего все началось: Google нужно было индексировать данные для поиска по веб-страницам.
Что такое большие данные?
Таким образом, для обработки больших данных необходимо распараллелить обработку данных на множестве компьютеров объединенных в кластер.
Более формально характеристики больших данных описывают моделью 5V:
Конечный результат обработки практически не зависит от одного конкретного элемента данных.
По способу обработки данные принято делить на:
Также стоит различать два класса систем по характеру нагрузки:
Дополнительную сложность при работе большими данными представляет их хранение данных перед обработкой. Для этого можно использовать:
Компромисс между согласованностью, доступностью и устойчивостью к разделению сети распределенных систем описывается теоремой CAP: при возникновении сетевого разделения (partition) система вынуждена выбирать между согласованностью (Consistency) и доступностью (Availability). Именно поэтому многие нереляционные СУБД придерживаются принципов BASE (Basically Available, Soft state, Eventual consistency) вместо строгих ACID-гарантий.
Hadoop — первая платформа для работы с большими данными.
Кластеры Hadoop строятся на недорогом аппаратном обеспечении (Commodity Hardware). Кластер Hadoop готов к выходу из строя небольшого количества вычислительных узлов.
Hadoop не создавался в Google — компания лишь опубликовала научные статьи, вдохновившие его разработку: в 2003 году вышла статья об архитектуре распределенной файловой системы Google (GFS), в 2004 году — статья о модели вычислений MapReduce. Опираясь на эти идеи, Даг Каттинг (Doug Cutting) и Майк Кафарелла (Mike Cafarella) реализовали аналогичную функциональность в рамках открытого проекта поискового робота Nutch, а в феврале 2006 года выделили ее в отдельный подпроект под названием Hadoop (назван в честь игрушечного слона сына Каттинга). Развитием проекта занялась компания Yahoo, куда в 2006 году перешел работать Каттинг. В январе 2008 года Hadoop получил статус самостоятельного top-level проекта фонда Apache.
Для обработки данных в Hadoop применяется MapReduce — модель распределенных вычислений при которой:
При этом, разбиение исходных данных на порции для элементарных заданий, а также группировку сходных данных перед их сведения берет на себя платформа MapReduce.
Программисту остается написать на языке Java функции типа Map и Reduce и скомпилировать их в готовые к запуску модули в формате Jar.
Для запуска обработки данных пользователь должен создать задание в котором указывается исполняемый модуль в формате Jar и входные данные.
YARN (Yet Another Resource Negotiator) — компонент Hadoop, который управляет очередностью запуска заданий и распределением заданий узлам кластера.
Для хранения данных Hadoop использует файловую систему HDFS — Hadoop Distributed File System.
HDFS хорошо приспособлена для хранения больших файлов. Каждый файл разбивается на блоки одинакового размера (кроме последнего). Каждый блок может быть скопирован на несколько узлов кластера. Размер блока и коэффициент репликации (количество узлов, на которые должен быть скопирован каждый блок) определяются в настройках HDFS. По умолчанию используются блоки размером в 128 Мб и коэффициент избыточности равный трем.
Благодаря репликации обеспечивается устойчивость распределенной системы к отказам отдельных узлов. Файлы в HDFS могут быть записаны лишь однажды (модификация не поддерживается). Запись в файл в одно время может вести только один процесс.
Организация файлов в пространстве имён — традиционная иерархическая: есть корневой каталог, поддерживается вложение каталогов, в одном каталоге могут располагаться и файлы, и другие каталоги.
HDFS предусматривает наличие центрального узла имён (name node), хранящего метаданные файловой системы и метаинформацию о распределении блоков. Узлы кластера которые непосредственно хранят блоки файлов называются узлами данных (data node).
Узел имён отвечает за обработку операций уровня файлов и каталогов — открытие и закрытие файлов, манипуляция с каталогами. Узлы данных непосредственно отрабатывают операции по записи и чтению данных.
Узел имён и узлы данных снабжаются веб-серверами, отображающими текущий статус узлов и позволяющими просматривать содержимое файловой системы. Административные функции доступны из интерфейса командной строки.
Несмотря на то что HDFS изначально являлся неотъемлемой частью проекта, сегодня Hadoop поддерживает работу и с другими распределёнными файловыми системами. Например, в основном дистрибутиве реализована поддержка Amazon S3 и CloudStore.
В облачных развертываниях HDFS все чаще заменяется (или дополняется) объектными хранилищами — Amazon S3, Google Cloud Storage, Azure Blob Storage. В отличие от HDFS, объектное хранилище не требует поддержки собственного постоянно работающего кластера, разделяет вычисления и хранение (compute/storage separation) и оплачивается по факту использования. Это делает его типовым слоем хранения современного data lake, поверх которого запускаются Spark, Hive или BigQuery.
С другой стороны, HDFS может использоваться не только для запуска MapReduce-заданий, но и как распределённая файловая система общего назначения. В частности, поверх неё реализована распределённая NoSQL-СУБД HBase (подробнее — в разделе про экосистему Hadoop ниже).
В процессе развития платформы Hadoop было создано большое количество высокоуровневых средств образующих своего рода экосистему:
Принципиально новым этапом в развитии Hadoop стал Apache Spark — платформа вычислений, которая ускоряет вычисления MapReduce благодаря тому, что хранит данные промежуточных результатов вычислений в ОЗУ узлов, а не в HDFS.
Платформа Spark также может работать в контейнерах под управлением Kubernetes и на кластерах Apache Mesos. Кроме того, Spark может управлять кластером самостоятельно.
На базе Spark работают несколько высокоуровневых программных средств:
Программирование на Spark осуществляется на:
По мере роста экосистемы сложились типовые архитектурные подходы к построению систем обработки больших данных:
Также различают модели хранения данных:
Современные тренды:
Облачные решения:
Компоненты:
Часть программных компонентов имеет открытый исходный код.
На базе ElasticStack создано большое количество производных продуктов.
В настоящий момент активно развиваются облачные сервисы на базе продуктов ElasticStack.