Riak TS

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 14:53, 30 января 2019.
Riak TS
Riak TS.png
Разработчики: basho.com
Постоянный выпуск: 1.5.2
Состояние разработки: Активное
Операционная система:

Кросс-платформенное:

  • CentOS 6, 7
  • RHEL 6, 7
  • Ubuntu 14.04 (Trusty), 16.04 (Xenial)
  • Debian 7 «Wheezy» (только разработка), 8 "Jessie"
  • OS X 10.11+ (только разработка)
  • Amazon Linux 2016.09
  • LevelDB – единственный поддерживаемый сервер.
Тип ПО: NoSQL хранилище типа ключ-значение
Лицензия: Apache 2 / Коммерческая
Веб-сайт basho.com/products/riak-ts/

Riak TS (Time Series) – это распределенное NoSQL хранилище типа ключ-значение, оптимизированное для хранения временных рядов[Источник 1].

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

Обзор

Основные особенности

Данные временного ряда – это любые данные, которые имеют временную метку[Источник 2]. Это могут быть данные устройства IoT(Интернет вещей), финансовые и экономические данные или даже научные данные и данные здравоохранения. Для обеспечения оптимальной производительности полезно, чтобы база данных имела некоторые знания о структуре и формате данных временных рядов.

  • Данные временных рядов часто предъявляют более высокие требования к нагрузке записи, чем сценарии использования значения ключа, и поэтому требуют высокопроизводительного чтения и записи даже с огромным количеством источников данных.
  • Для более эффективного анализа данных времени или местоположения соответствующие данные временных рядов должны быть размещены в одном и том же физическом хранилище на одном и том же узле.
  • Модель данных временных рядов требует гибкости для поддержки как структурированных, так и полуструктурированных данных, а также способности писать запросы диапазона для анализа данных временных рядов.
  • Данные временного ряда часто собираются с частыми интервалами, которые могут не соответствовать возрасту данных. Данные часто свертываются, сжимаются, а срок детализации истекает.

Преимущества

В Riak TS производительность чтения и записи оптимизирована специально для данных временных рядов. Он группирует и хранит данные вместе и автоматически распределяет копии данных по кластеру, чтобы можно было легко анализировать временные или геолокационные данные. Эта архитектура горизонтального масштабирования позволяет беспрепятственно увеличивать емкость с помощью стандартного оборудования для почти линейного улучшения производительности и ускорения запросов.

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

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

Оптимизированные запросы в Riak TS упрощают использование, так что вы можете писать запросы, аналогичные SQL, но для анализа данных временных рядов.

Riak TS позволяет использовать составные ключи (время, геохэш и семейство данных), чтобы определить порядок сортировки на диске для повышения скорости чтения.

Riak TS легко интегрируется с Apache Spark для обеспечения более простого и быстрого анализа данных временных рядов.

Использование Riak TS

Интернет вещей

Подключение интеллектуальных устройств в домах для обеспечения лучшего обслуживания и экономии средств помогает стимулировать рост Интернета вещей (IoT). Примеры включают в себя: Утилиты, которые имеют счетчики, создающие миллиарды точек данных в год, и такие компании, как The Weather Company, управляют 20 терабайтами новых данных в день.

Riak TS - это хранилище ключей / значений, которое поддерживает быстрое получение данных временных рядов с подключенных устройств. Он обеспечивает чрезвычайно быстрое чтение и запись в масштабируемой архитектуре. Riak TS позволяет прикладной обработке этих данных генерировать действенную информацию. Riak TS разработан для горизонтального масштабирования с использованием стандартного оборудования, что позволяет администраторам легко наращивать емкость без сложного разделения.

Финансовые данные

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

Riak TS обладает уникальной архитектурой для обработки огромного количества данных временных рядов, включая финансовые и экономические данные. Он позволяет хранить, запрашивать и анализировать связанные данные для оптимизации производительности операций чтения и записи.

Научные данные

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

Для выполнения такого типа анализа вы должны иметь возможность выполнять запросы данных временных рядов в масштабе, а также проверять ваши данные во время их сбора, чтобы помочь с целостностью данных и соответствием. Вам также нужен сильный и знакомый язык запросов, чтобы быстро анализировать ваши данные, не прибегая к сложным приемам ETL, чтобы выполнить «готовый» анализ с помощью пользовательских инструментов.

Riak TS предоставляет все эти критически важные функции.

Принцип работы

Базовая структура таблицы

Чтобы запросить данные временных рядов(далее TS), данные структурированы по конкретной схеме. В частности, каждая строка данных в таблице TS состоит из набора столбцов. Определение этих столбцов происходит, когда создается таблица, и оно устанавливает тип данных, которые могут быть сохранены в таблице. Затем к этой схеме могут быть написаны запросы, и система запросов TS сможет проверять и выполнять их.

