- PVSM.RU - https://www.pvsm.ru -

Релиз Apache Ignite 2.4 — Distributed Database and Caching Platform

12 марта 2018 г., спустя 4 месяца после прошлой версии, вышел Apache Ignite 2.4. Этот релиз примечателен целым рядом нововведений: поддержка Java 9, множественные оптимизации и улучшения SQL, поддержка платформой нейронных сетей, новый подход к построению топологии при работе с диском и многое другое.

Apache Ignite Database and Caching Platform [1] — это платформа для распределенного хранения данных (оптимизированная под активное использование RAM), а также для распределенных вычислений в близком к реальному времени.

Ignite применяется там, где нужно очень быстро обрабатывать большие потоки данных, которые не по зубам централизованным системам.

Примеры использования: быстрый распределенный кеш; слой, агрегирующий данные из разрозненных сервисов (например, для Customer 360 View); основное горизонтально масштабируемое хранилище (NoSQL или SQL) оперативных данных; платформа для вычислений и т.д.

Далее рассмотрим основные новшества Ignite 2.4.

Baseline Topology

Если вы использовали Apache Ignite вместе с его собственным дисковым хранилищем, вам, вероятно, приходилось сталкиваться:

  • с необходимостью явно активировать кластер после старта минимального требуемого количества узлов;
  • с агрессивной ребалансировкой при смене топологии, которая может быть очень болезненной из-за активного дискового ввода-вывода.

Baseline Topology [2] решает эти проблемы, фиксируя набор узлов, которые содержат дисковые данные, и оказывают влияние на активацию кластера, поведение при изменении топологии и ребалансировку.

Baseline Topology — это настолько важное изменение в Ignite, что в ближайшее время мы опубликуем отдельную статью, посвященную этой функции.

Тонкие клиенты

Теперь можно создавать тонкие клиенты [3] на базе собственного бинарного протокола [4].

Ранее клиенты для .NET и C++ поднимали внутри себя полноценную JVM с Ignite для коммуникации с кластером. Это обеспечивало легкий и дешевый доступ к обширной функциональности платформы, но клиенты получались тяжеловесными.

Новые тонкие клиенты самостоятельны и не нуждаются в использовании JVM. Это значительно уменьшает потребление ресурсов и повышает производительность, а сообществу теперь намного легче и дешевле строить новые клиенты для самых разных языков, например, Python.

В версии 2.4 появился тонкий клиент для .NET.

var cfg = new IgniteClientConfiguration
{
    Host = "127.0.0.1"
};

using (IIgniteClient igniteClient = Ignition.StartClient(cfg))
{
    ICacheClient<int, Organization> cache = igniteClient.GetCache<int, Organization>(CacheName);

    Organization org = new Organization(
        "GridGain",
        new Address("г. Санкт-Петербург, ул. Марата, д. 69–71, корпус В", 191119),
        new Email("rusales@gridgain.com"),
        OrganizationType.Private,
        DateTime.Now
    );

    // Положить запись в кеш.
    cache.Put(1, org);

    // Получить запись в десериализованном приведенном к нужному типу формате.
    Organization orgFromCache = cache.Get(1);
}

Оптимизация загрузки данных

В Apache Ignite 2.4 добавлены инструменты для оптимизации начальной загрузки и загрузки больших объемов данных.

Теперь можно временно выключать WAL [5] (Write Ahead Log) для отдельных таблиц в Runtime. Это позволит загружать данные с минимальным влиянием дискового ввода-вывода, что положительно скажется на пропускной способности.

После включения WAL будет немедленно сделан checkpoint на диск по текущим данным из RAM, чтобы обеспечить сохранность данных.

Отключить WAL можно посредством SQL:

-- Выключение WAL для таблицы (и нижележащего кеша).
ALTER TABLE my_table NOLOGGING;

-- Включение, аналогично, для отдельных таблицы и кеша.
ALTER TABLE my_table LOGGING;

или посредством API:

ignite.cluster().isWalEnabled(cacheName); // Проверка, включен ли WAL.
ignite.cluster().enableWal(cacheName); // Включение WAL.
ignite.cluster().disableWal(cacheName); // Выключение WAL.

Java 9

В Ignite 2.4 к уже имеющейся поддержке Java 8 добавляется Java 9 [6].

Расширение поддержки .NET

Часто приходилось слышать вопрос: «когда Ignite для .NET начнет поддерживать .NET Core?». Рад сообщить, что, начиная с версии 2.4, Ignite.NET получает поддержку .NET Core [7]. Более того, появляется и поддержка Mono [8].

Благодаря этому можно строить кросс-платформенные приложения на .NET, расширяя сферу применения Ignite мирами Linux и Mac.

В отдельной статье мы подробнее расскажем о нововведениях, касающихся .NET — тонком клиенте и поддержке .NET Core и Mono.

Многочисленные оптимизации и улучшения SQL

В Ignite 2.4 было сделано множество изменений для ускорения работы SQL. Сюда входят: многопоточное создание индексов [9], оптимизации десериализации объектов [10] и поиска по первичному ключу [11], поддержка SQL batching на стороне кластера [12] и многое другое.

На поприще DDL можно задавать DEFAULT-значения для колонок [13] в создаваемых через CREATE TABLE таблицах, указывать настройки встраивания значений в деревья индексов [14] и выполнять DROP COLUMN [15].

Пример создания индекса с новыми атрибутами:

