Spec-Zone.ru › OpenTSDB

Схема HBase

Схема таблицы данных

Все данные точек OpenTSDB хранятся в одной массивной таблице, которая по умолчанию называется tsdb. Это сделано для использования сортировки и распределения областей HBase. Все значения хранятся в семействе столбцов t.

Ключ строки - Ключи строк представляют собой массивы байтов, состоящие из необязательной соли, идентификатора метрики, базового временного отметки и идентификатора пар тег/значение: [salt]<metric_uid><timestamp><tagk1><tagv1>[...<tagkN><tagvN>]. По умолчанию, идентификаторы кодируются 3 байтами.

При включенном использовании соли (начиная с OpenTSDB 2.2) первый байт (или байты) — это хешированный идентификатор соли для лучшего распределения данных по нескольким областям и/или серверам областей.

Временная метка — это значение эпохи Unix в секундах, закодированное в 4 байтах. Строки разбиваются на часовые интервалы, отражаемые временной меткой в каждой строке. Таким образом, каждая временная метка будет нормализована до значения часа, например, 2013-01-01 08:00:00. Это делается для предотвращения слишком большого количества точек данных в одной строке, что повлияло бы на распределение областей. Также, так как HBase сортирует по ключу строки, данные для одной и той же метрики и временного интервала, но с разными тегами, будут сгруппированы вместе для эффективных запросов.

Вот несколько примеров ключей строк без соли, представленных в шестнадцатеричном формате:

00000150E22700000001000001
00000150E22700000001000001000002000004
00000150E22700000001000002
00000150E22700000001000003
00000150E23510000001000001
00000150E23510000001000001000002000004
00000150E23510000001000002
00000150E23510000001000003
00000150E24320000001000001
00000150E24320000001000001000002000004
00000150E24320000001000002
00000150E24320000001000003

где:

00000150E22700000001000001
'----''------''----''----'
metric  time   tagk  tagv

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

00000150E22700000001000001000002000004
'----''------''----''----''----''----'
metric  time   tagk  tagv  tagk  tagv

Имена тегов (tagk) сортируются по алфавиту перед сохранением, поэтому тег "host" всегда будет отображаться первым в ключе строки/TSUID перед тегом "owner".

Столбцы точек данных

Наиболее распространённые столбцы — это точки данных. Это фактические значения, регистрируемые при отправке данных в TSD для хранения.

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

Столбцы с квалификаторами длиной 2 байта имеют смещение во секундах. Первые 12 бит квалификатора представляют собой целое число, которое является разностью от временной метки в ключе строки. Например, если временная метка в ключе строки нормализована к 1292148000 и поступает точка данных для 1292148123, зарегистрированная разность будет 123. Последние 4 бита — это флаги формата.

Столбцы с квалификаторами длиной 4 байта имеют смещение в миллисекундах. Первые 4 бита квалификатора всегда будут установлены в значение 1 или F в шестнадцатеричном формате. Следующие 22 бита кодируют смещение в миллисекундах как беззнаковое целое число. Следующие 2 бита зарезервированы, а последние 4 бита — это флаги формата.

Последние 4 бита любого типа столбцов описывают хранимые данные. Первый бит — это флаг, указывающий, является ли значение целым или с плавающей точкой. Значение 0 указывает на целое число, 1 указывает на число с плавающей точкой. Последние 3 бита указывают на длину данных, сдвинутых на 1. Значение 000 указывает на значение 1 байт, в то время как 010 указывает на значение 2 байта. Длина должна отражать значение 1, 2, 4 или 8. Любое другое значение указывает на ошибку.

Например, 0100 означает, что значение столбца — 8-байтовое целое число со знаком. 1011 указывает, что значение столбца — 4-байтовое значение с плавающей точкой. Итак, квалификатор для точки данных в 1292148123 со значением целого числа 4294967296 будет иметь квалификатор 0000011110110100 или 07B4 в шестнадцатеричном формате.

