Анализ больших данных помогает оптимизировать производство, логистику и бизнес-планирование, показывать адресную рекламу, автоматически корректировать цены и предсказывать спрос в ретейле, распознавать мошеннические транзакции и многое другое. Однако особую ценность такой анализ приобретает, когда его результаты применяются «на лету», поэтому сегодня все больше организаций начинают использовать распределенные, массово-параллельные архитектуры, способные работать с большими данными в режиме, близком к реальному времени. Одна из масштабируемых платформ поддержки аналитики реального времени — Apache Ignite, исходный код которой был создан компанией GridGain Systems, а в 2014 году передан в Apache Software Foundation.

Как видно из рисунка, платформа Apache Ignite поддержки вычислений в оперативной памяти (in-memory computing) представляет собой распределенное связующее ПО на базе виртуальных машин Java — слой между приложениями и данными, загружаемыми из дисковых хранилищ в память. Обычно для решения таких разных задач, как обработка транзакций и аналитика, приходится развертывать и поддерживать две разные системы, тогда как в Ignite высокоскоростные транзакции, аналитика и гибридные транзакционно-аналитические вычисления могут выполняться одновременно. Возможна также настройка гибридных вычислений, когда «горячие» данные хранятся в оперативной памяти, а архивные — в дисковых хранилищах.

Apache Ignite — связующее ПО

Apache Ignite может работать локально, в облаке или в гибридной среде. Единый API позволяет интегрировать облачные приложения и хранилища со структурированными, квазиструктурированными и неструктурированными данными — все это возможно благодаря поддержке SQL, .Net, C++, Java, Groovy, Scala, PHP и Node.js. Платформа имеет интерфейсы с СУБД MySQL, Oracle, DB2, PostgreSQL, MS SQL Server и другими реляционными базами, генерируя модель домена приложения, основанную на определении схемы базы данных с последующей загрузкой данных. Кроме поддержки интерфейса ANSI SQL-99, Ignite работает с хранилищами «ключ-значение» и MapReduce, обеспечивая поддержку потоковой и массово-параллельной обработки данных, вилочного параллелизма (чередование последовательно и параллельно исполняемых участков кода) и обработку сложных событий, кластеризацию и ускорение Hadoop. Таким образом, не требуется замена существующих баз данных — данные можно переносить в оперативную память из различных источников, что важно для компаний, работающих с большими массивами данных, но неготовых к радикальной перестройке своей ИТ-инфраструктуры.

В основе архитектуры платформы лежит гомогенная кластерная топология: все узлы в кластере равны и могут выполнять любую логическую роль в зависимости от требований приложения. Кластер можно развернуть на серверах стандартной архитектуры, и по мере увеличения нагрузки его можно масштабировать, добавляя новые узлы.

Ключевую роль в Apache Ignite играет структура интерфейса провайдера сервисов (service provider interface, SPI), позволяющая подключать и настраивать внутренние компоненты Ignite для адаптации к конкретной серверной инфраструктуре. В Ignite имеется 15 различных подсистем, каждую из которых можно заменить, а SPI позволяет осуществить эту замену — можно взять один компонент, настроить его под свои задачи, а все остальные подсистемы автоматически продолжат работу с ним. Например, по умолчанию Apache Ignite использует стандартное сетевое взаимодействие по TCP/IP, но если требуется добавить дополнительное шифрование, то можно переписать один компонент (network SPI) и вставить его в Ignite.

Apache Ignite включает в себя систему In-memory data grid (IMDG), отвечающую за управление распределенными данными в памяти, в том числе за cоблюдение требований ACID, поддержку SQL, аварийное переключение и выравнивание нагрузки. По сути, IMDG в Apache Ignite — это распределенное в оперативной памяти объектно-ориентированное хранилище типа «ключ-значение» с поддержкой ACID-транзакций.

Вычисления и обеспечение надежности в Ignite также построены по принципам гридов. Система In-memory compute grid позволяет параллельно выполнять в памяти задачи, критичные к конкретным ресурсам (процессор, память, ввод-вывод), поддерживая также стандартные асинхронные вычисления Java ExecutorService. Контроль над сервисами, развернутыми на кластере с гарантией их постоянной доступности в случае отказа узла, обеспечивает сервисная грид-система (In-memory service grid), поддерживающая автоматическое развертывание одного или множества экземпляров сервиса.

Для приложений, требующих интерактивной работы с большими объемами данных (Facebook, Telegram, WhatsApp, мобильные корпоративные приложения), традиционные методы вычислений и хранение на дисках не подходят — они работают недопустимо медленно. Если бы в Facebook фотографии хранились в дисковых хранилищах, то каждая из них загружалась бы десятки минут, поэтому во всех подобных приложениях применяются потоковые вычисления в памяти (In-memory streaming). Такие вычисления позволяют выполнять аналитические запросы над конкретными «окнами» входящих данных, например: какие пять продуктовых позиций были наиболее востребованы в торговом зале за последние два часа или какова средняя цена товаров определенной категории за последние три дня? Другой вариант применения потоковых вычислений — конвейерная обработка распределенных событий, сведения о которых поступают в систему с большой скоростью. Обычно при этом производится разбиение потока на несколько частей, каждая из которых направляется для обработки на свой узел кластера.

