Использование HBase для хранения данных временных рядов

Мы пытаемся использовать HBase для хранения данных временных рядов. Модель, которую мы в настоящее время сохраняем временными рядами как версии внутри ячейки. Это означает, что ячейка может в конечном итоге хранить миллионы версий, а запросы в этом временном ряду будут извлекать ряд версий, используя метод setTimeRange, доступный в классе Get в HBase.

например.

{
    "row1" : {
        "columnFamily1" : {
            "column1" : {
                1 : "1",
                2 : "2"
            },
            "column2" : {
                1 : "1"
            }
        }
    }
}

Является ли это разумной моделью для хранения данных временных рядов в HBase?

Является ли альтернативная модель хранения данных в нескольких столбцах (возможно ли выполнить запрос по столбцам) или строк более подходящим?

Ответы

Ответ 1

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


Я предлагаю вам хранить временные ряды в качестве временного шага в качестве определителя столбца, а значением будут сами данные. Что-то вроде:

{
    "row1" : {
        "columnFamily1" : {
            "col1-000001" : "1"
            "col1-000002" : "2"
            "col1-000003" : "91"
            "col2-000001" : "31"
            }
        }
    }
}

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


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

{
    "fooseries-00001" : {
        "columnFamily1" : {
            "val" : "1"
            }
        }
    }
    "fooseries-00002" : {
        "columnFamily1" : {
            "val" : "2"
            }
        }
    }

}

У этой приятной функции довольно легко сделать сканирование диапазонов в определенной серии. Например, вытаскивание шагов от fooseries с 104 по 199 будет довольно тривиально для реализации и быть эффективным.

Недостатком этого является удаление целой серии, которая потребует немного большего управления и синхронизации. Еще один недостаток заключается в том, что аналитика MapReduce будет нелегко делать какие-либо анализы по этим данным. При таком подходе весь временной ряд будет передан одному вызову map(), а здесь для каждого кадра будет вызываться map().

Ответ 2

Если бы мне пришлось строить решение временного ряда на HBase, я бы определенно посмотрел на http://opentsdb.net/ выпуск с открытым исходным кодом StumbleUpon, поскольку он будет использоваться внутри SU, я бы счел его стабильным и получал непрерывную поддержку.

Ответ 3

Посмотрите Zohmg.

Ответ 4

На самом деле есть Бумага с именем: "Трехмерная модель данных в HBase для анализа большого набора временных рядов" (2012) (только слайды), который показывает улучшенную производительность для модели данных, которая использует поле версии HBase, например, опросник. Но он не был предназначен для хранения бесконечных "версий", но ведро ячеек (Sensordata на час или день).

Ответ 5

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

Что касается исходного вопроса, у вас может быть столько версий ячеек, сколько вы хотите (нет ограничений). Нет штрафа за производительность, "Get" реализован как Scan в любом случае в HBase, а setTimeRange - довольно эффективный фильтр.