Значения столбцов - 1–8 байтов, закодированных в соответствии с флагом квалификатора.

Сжатия

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

Примечание

Процесс сжатия OpenTSDB полностью отделён по охвату и определению от идеи сжатия HBase.

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

Значения столбцов - Значение также представляет собой конкатенацию всех отдельных точек данных. Сначала разбивается квалификатор, а флаги каждой точки данных определяют, потребляет ли анализатор 4 или 8 байтов.

Аннотации или другие объекты

Строка может содержать заметки о временных рядах совместно с точками данных. Объекты отличаются от точек данных наличием нечётного количества байтов в квалификаторе.

Квалификаторы столбцов - Квалификатор составляет 3 или 5 байтов, при этом первый байт является идентификатором, обозначающим столбец как квалификатор. Первый байт всегда будет иметь шестнадцатеричное значение 0x01 для аннотаций (будущие типы объектов будут иметь другой префикс). Остальные байты кодируют смещение временной метки от базового времени строки аналогичным образом, как и у точки данных, но без флагов. Если квалификатор имеет длину 3 байта, смещение указывается в секундах. Если квалификатор имеет длину 5 байтов, смещение указывается в миллисекундах. Таким образом, если мы запишем аннотацию в 1292148123, смещение будет 123, а квалификатор в шестнадцатеричном формате будет 01007B.

Значения столбцов - Значения аннотаций закодированы в UTF-8 в формате JSON-объектов. Не изменяйте это значение напрямую. Порядок полей важен, влияя на вызовы CAS.

Добавление точек данных

OpenTSDB 2.2 представил возможность записи числовых точек данных в OpenTSDB с помощью метода append вместо обычного метода put. Это экономит место в HBase, записывая все данные для строки в один столбец, что позволяет использовать преимущества сжатия TSD, избегая проблем с чтением огромного количества данных обратно в TSD и их повторной записью в HBase. Недостатком является то, что схема несовместима с обычными точками данных и требует большего использования ЦП на серверах областей HBase, так как они выполняют операцию чтения, изменения и записи для каждого значения.

Ключ строки - Такой же, как у обычных значений.

Квалификатор столбца - Квалификатор всегда представляет собой префикс объекта 0x05 со смещением 0 от базового времени в двух байтах. Например, 0x050000.

Значения столбцов - Каждое значение столбца представляет собой конкатенацию смещений и значений оригинальных квалификаторов точек данных в формате <offset1><value1><offset2><value2>...<offsetN><valueN>. Значения могут появляться в любом порядке и сортируются на этапе запроса (с возможностью повторной записи отсортированного результата обратно в HBase).

Схема таблицы UID

Отдельная, более компактная таблица под названием tsdb-uid хранит соответствия UID, как прямые, так и обратные. Существуют два столбца, один под названием name, который отображает UID в строку, и другой id, отображающий строки в UID. Каждая строка в семействе столбцов будет содержать по крайней мере один из трех столбцов со значениями соответствия. Стандартные квалификаторы столбцов:

  • metrics для отображения имён метрик в UID
  • tagk для отображения имён тегов в UID
  • tagv для отображения значений тегов в UID.

Семейство name также может содержать дополнительные столбцы метаданных, если это настроено.

id Семейство столбцов

Ключ строки - Это строка, назначенная UID. Например, для метрики у нас может быть значение sys.cpu.user или для значения тега — 42.

Квалификаторы столбцов - Один из стандартных типов столбцов выше.

Значение столбца - Беззнаковое целое число, закодированное в 3 байтах по умолчанию, отражающее UID, назначенный строке для типа столбца. Если длина UID изменена в исходном коде, ширина может меняться.

name Семейство столбцов

Ключ строки - Беззнаковое целое число UID, закодированное в 3 байтах по умолчанию. Если длина UID изменена в исходном коде, ширина может отличаться.

Квалификаторы столбцов - Один из стандартных типов столбцов выше ИЛИ один из metrics_meta, tagk_meta или tagv_meta.