Apache Ignite включает собственную распределенную библиотеку для машинного обучения — ML Grid, позволяющую проводить обучение пользовательской модели на данных, предоставляемых IMDG. В библиотеке имеются алгоритмы распределенной обработки данных для анализа данных, поступающих в реальном времени. В версии Ignite 2.0 будут добавлены предметно-ориентированные языки для работы с Python, R и Scala, коллекция алгоритмов машинного обучения (Linear and Logistic Regression, Decision Tree/Random Forest, SVM, Naive Bayes) и интеграция с TensorFlow.

Многие компании используют сегодня Apache Hadoop для хранения и обработки больших массивов разнообразных данных, однако Hadoop работает слишком медленно, тогда как Apache Ignite позволяет ускорить обработку, причем в уже существующих средах. Такое ускорение стало возможным благодаря специальной двухрежимной распределенной файловой системе в оперативной памяти Ignite File System (IGFS), полностью совместимой с HDFS и MapReduce. Функционал IGFS аналогичен HDFS и позволяет создавать полнофункциональную файловую систему, но работающую в оперативной памяти, а также делегировать выполнение другим файловым системам. Данные из каждого файла разбиваются на отдельные блоки и хранятся в кэше, доступ к которому осуществляется через стандартный Java Streaming API.

Для кластеризации в Apache Ignite используется технология Java Virtual Machine: узлы автоматически находят друг друга, что позволяет масштабировать кластер без перезагрузки. Обмен данными внутри кластера осуществляется по модели «издатель-подписчик» или напрямую — по модели «точка-точка». Ignite поддерживает несколько протоколов для связи клиентских узлов с кластерами Ignite: Ignite Native Clients, SSL/TLS, REST/HTTP и Memcached.SQL.

Для управления событиями в распределенной среде в Ignite разработчики могут получать уведомления о завершении выполнения удаленных задач или о любых других изменениях в кэшированных данных внутри кластера. Для повышения производительности кэша и уменьшения задержки возможна групповая периодическая отсылка уведомлений. Ignite позволяет в распределенном режиме использовать большинство структур данных из пакета многопоточности java.util.concurrent. Например, можно добавить элемент в очередь с двусторонним доступом (java.util.concurrent.BlockingDeque) на одном узле и извлечь его с другого узла.

Платформа Apache Ignite интегрирована с Apache Spark — универсальным движком для крупномасштабной обработки данных. Ранее обе системы дополняли друг друга, однако последние версии Ignite обеспечивают необходимую производительность и без Spark. При этом если Spark загружает данные для обработки из внешнего (обычно дискового) хранилища и не хранит их после завершения обработки, то Ignite предоставляет распределенное in-memory-хранилище типа «ключ-значение» с поддержкой ACID-транзакций и SQL-запросов. Данные сохраняются в памяти и могут быть записаны в нижележащую базу данных. В случае Spark приложению не предоставляется общая память — данные из HDFS или другого дискового хранилища необходимо сначала загрузить, причем состояние данных можно передавать между различными задачами Spark только путем сохранения обработанных данных во внешнем хранилище, а Ignite может передавать состояние напрямую в памяти.

Spark работает с нетранзакционными данными, доступными только для чтения, поэтому эта система используется для оперативной аналитической обработки (OLAP), причем не поддерживается изменение на месте устойчивых распределенных наборов данных (Resilient Distributed Dataset, RDD), тогда как в Ignite обеспечивается поддержка как OLAP, так и ACID-совместимых транзакций OLTP.

Apache Spark оперирует RDD и имеет дело только с нагрузкой, связанной с обработкой данных, а Ignite, кроме этого, поддерживает и чисто вычислительные нагрузки. Выполнение SQL-запросов в Spark даже на небольших массивах данных может требовать много времени: Spark поддерживает богатый синтаксис SQL, но без индексации, поэтому требуется постоянно выполнять полное сканирование. Ignite поддерживает SQL-индексы, и запросы выполняются гораздо быстрее.

Apache Ignite поддерживает интеграцию с Apache Cassandra — решением для структурированных запросов, которое может быть полезно для OLAP-приложений, но в нем нет поддержки ACID, поэтому для OLTP оно не используется. Кроме того, Cassandra не поддерживает SQL-операции объединения, агрегации, группировки или использование индексов, что исключает выполнение произвольных, нерегламентированных запросов. Обе системы дополняют друг друга — пользователи Cassandra с помощью Ignite получают более широкие возможности при работе в памяти: уменьшение на несколько порядков времени выполнения запросов, использование ANSI SQL для выполнения нерегламентированных и структурированных запросов данных в памяти.

***

Сегодня пока еще нет технологий, способных обеспечить более высокую скорость и масштабируемость, чем обработка и хранение в памяти [1]. Платформа Ignite позволяет решать такие задачи, не требуя замены уже имеющихся в компаниях СУБД, — в сочетании с традиционными или распределенными хранилищами Ignite предоставляет средства аналитики реального времени, обработки транзакций, а также инструменты для выполнения задач гибридной транзакционно-аналитической обработки (HTAP).

Литература

  1. Наталья Дубова. Все дело в памяти // Открытые системы.СУБД. — 2017. — № 1. — С. 40–42. URL: https://www.osp.ru/os/2017/01/ 13051365/ (дата обращения: 21.05.2018).

Никита Иванов (nivanov@gridgain.com) — основатель и технический директор, компания GridGain.