Схема таблицы TS состоит из определений столбцов и первичного ключа. Определения столбцов устанавливают структуру и тип данных в таблице. Первичный ключ содержит два ключа, которые определяют, как хранятся данные, и как они запрашиваются.

Riak TS имеет два типа ключей:

  • ключи разделов, которые определяют, как данные помещаются в кластер,
  • локальные ключи, определяющие, как данные записываются в раздел.

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

Локальные ключи группируют аналогичные данные вместе в разделе, что влияет на производительность.

Определение различных ключей и схемы данных объединены в один SQL-подобный оператор. Язык запросов - это подмножество SQL, поэтому можно использовать имена столбцов и имя таблицы в этих запросах.

SQL

CREATE TABLE GeoCheckin
(
   id          SINT64    NOT NULL,                   -
   region      VARCHAR   NOT NULL,                    |
   state       VARCHAR   NOT NULL,                    |
   time        TIMESTAMP NOT NULL,                    |  --> Column Definitions
   weather     VARCHAR   NOT NULL,                    |
   temperature DOUBLE,                               _
   PRIMARY KEY (
     (id, QUANTUM(time, 15, 'm')),        <-- Partition Key
     id, time                             <-- Local Key
   )
)

Начало работы

Создание таблицы Riak TS

Таблицу можно создать несколькими способами[Источник 3]:

  • Выполнение оператора CREATE TABLE с использованием любого клиента Riak TS,
  • Использование riak-shell,
  • Запуск команды riak-admin (под root-правами, используя su или sudo).

Для примера будет использоваться данная таблица:

SQL

CREATE TABLE GeoCheckin
(
   id           SINT64    NOT NULL,
   region       VARCHAR   NOT NULL,
   state        VARCHAR   NOT NULL,
   time         TIMESTAMP NOT NULL,
   weather      VARCHAR NOT NULL,
   temperature  DOUBLE,
   PRIMARY KEY (
     (id, QUANTUM(time, 15, 'm')),
      id, time
   )
);

Создание таблицы в клиентской библиотеке

Используя одну из клиентских библиотек Riak TS, выполните оператор CREATE TABLE с помощью запросов этой библиотеки. Это создаст и активирует таблицу за один шаг.

C#

string tableName = "GeoCheckin";
string sqlFmt = string.Format(
    @"CREATE TABLE {0} (region varchar not null,
                        state varchar not null,
                        time timestamp not null,
                        weather varchar not null,
                        temperature double,
    PRIMARY KEY((region, state, quantum(time, 15, m)), region, state, time))", tableName);

var cmd = new Query.Builder()
    .WithTable(tableName)
    .WithQuery(sqlFmt)
    .Build();

RiakResult rslt = client.Execute(cmd);

ERLANG

Sql = <<"CREATE TABLE GeoCheckin...">>,
Result = riakc_ts:query(Pid, Sql).

GO

const tsTableDefinition = `
	CREATE TABLE %s (
		region varchar not null,
		state varchar not null,
		time timestamp not null,
		weather varchar not null,
		temperature double,
		uv_index sint64,
		observed boolean not null,
		PRIMARY KEY((region, state, quantum(time, 15, 'm')), region, state, time)
	)`

HTTP

$ curl -XPOST http://127.0.0.1:8098/ts/v1/query --data "CREATE TABLE GeoCheckin (state VARCHAR NOT NULL, city VARCHAR NOT NULL, time TIMESTAMP NOT NULL, weather VARCHAR NOT NULL, temperature DOUBLE, PRIMARY KEY ((state, city, QUANTUM(time, 15, 'm')), state, city, time))"

{"success":true}

Java

RiakClient client = RiakClient.newClient(10017, "myriakdb.host");

String queryText = "select weather, temperature from GeoCheckin " +
                   "where time > 1234560 and time < 1234569 and " +
                   "region = 'South Atlantic' and state = 'South Carolina'";

Query query = new Query.Builder(queryText).build();

// With the synchronous execute, any errors encountered will be thrown.
QueryResult queryResult = client.execute(query);

// With the executeAsync method, any errors will be stored for review.
final RiakFuture<QueryResult, String> queryFuture = client.executeAsync(storeCmd);
bool success = queryFuture.isSuccess();
QueryResult result = queryFuture.get();
Throwable error = queryFuture.cause();

Node.js

var Riak = require('basho-riak-client');

//may pass client an array of host:port's
//['192.168.1.1:8087','192.168.1.2:8087']
var client = new Riak.Client(['127.0.0.1:8087']);

var key = [ 'South Carolina', 'South Carolina', now ];

var cb = function (err, rslt) {
    // NB: rslt will be an object with two properties:
    // 'columns' - table columns
    // 'rows' - row matching the Get request
};

var cmd = new Riak.Commands.TS.Get.Builder()
    .withTable('GeoCheckin')
    .withKey(key)
    .withCallback(cb)
    .build();

