Использование HBase для хранения данных временных рядов - PullRequest
14 голосов
/ 08 ноября 2010

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

* 1006.* например
{
    "row1" : {
        "columnFamily1" : {
            "column1" : {
                1 : "1",
                2 : "2"
            },
            "column2" : {
                1 : "1"
            }
        }
    }
}

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

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

Ответы [ 5 ]

18 голосов
/ 26 апреля 2012

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


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

{
    "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"
            }
        }
    }

}

Это имеет приятную особенность, заключающуюся в том, что будет довольно легко выполнять сканирование диапазона в определенной серии. Например, вытащить шаги 104–199 из фуража будет довольно тривиально для реализации и быть эффективным.

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

6 голосов
/ 01 декабря 2010

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

3 голосов
/ 09 января 2011

Взгляните на Zohmg .

2 голосов
/ 13 июня 2013

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

0 голосов
/ 17 июня 2013

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

Что касается исходного вопроса, вы можете иметь столько версий ячеек, сколько хотите (ограничений нет).Производительность не снижается, в любом случае в HBase реализовано «Get», так как Scan в любом случае является setTimeRange.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...