Какие у меня есть варианты хранения и запроса огромных объемов данных, многие из которых повторяются?

StackOverflow https://stackoverflow.com/questions/416432

Вопрос

Я оцениваю варианты эффективного хранения данных на Java.Набор данных представляет собой значения данных с отметкой времени и именованным первичным ключом.например

Name: A|B|C:D
Value: 124
TimeStamp: 01/06/2009 08:24:39,223

Это может быть цена акции в определенный момент времени, так что, я полагаю, это классический образец данных временного ряда.Однако мне действительно нужно универсальное решение RDBMS, которое будет работать с любой разумной базой данных, совместимой с JDBC, поскольку я хотел бы использовать Hibernate.Следовательно, расширение временных рядов для таких баз данных, как Oracle, на самом деле не является вариантом, поскольку я хотел бы, чтобы разработчик мог использовать свою собственную базу данных с поддержкой JDBC/Hibernate.

Проблема здесь заключается просто в огромном объеме данных, который может накопиться за короткий период времени.До сих пор мои реализации были сосредоточены на определении периодических графиков объединения и очистки, в которых необработанные данные агрегируются в ДЕНЬ, НЕДЕЛЮ, МЕСЯЦ и т. д.таблицах, но недостатком является ранняя потеря детализации и небольшое неудобство, связанное с несоответствием периодов между периодами, хранящимися в разных агрегатах.

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

Заимствуя концептуальную концепцию из классических алгоритмов сжатия данных и используя тот факт, что многие последовательные значения для одного и того же ключа могут быть идентичными, я задаюсь вопросом, есть ли способ плавно уменьшить количество хранимых записей путем объединения повторяющихся значений в одну логическую строку, сохраняя при этом счетчик, который фактически указывает «следующую н записи имеют одинаковую ценность».Реализация этого кажется достаточно простой, но недостатком является то, что модель данных теперь ужасно сложна для выполнения запросов с использованием стандартного SQL, особенно при использовании любых агрегатных функций SQL.Это значительно снижает полезность хранилища данных, поскольку только сложный специальный код может восстановить данные обратно в «распакованное» состояние, что приводит к несоответствию импеданса сотен инструментов, которые не смогут правильно отобразить эти данные.

Я рассматривал возможность определения пользовательских типов Hibernate, которые в основном «понимали» бы сжатый набор данных, восстанавливали его и возвращали результаты запроса с динамически создаваемыми синтетическими строками.(База данных будет доступна только для чтения всем клиентам, за исключением строго контролируемого входного потока).Некоторые из инструментов, которые я имел в виду, будут интегрироваться с Hibernate/POJOS в дополнение к чистому JDBC (например.JasperReports) Но это на самом деле не решает проблему агрегатных функций и, вероятно, имеет также ряд других проблем.

Итак, я частично смирился с тем, что, возможно, придется использовать более проприетарное хранилище данных [возможно, не SQL] (любые предложения приветствуются), а затем сосредоточусь на, возможно, менее сложной задаче написания псевдо-драйвера JDBC, чтобы хотя бы облегчить интеграцию с внешние инструменты.

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

Любые предложения или идеи?

Это было полезно?

Решение

Я бы посмотрел базу данных, ориентированную на столбцы . , Было бы здорово для такого рода приложений

Другие советы

Hibernate (или любое другое решение JPA) не подходит для этой задачи.

JPA/Hibernate не является легким решением.В приложениях большого объема накладные расходы не только значительны, но и непомерно высоки.Вам действительно нужно изучить грид- и кластерные решения.Я не буду повторять здесь обзор различных технологий.

У меня большой опыт работы в информационных системах финансового рынка.Несколько вещей из того, что вы сказали, мне запомнились:

  • У вас много необработанных данных;
  • Вы хотите применить к этим данным различные агрегированные данные (например, ежедневные сводки открытия/максимума/минимума/закрытия);
  • Высокая доступность, вероятно, является проблемой (в подобных системах она всегда есть);и
  • Низкая задержка, вероятно, является проблемой (то же самое).

Что касается решений типа сетки/кластера, я условно разделяю их на две категории:

  1. Решения на основе карт, такие как Coherence или Terracotta;и
  2. Решения на основе Javaspaces, такие как GigaSpaces.

Я много использовал Coherence, и решение Map может быть хорошим, но может быть и проблематичным.На картах когерентности могут быть слушатели, и вы можете использовать подобные вещи для таких вещей, как:

  • Оповещения о рыночных ценах (пользователям может потребоваться уведомление, когда цена достигает определенного уровня);
  • Производное ценообразование (например, система ценообразования биржевых опционов будет требовать переоценки, когда базовая ценная бумага меняет цену последней сделки);
  • Система сопоставления сделок/бронирования может захотеть сопоставить полученные торговые уведомления в целях выверки;
  • и т. д.