Значение столбца - Для стандартных квалификаторов выше — строка, назначенная UID. Для столбца *_meta значение будет строкой UTF-8, содержащей объект UIDMeta в формате JSON. Не изменяйте значение столбца вне OpenTSDB. Порядок полей важен, влияя на вызовы CAS.

Строка назначения UID

В семействе столбцов id находится строка с однобайтовым ключом \x00. Это строка UID, которая увеличивается для правильного типа столбца (метрики, tagk или tagv) при назначении нового UID. Значения столбцов — 8-байтовые целые числа со знаком и отражают максимальный назначенный UID для каждого типа. При назначении OpenTSDB вызывает атомарную команду увеличения HBase для соответствующего столбца, чтобы получить новый UID.

Схема таблицы метаданных

Эта таблица является индексом различных временных рядов, хранящихся в OpenTSDB, и может содержать метаданные для каждого ряда, а также количество точек данных, хранящихся для каждого ряда. Обратите внимание, что данные в эту таблицу будут записаны только в том случае, если OpenTSDB настроена на отслеживание метаданных или пользователь создаёт объект TSMeta через API. Используется только одно семейство столбцов, семейство name, и в настоящее время существует два типа столбцов: столбец метаданных и столбец счётчика.

Ключ строки

Он такой же, как ключ строки таблицы точек данных без временной метки. Например, <metric_uid><tagk1><tagv1>[...<tagkN><tagvN>]. Он общий для всех типов столбцов.

Столбец TSMeta

Эти столбцы хранят объекты UTF-8, закодированные в формате JSON, подобные объектам UIDMeta. Квалификатор всегда равен ts_meta. Не изменяйте эти значения столбцов вне OpenTSDB, иначе вызов CAS может нарушиться.

Столбец счётчика

Эти столбцы являются атомарными счётчиками, которые подсчитывают количество точек данных, хранящихся для временного ряда. Квалификатор равен ts_counter, а значение — 8-байтовое целое число со знаком.

Схема таблицы дерева

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

Каждому дереву присваивается уникальный идентификатор, состоящий из целого беззнакового числа, начинающегося с 1 для первого дерева. Все строки, относящиеся к дереву, имеют префикс с этим ID, закодированным в виде массива из двух байтов. Например, \x00\x01 для UID 1.

Ключ строки

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

Могут быть включены две специальные строки. Они имеют ключ <tree ID>\x01 для строки collisions и <tree ID>\x02 для строки not matched. Они генерируются во время обработки дерева и будут описаны позже.

Остальные строки — это строки ветвей и листьев, содержащие информацию об иерархии. Строки имеют ключ <tree ID><branch ID>, где branch ID — это конкатенация хэшей имён отображения ветвей. Например, если у нас есть уплощенная ветвь dal.web01.myapp.bytes_sent, где каждое имя ветви разделено точкой, у нас будет 3 уровня ветвления. dal, web01 и myapp . Лист будет называться bytes_sent и содержит ссылку на TSUID. Вычисление хэша каждого имени ветви в Java возвращает целое 4-байтовое число, а преобразование в шестнадцатеричный вид для читаемости даёт:

  • dal = x00x01x83x8F
  • web01 = x06xBCx4Cx55
  • myapp = x06x38x7CxF5

Если эта ветвь принадлежит дереву 1, то ключ строки для dal будет \x00\x01\x00\x01\x83\x8F. Ветвь для myapp будет \x00\x01\x00\x01\x83\x8F\x06\xBC\x4C\x55\x06\x38\x7C\xF5. Эта схема позволяет осуществлять навигацию, предоставляя фильтр ключей строк, использующий префикс, включающий ID дерева и текущий уровень ветвления, и подстановочный знак для соответствия любому количеству уровней дочерних ветвей (обычно только одному уровню вниз).

Столбец дерева