client.execute(cmd);

PHP

require __DIR__ . '/../vendor/autoload.php';

use Basho\Riak;
use Basho\Riak\Command;
use Basho\Riak\Node;

$node = (new Node\Builder)
    ->atHost('riak-test')
    ->onPort(8087)
    ->build();

$riak = new Riak([$node], [], new Riak\Api\Pb());


# create table
$table_definition = "
    CREATE TABLE %s (
        region varchar not null,
        state varchar not null,
        time timestamp not null,
        weather varchar not null,
        temperature double,
        PRIMARY KEY((region, state, quantum(time, 15, 'm')), region, state, time)
    )";

$command = (new Command\Builder\TimeSeries\Query($riak))
    ->withQuery(sprintf($table_definition, "GeoCheckins"))
    ->build();

if (!$response->isSuccess()) {
    echo $response->getMessage();
    exit;
}

Python

def test_query_that_creates_table_using_interpolation(self):
        table = self.randname()
        query = """CREATE TABLE test-{table} (
            geohash varchar not null,
            user varchar not null,
            time timestamp not null,
            weather varchar not null,
            temperature double,
            PRIMARY KEY((geohash, user, quantum(time, 15, m)),
                geohash, user, time))

RUBY

  let(:create_table) do
    <<-SQL
CREATE TABLE timeseries-#{random_key} (
    geohash varchar not null,
    user varchar not null,
    time timestamp not null,
    weather varchar not null,
    temperature double,
    PRIMARY KEY(
        (geohash, user, quantum(time, 15, m)),
        geohash, user, time
    )
)
SQL
  end

Результат операции зависит от библиотеки:

  • Java: объект QueryResult будет возвращен без каких-либо данных для строк или столбцов,
  • Ruby: не бросается исключение и созданная коллекция пуста,
  • Python: не бросается исключение; в полученном объекте присутствуют пустые поля rows и columns,
  • C#: не бросается исключение; в полученном объекте присутствуют пустые поля Value и Columns,
  • Node.js: не бросается исключение; в полученном объекте присутствуют пустые поля rows и columns,
  • Erlang: возвращаемый элемент будет состоять из двух пустых списков {[],[]},
  • PHP: полученный объект имеет метод isSuccess().

Создание таблицы в riak-shell

Для создания таблицы можно использовать riak-shell путем запуска:

riak-shell>CREATE TABLE GeoCheckin (id SINT64 NOT NULL, region VARCHAR NOT NULL, state VARCHAR NOT NULL, time  TIMESTAMP NOT NULL, weather  VARCHAR NOT NULL, temperature DOUBLE, PRIMARY KEY ((id, QUANTUM(time, 15, 'm')), id, time)); 

Важно не забывать о следующем:

  • Синтаксис чувствителен к пробелам и кавычкам.
  • Названия таблиц и столбцов в настоящее время ограничены ASCII.

Создание таблицы в riak-admin

Чтобы создать таблицу, сначала нужно выполнить команду:

(Примечание: пользователи Mac OS X могут пропустить этот шаг) Shell

sudo su riak

Затем выполнить:

Shell

riak-admin bucket-type create GeoCheckin '{"props":{"table_def": "CREATE TABLE GeoCheckin (id SINT64 NOT NULL, region VARCHAR NOT NULL, state VARCHAR NOT NULL, time TIMESTAMP NOT NULL, weather VARCHAR NOT NULL, temperature DOUBLE, PRIMARY KEY ((id, QUANTUM(time, 15, 'm')), id, time))"}}'

Важно не забывать о следующем:

  • Имя bucket-type должно совпадать с именем таблицы,
  • Синтаксис очень чувствителен к пробелам и кавычкам,
  • Легко создать очень длинное имя типа bucket без соответствующей таблицы TS, если не поставить пробел между именем типа bucket и открывающей кавычкой свойств JSON,
  • Названия таблиц и столбцов в настоящее время ограничены ASCII.
Активация таблицы

Таблица активируется следующим образом:

Shell

 riak-admin bucket-type activate »TABLE NAME« 

Для таблицы GeoCheckin:

Shell

 riak-admin bucket-type activate GeoCheckin 

Источники

  1. Документация Riak TS // Официальный сайт документации Basho. [2011-2017]. Дата обновления: 21.02.2017. URL: http://docs.basho.com/riak/ts/1.5.2/ (дата обращения: 29.01.2019).
  2. Страница продукта Riak TS // Официальный сайт Basho. [2019]. URL: http://basho.com/products/riak-ts/#use-cases (дата обращения: 29.01.2019).
  3. Creating Your Riak TS Table // Официальный сайт документации Basho. [2011-2017]. Дата обновления: 21.02.2017. URL: http://docs.basho.com/riak/ts/1.5.2/using/creating-activating/ (дата обращения: 29.01.2019).