Все это можно сделать с помощью слушателей, но, например, в Coherence слушатели должны быть дешевыми, что приводит к тому, что у карты есть слушатель, который записывает что-то в другую карту, и это может продолжаться какое-то время.Кроме того, изменение записи кэша может быть проблематичным (хотя существуют механизмы решения и подобных проблем;Я говорю о таких ситуациях, как отключение оповещения о рыночной цене, чтобы оно не сработало во второй раз).

Я обнаружил, что сеточные решения типа GigaSpaces гораздо более привлекательны для такого рода приложений.Операция чтения (или деструктивного чтения) — это очень элегантное и масштабируемое решение, позволяющее получать обновления сетки транзакций с производительностью менее миллисекунды.

Рассмотрим две классические архитектуры массового обслуживания:

  • Ответ на запрос:плохое сообщение может заблокировать очередь, и хотя вы можете использовать множество отправителей и получателей (для масштабируемости), увеличение количества каналов не всегда является простой задачей;и
  • Опубликовать/подписаться:это разделяет отправителя и получателя, но ему не хватает масштабируемости: если у вас несколько подписчиков, каждый из них получит сообщение (не обязательно то, что вы хотите, скажем, в системе бронирования).

В GigaSpaces деструктивное чтение похоже на масштабируемую систему публикации-подписки, а операция чтения — на традиционную модель публикации-подписки.Существует реализация Map и JMS, построенная поверх сетки, и она может выполнять упорядочивание FIFO.

А как насчет настойчивости, спросите вы?Настойчивость является следствием решения всех остальных вопросов.Для такого рода приложений мне нравится Персистентность как услуга модель (иронично написано про Hibernate, но это применимо ко всему).

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

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

Это сложная тема, и я только по-настоящему ее коснулся.Надеюсь, это вам поможет.

Вероятно, вам будет интересно послушать Презентация Майкла Стоунбрейкера на Money:Tech.Он затрагивает ряд вещей, о которых вы упомянули, и показывает, что три больших слона (SQL Server, Oracle и DB2) никогда не смогут удовлетворить потребности тиковых хранилищ (которые, похоже, вы строите).Он выходит за рамки обычных магазинов, и я согласен, что это правильное направление.Он даже обсуждает сжатие и скорость, которые для вас важны.

вот еще несколько ссылок, которые могут оказаться интересными:

Многие системы управления базами данных с поддержкой JDBC (например, Oracle) обеспечивают сжатие в механизме физического хранилища. Например, у Oracle есть понятие «сжатый». таблица без декомпрессии:

http: //www.ardentperf .com / WP-содержание / добавления / 2007/07 / продвинутый-компрессионного datasheet.pdf

Спасибо за ответы.

Cletus, я ценю план, но один из компромиссов, которые я не могу сделать, - это отказ от гибкости и совместимости БД с JDBC / Hibernate, чтобы позволить использовать все доступные инструменты. Более того, хотя я четко не заявлял об этом, я не хочу заставлять своих пользователей принимать [возможно, дорогое] коммерческое решение. Если у них есть База данных Бренда X, пусть используют ее. Если им все равно, мы рекомендуем базу данных с брендом Y с открытым исходным кодом. По сути, приложение имеет несколько лиц, одно из которых является хранилищем для входящих данных, но другое лицо является источником отчетов, и я действительно обращаюсь не хочу заниматься написанием отчетов.

Хотя я еще не проверил нагрузку, я очень впечатлен LucidDB . Это база данных, ориентированная на столбцы, которая обеспечивает хорошую производительность запросов и, на первый взгляд, хорошее сжатие данных. У него есть драйвер JDBC, хотя для него пока нет диалекта Hibernate, насколько я могу судить. Он также поддерживает определяемые пользователем преобразования, которые, в общем, я думаю, позволят мне без проблем реализовать мою идею сжатия повторяющихся и последовательных значений в одну «строку», но превратить их обратно в несколько «синтетических». строки во время запроса, все сделано незаметно для вызывающего запроса. Наконец, он поддерживает эту замечательную особенность сторонних таблиц, где другие таблицы поддержки баз данных JDBC могут быть найдены в LucidDB. Я думаю, что это может иметь неоценимое значение для обеспечения некоторого уровня поддержки других баз данных.

Спасибо за указатель, Javaman. Это зонировало меня на LucidDB.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top