Дерево определяется как объект JSON, закодированный в формате UTF-8, в столбце tree строки дерева (идентифицируемой по ID дерева). Объект содержит описания и параметры конфигурации для обработки временных рядов через дерево. Не изменяйте этот объект вне OpenTSDB, так как это может нарушить вызовы CAS.

Столбец правил

В строке дерева есть 0 или более столбцов правил, которые определяют конкретную задачу обработки временного ряда. Эти столбцы также представлены объектами JSON, закодированными в формате UTF-8, и изменяются с помощью вызовов CAS. Идентификатор квалификатора имеет формат rule:<level>:<order>, где <level> — основной порядок обработки правила в наборе (начиная с 0), а order — порядок обработки правила (начиная с 0) на данном уровне. Например, rule:1:0 определяет правило на уровне 1 и порядке 0.

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

Если для дерева включено хранение столкновений, для каждого временного ряда, который мог бы создать лист, уже созданный для предыдущего временного ряда, записывается столбец. Эти столбцы используются для отладки наборов правил и появляются только в строке столкновений для дерева. Квалификатор имеет формат tree_collision:<tsuid>, где TSUID — массив байтов, представляющий идентификатор временного ряда. Это позволяет выполнить простой вызов getRequest для определения, не появился ли конкретный временной ряд в дереве из-за столкновения. Значение столбца столкновения — массив байтов TSUID, который был записан как лист.

Столбец несоответствий

Аналогично столкновениям, если для дерева включено, то может записываться столбец для каждого временного ряда, который не смог соответствовать никаким правилам в наборе правил и, следовательно, не появился в дереве. Эти столбцы появляются только в строке несоответствий для дерева. Квалификатор имеет формат tree_not_matched:<TSUID>, где TSUID — массив байтов, представляющий идентификатор временного ряда. Значение столбца несоответствия — массив байтов TSUID, который не смог соответствовать правилу.

Столбец ветви

Столбцы ветвей имеют квалификатор branch и содержат закодированный в формате UTF-8 JSON-объект, описывающий текущую ветвь и любые возможные дочерние ветви. Столбец ветви может появиться в любой строке, кроме столбцов столкновений или несоответствий. Ветви в строке определения дерева являются ветвью root и связаны с первым уровнем дочерних ветвей. Эти ссылки используются для перемещения по иерархии.

Столбец листа

Листы отображают соответствие конкретным временным рядам и представляют собой конец иерархии. Столбцы листов имеют формат квалификатора leaf:<TSUID>, где TUID — массив байтов, представляющий идентификатор временного ряда. Значение листа — закодированный в формате UTF-8 JSON-объект, описывающий лист. Листы могут появляться в любой строке, кроме строк столкновений или несоответствий.

Схема таблиц сглаживания

Начиная с OpenTSDB 2.4, существует понятие таблиц сглаживания и предварительного агрегирования. Хотя TSDB отлично справляется с хранением исходных значений, запросы для широких временных интервалов по огромным объемам исходных данных могут замедлить запросы до предела и потенциально вызвать переполнение памяти JVM. Вместо этого отдельные временные ряды могут быть сглажены (или понижены) по времени и сохранены как отдельные значения, которые позволяют сканировать гораздо более широкие временные интервалы с меньшим разрешением. Кроме того, для метрик с высокой кардинальностью могут храниться предварительно агрегированные группы для значительного повышения скорости запросов.

