Мне нужно хранить и иметь возможность запрашивать некоторые очень большие объемы данных временных рядов.
Свойства данных следующие:
- количество серий: около 12.000 (двенадцать тысяч)
- количество точек данных во всем мире: около 500 000 000 в месяц (пятьсот миллионов)
- типы смешанных значений: большинство точек данных являются значениями с плавающей точкой, остальные являются строками
- период выборки: переменная между сериями, а также внутри серии
- метки времени: точность в миллисекундах
- срок хранения данных: несколько лет, без разложения или понижающей выборки
- архивы данных должны быть построены почти в реальном времени, но приемлемая задержка (~ 1 час) приемлема
- прошлые данные могут быть восстановлены при необходимости, но с высокой стоимостью
- иногда, но довольно редко, некоторые прошлые данные требуют обновления
Свойства предполагаемых запросов:
- большинство запросов к данным будет основано на метках времени; от одного дня до нескольких месяцев / лет. 90% + будут запросы по самым последним данным
Другие требования:
- решение должно быть бесплатным как в бесплатном пиве и желательно с открытым исходным кодом
Моя первоначальная мысль заключалась в том, чтобы использовать PyTables / Pandas с файлами HDF5 в качестве хранилища данных вместо базы данных SQL.
Вопросов :
Предполагая, что PyTables / Pandas - это «лучший» маршрут, было бы лучше разделить данные на несколько файлов HDF, каждый из которых охватывает определенный период времени, или поместить все в один файл, который затем станет огромным?
Должен ли я пойти и предпочесть фиксированный или табличный формат? Для меня фиксированный формат выглядит нормально, если я сохраняю один файл HDF в месяц, так как, таким образом, целая серия, вероятно, помещается в ОЗУ, и я могу разрезать в памяти, не нуждаясь в индексе формата таблицы. Я прав ?
И если это не лучший подход, как я должен структурировать это хранилище данных или какие технологии я должен рассмотреть? Я не первый, кто занимается хранением больших наборов данных временных рядов. Каков общий подход к решению этой проблемы?
Другие подходы, которые я рассмотрел:
- Базы данных массива: они превосходно подходят для временных рядов с постоянным периодом выборки, так как тогда вам нужно только сохранить время начала и окончания и период выборки массива, а затем только значения в самом массиве и индексирование легко. Но с переменными периодами выборки внутри самих рядов мне нужно поддерживать более тесное отношение timestamp-> value, которое, на мой взгляд, не очень подходит для массивов СУБД.
- стандартная база данных SQL с меткой времени, paramID, значением в виде столбцов, но по своей природе они запрашивают много дискового ввода-вывода для любого запроса
источник
Ответы:
Возможно, вы захотите взглянуть на углерод и шепот , часть графитового проекта. Carbon может обрабатывать очень большие объемы данных временных рядов. Хотя теперь, когда я читаю документы (прошло уже несколько лет, как я их использовал), это только для числовых данных. Вы сказали, что у вас также есть строковые данные, поэтому вы можете не найти это полезным. Хотя, возможно, вам удастся получить некоторые знания о том, как они могут быстро обрабатывать большие объемы данных.
Чтобы дать вам представление о том, насколько хорошо он масштабируется, когда графит был впервые запущен в производство на Orbitz, он обрабатывал 160 000 метрик в минуту .
источник
InfluxDB - это база данных с открытым исходным кодом, написанная на Go. Он был написан специально для обработки данных временных рядов, и они опубликовали тесты, показывающие гораздо лучшую производительность по сравнению с Cassandra :
источник
Возможно, вы захотите оформить ориентированные на столбцы базы данных. Я не уверен, что вы подразумеваете под массивными базами данных, но с моим предложенным подходом вы можете иметь динамическое число значений за период времени. Вы также можете иметь несколько значений для одной и той же отметки времени. Интересно то, что если у вас есть значения, измеренные в одной и той же отметке времени, вы можете сохранить их в виде дополнительных столбцов (например, датчик, который измеряет температуру и влажность, цену торговли акциями и размер сделки, ...). Из-за ориентированной на столбцы природы вы можете иметь таблицы с 100 столбцами, но если ваш запрос обращается только к пяти столбцам, база данных считывает только данные пяти столбцов.
Я написал серию о создании вашей собственной базы данных временных рядов, вы можете взглянуть на нее:
источник