Модель MapReduce открыла немыслимую прежде возможность надежной обработки больших массивов данных на кластерах, собранных из доступных серверов. Впрочем, при всей сенсационной новизне не стоит упускать из виду то обстоятельство, что методы ускорения, использующие распараллеливание вычислений в многопроцессорной среде и базирующиеся на разделении процесса счета с последующей сборкой результатов, далеко не новы. Еще полвека назад, в 1963 году, Мелвин Конвей предложил модель Fork/Join, которая, в отличие от MapReduce, лучше приспособлена не к кластерам, а к многоядерным процессорам. Об этой работе, как и о работе Дага Ли, вспоминали редко, тем не менее к ним пришлось вернуться, причем в тот момент, когда у компании Google возникла необходимость обрабатывать большие массивы на кластерах, собранных из собственных серверов. Эта компания умеет скрывать свои секреты, и широкая общественность узнала о существовании MapReduce лишь из вышедшей в 2004 году статьи Джефри Дина и Санжая Чемавата «MapReduce: упрощенная обработка данных на больших кластерах» (MapReduce: Simplified Data Processing on Large Clusters). Позже появилось описание файловой системы Google File System (GFS), а год спустя Даг Каттинг и Майкл Кафарелла по образу и подобию этой модели и файловой системы создали свою открытую версию, назвав ее Hadoop.
Сегодня система Apache Hadoop ушла далеко вперед от первого варианта, теперь она состоит из библиотек и утилит, распределенной файловой системы Hadoop Distributed File System (HDFS), платформы для управления ресурсами Hadoop YARN, масштабируемой программной модели Hadoop MapReduce и еще множества компонентов. В 2014 году начался переход на версию Hadoop 2.0, имеющую целый ряд отличий, среди которых две новые, более современные модели параллельных вычислений Apache Tez и Apache Spark.
Создание Apache Tez и Apache Spark было вызвано требованиями поддержки получающих широкое распространение аналитических приложений (машинное обучение, обработка текстов на естественных языках, распознавание речи, методы извлечения информации из данных). Итерационная природа подобных приложений противоречит организации потока работ в пакете — реализация итераций средствами традиционного Hadoop MapReduce оказывается чрезвычайно длительной. Сам переход с MapReduce на Apache Tez и Apache Spark напоминает случившийся в семидесятые годы переход от пакетного режима взаимодействия с компьютером к интерактивному. Применительно к Apache Tez и Apache Spark используют понятие «реальное время», однако речь не идет о строгом инженерном понимании реального времени — мера латентности в данном случае определяется готовностью человека к ожиданию результатов. И на этот раз, как раньше, история началась с публикации в 2010 году группой сотрудников Google статьи о системе Dremel (Dremel: Interactive Analysis of WebScale Datasets). Dremel представляет собой интерактивную систему, специально созданную для обработки запросов, адресованных к сгруппированным (nested) данным, доступным только для чтения. Комбинация многоуровневых исполнительных деревьев (multi-level execution trees) с поколоночным размещением данных позволяет обрабатывать миллиарды табличных строк в секунду. Система масштабируется на тысячи центральных процессоров, петабайты данных и тысячи пользователей. Сообщество программирующих в открытых кодах ответило своей версией, названной OpenDremel, вошедшей в проект Apache Drill, превосходящий Dremel по функциональности.
Причина ограниченности MapReduce при работе с аналитическими приложениями, в машинном обучении и т. п. кроется в использовании ациклической модели потоков данных (Directed Acyclic Graph, DAG), не предполагающей какой-либо возможности вложения циклов на всем протяжении процесса от Map до Reduce, что противоречит сути подобных приложений. Сейчас, чтобы приспособить модель MapReduce для целей анализа, приходится многократно повторять основной цикл, а это приводит к заметному снижению производительности. Apache Tez и Apache Spark позволяют в десятки раз повысить скорость обработки: в первой это происходит за счет усовершенствования процедуры выполнения графовой модели, а во второй — благодаря переходу на принципиально иную алгоритмическую основу.
Tez переводится с хинди как «скорость»; система является типичным образцом продукта, созданного в Индии, — в нем реализовано более эффективное, чем MapReduce, решение, но это не революция. Spark же (от английского «искра») родом из Калифорнийского университета Беркли, в нем использована качественно новая математика, и не исключено, что Spark — это именно та искра, из которой может разгореться пламя нового поколения решений по распределенной обработке данных, и далеко не случайно, что после выхода Spark из тени к этому решению сразу было привлечено большое внимание.
Apache Tez выполняет DAG как набор задач, интерпретируя обработку данных как граф потоков, где вершины — процессы, а ребра — перемещения данных между процессами. В вершинах размещается аналитическая логика, а ребра отражают процесс передачи данных и связи между их источниками и потребителями. В Tez единый этап Reduce разделяется на отдельные, связанные между собой стадии Reduce. Такое деление стало возможным с появлением конструкции YARN (рис.1), поддерживающей связь с файловой системой HDFS2 и кластером.
Рис. 1. Apache Tez в среде Hadoop 2 |
Более высокая производительность алгоритмов Tez по сравнению с Hadoop MapReduce обеспечивается двумя факторами. Во-первых, динамическим распознаванием графа, отражающим тот факт, что обычно распределенные данные оказываются динамичными по своей природе и многое из того, что с ними нужно делать, определяется уже в процессе исполнения. Динамика находится в противоречии с пакетным режимом, где все следует определить заранее, а Tez включает в себя модули модификации вершин графа, позволяющие найти лучшее решение. Во-вторых, Tez использует оптимальное управление ресурсами. Эта функция реализуется им совместно с YARN, где есть элемент динамики — потребность в ресурсах меняется, и на разных фазах решения задачи они могут быть разными. Система Tez не предназначена для конечных пользователей и ориентирована на разработчиков приложений, поддерживая хранилище данных Apache Hive и аналитическую платформу с языком высокого уровня Apache Pig.
Одна из самых серьезных проблем Больших Данных состоит в том, что к этой еще только формирующейся парадигме многие подходят со старыми мерками без понимания целостности картины. Среди немногочисленных мест, где предпринимаются попытки разобраться с неизбежным в таких случаях клубком противоречий, есть небольшая исследовательская лаборатория AMPLab (Algorithms, Machines, People), в ней с 2008 года ведется комплекс исследований, приведший к проекту Apache Spark, который представляет собой работающую в памяти программную конструкцию, способную составить конкуренцию программной модели MapReduce. Автором данной новации стал аспирант Беркли Матей Захариа, выходец из Румынии, тема диссертации которого — «Архитектура для быстрой и универсальной обработки данных на больших кластерах» (An Architecture for Fast and General Data Processing on Large Clusters). Одним из двух руководителей Захариа является Скотт Шенкер — он известен своими работами в области программно-конфигурируемых сетей (SDN) и входил в число создателей компании Nicira, купленной VMware в 2012 году.
Spark можно рассматривать как дальнейшее развитие идеи DAG с возможностью циклической обработки потоков данных, размещенных в памяти. Отход от пакетного режима поддержан новым, не имеющим аналогов способом представления данных, получившим название Resilient Distributed Dataset (RDD). Организация данных в виде RDD позволяет распределять и перераспределять данные на различных стадиях параллельных вычислений, открывая путь к итерационным процессам, невозможным в случае DAG. Вот почему RDD оказывается эффективным с точки зрения как скорости обработки, так и обеспечения высокой надежности, требуемой при распределенной работе на кластерах.
Работа Spark (рис. 2) поддерживается платформой Mesos, управляющей кластерами, а реализация функционала RDD воплощена в управляющей машине Spark RDD, поверх которых выполняется потоковая обработка, машина для обработки графов Bagel, Shark (аналог Hive SQL, но работающий на два порядка быстрее), а также аналитические приложения, системы машинного обучения и др. В отличие от Tez, решение Spark рассчитано не только на профессиональных разработчиков — оно может стать инструментом для специалистов по данным (data scientist), которым предоставляется современный язык Scala, иногда называемый преемником Java. Возможно также использование Python с интерпретатором IPython.
Рис. 2. Среда Spark |
***
На данный момент имеется не так много аналитических систем, работающих на Tez и Spark, но даже уже известные результаты позволяют отнести эти модели, и особенно последнюю, к числу суперзвезд Open Source, способных определить будущее индустрии Больших Данных.
Леонид Черняк (osmag@osp.ru) — научный редактор, «Открытые системы. СУБД» (Москва).