// INLINE_SIZE — максимальный размер в байтах для встраивания в деревья индекса;
// PARALLEL — количество потоков индексации.
CREATE INDEX fast_city_idx ON sales (country, city) INLINE_SIZE 60 PARALLEL 8;

Нейронные сети и другие улучшения Machine Learning

В версии 2.4 появились нейронные сети на Apache Ignite [16].

Их ключевое преимущество — высокая производительность обучения и исполнения моделей. За счет распределенного обучения нейронных сетей и колокации вычислительных компонентов с данными на узлах кластера отпадает необходимость в ETL и долгой передаче данных во внешние системы, забивающей сеть.

// Подготовка тестовых данных.
int samplesCnt = 100000;

// Тестовые данные будут функцией sin^2 на промежутке [0; pi/2].
IgniteSupplier<Double> pointsGen = () -> (Math.random() + 1) / 2 * (Math.PI / 2);
IgniteDoubleFunction<Double> f = x -> Math.sin(x) * Math.sin(x);

IgniteCache<Integer, LabeledVector<Vector, Vector>> cache = LabeledVectorsCache.createNew(ignite);
String cacheName = cache.getName();

// Загрузка данных посредством IgniteDataStreamer.
try (IgniteDataStreamer<Integer, LabeledVector<Vector, Vector>> streamer =
                 ignite.dataStreamer(cacheName)) {
	streamer.perNodeBufferSize(10000);

	for (int i = 0; i < samplesCnt; i++) {
    double x = pointsGen.get();
    double y = f.apply(x);
    streamer.addData(i, new LabeledVector<>(new DenseLocalOnHeapVector(new double[] {x}), new DenseLocalOnHeapVector(new double[] {y})));
	}
}

// Инициализация тренера.
MLPGroupUpdateTrainer<RPropParameterUpdate> trainer = MLPGroupUpdateTrainer.getDefault(ignite).
	withSyncPeriod(3).
  withTolerance(0.0001).
  withMaxGlobalSteps(100).
  withUpdateStrategy(UpdateStrategies.RProp());

// Создание ввода для тренера.
MLPArchitecture conf = new MLPArchitecture(1).
	withAddedLayer(10, true, Activators.SIGMOID).
	withAddedLayer(1, true, Activators.SIGMOID);

MLPGroupUpdateTrainerCacheInput trainerInput = new MLPGroupUpdateTrainerCacheInput(conf,
	new RandomInitializer(new Random()), 6, cache, 1000);

// Тренировка и сверка результатов.
MultilayerPerceptron mlp = trainer.train(trainerInput);

int testCnt = 1000;

Matrix test = new DenseLocalOnHeapMatrix(1, testCnt);

for (int i = 0; i < testCnt; i++)
	test.setColumn(i, new double[] {pointsGen.get()});

Matrix predicted = mlp.apply(test);
Matrix actual = test.copy().map(f);

Vector predicted = mlp.apply(test).getRow(0);
Vector actual = test.copy().map(f).getRow(0);

// Показать предсказанные и фактические значения.
Tracer.showAscii(predicted);
Tracer.showAscii(actual);

System.out.println("MSE: " + (predicted.minus(actual).kNorm(2) / predicted.size()));

Прочее

Помимо перечисленных изменений в релиз также вошли:

Автор: Артем Шитов

Источник [23]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/275428

Ссылки в тексте:

[1] Apache Ignite Database and Caching Platform: https://ignite.apache.org

[2] Baseline Topology: https://issues.apache.org/jira/browse/IGNITE-5850

[3] тонкие клиенты: https://issues.apache.org/jira/browse/IGNITE-5896

[4] бинарного протокола: https://apacheignite.readme.io/docs/binary-client-protocol

[5] временно выключать WAL: https://apacheignite.readme.io/docs/write-ahead-log#section-wal-activation-and-deactivation

[6] Java 9: https://issues.apache.org/jira/browse/IGNITE-6728

[7] .NET Core: https://issues.apache.org/jira/browse/IGNITE-2662

[8] Mono: https://issues.apache.org/jira/browse/IGNITE-1628

[9] многопоточное создание индексов: https://issues.apache.org/jira/browse/IGNITE-6406

[10] оптимизации десериализации объектов: https://issues.apache.org/jira/browse/IGNITE-6626

[11] поиска по первичному ключу: https://issues.apache.org/jira/browse/IGNITE-6663

[12] поддержка SQL batching на стороне кластера: https://issues.apache.org/jira/browse/IGNITE-6022

[13] DEFAULT-значения для колонок: https://issues.apache.org/jira/browse/IGNITE-5623

[14] настройки встраивания значений в деревья индексов: https://issues.apache.org/jira/browse/IGNITE-6850

[15] DROP COLUMN: https://issues.apache.org/jira/browse/IGNITE-5949

[16] нейронные сети на Apache Ignite: https://apacheignite.readme.io/docs/multilayer-perceptron

[17] начальная поддержка Spark DataFrames: https://issues.apache.org/jira/browse/IGNITE-3084

[18] оптимизация потребления памяти при работе с диском;: https://issues.apache.org/jira/browse/IGNITE-6341

[19] занятая кешами память: https://issues.apache.org/jira/browse/IGNITE-6902

[20] расширенная информация по топологии: https://issues.apache.org/jira/browse/IGNITE-6867

[21] RPM-пакеты с Ignite: https://issues.apache.org/jira/browse/IGNITE-7107

[22] репозиторий: https://www.apache.org/dist/ignite/rpm

[23] Источник: https://habrahabr.ru/post/351098/?utm_source=habrahabr&utm_medium=rss&utm_campaign=351098