Существует три типа сглаженных данных:

  • Сглаживание — это пониженное значение по времени для одного временного ряда. Оно аналогично использованию понижающего преобразователя в запросе, где временной ряд может иметь данные каждые минуту, но понижается до данных каждые час с использованием агрегации sum . В этом случае полученное значение сглаживания — это сумма 60 значений. Например, если значение для каждого 1-минутного временного отсчёта равно 1, то полученное значение сглаживания будет 60.
  • Предварительное агрегирование — для метрики с высокой кардинальностью (множество уникальных значений тегов) сканирование всех рядов может быть дорогостоящим. Рассмотрим метрику system.interface.bytes.out, где есть 10 000 хостов, распределённых по 5 центрам обработки данных. Если пользователи часто смотрят на общий объём данных по центру обработки данных (запрос будет выглядеть аналогично aggregation = sum и data_center = *), то предварительное вычисление суммы по каждому центру обработки данных приведет к получению 5 точек данных за каждый период времени из хранилища вместо 10 000. Результирующее предварительное агрегирование будет иметь другой набор тегов, чем исходный временной ряд. В приведённом выше примере, каждый ряд, вероятно, будет иметь тег host вместе с тегом data_center . После предварительного агрегирования тег host будет удалён, оставив только тег data_center.
  • Сглаженное предварительное агрегирование — предварительно агрегированные данные также могут быть сглажены по времени, аналогично исходным временным рядам. Это может улучшить скорость запросов для широких временных интервалов по предварительно агрегированным данным.

Конфигурация

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

Схема предварительного агрегирования

В реализации OpenTSDB добавляется новый, настраиваемый пользователем тег ко всем временным рядам при включении сглаживания. Значение тега по умолчанию — _aggegate со значением raw или функцией агрегирования. Тег используется для различения предварительно агрегированных данных от исходных (оригинальных) значений. Поэтому предварительно агрегированные данные хранятся так же, как и исходные временные ряды, и могут быть записаны в исходную таблицу данных или сохранены в отдельной таблице для повышения производительности запросов.

Схема сглаживания

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

Ключ строки — Ключ строки для сглаживания имеет тот же формат, что и исходная таблица данных.

Квалификатор столбца — Столбцы отличаются для сглаженных данных и состоят из <aggregation_function>:<time offset><type + length>, где функция агрегирования — строка с заглавными буквами, состоящая из имени функции, используемой для генерации сглаживания, смещение по времени — смещение относительно базового времени строки, а тип + длина описывают кодирование значения столбца.

  • Функция агрегирования — это имя функции, например, SUM, COUNT, MAX или MIN.
  • Смещение по времени — это смещение, основанное на конфигурации таблицы сглаживания, обычно 2 байта. Смещение не является конкретным количеством секунд или минут от базы, вместо этого это индекс интервала смещения. Например, если таблица настроена для хранения 1 дня данных с разрешением 1 час на строку, то базовый временной отметки строки будет совпадать с границами дня (в временных метках Unix эпохи). Тогда может быть до 24 смещений (по одному для каждого часа в день) для строки. Точка данных в полночь для данного дня будет иметь смещение 0, а значение в 23:00 — 22. Поскольку временные отметки сглаживания выровнены с границами времени, квалификаторы могут существенно экономить место.
  • Тип и длина — аналогично исходной таблице данных, последние 4 бита каждого массива байтов смещения содержат кодирование значения данных, включая его длину и то, является ли оно значением с плавающей точкой.

Пример квалификатора столбца для таблицы с ежедневным интервалом в 1 час выглядит так:

SUM:0010
'-''---'
agg offset

Где агрегатор — SUM, смещение — 1, а длина — 1 байт целого значения.

Значение столбца — значения такие же, как в основной таблице данных.

TODO — Необходимо выполнить некоторые дополнительные работы:

  • Сжатия/Добавления — Текущая схема не поддерживает типы данных сжатия или добавления. Их можно реализовать, обозначив один столбец на функцию агрегирования (например, SUM, COUNT) и сохранив смещения и значения в значении столбца, аналогично основной таблице данных.
  • Дополнительные типы данных — В настоящее время в таблицы предварительного агрегирования и сглаживания записываются только числовые точки данных. Нам нужно поддержать сглаживание аннотаций и других типов данных.

© 2010–2016 The OpenTSDB Authors
Licensed under the GNU LGPLv2.1+ and GPLv3+ licenses.
http://opentsdb.net/docs/build/html/user_guide/backends/hbase.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API