Как обрабатывать запросы более 500 млн. Пунктов

8

Структура моих данных следующая:

date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important

Мне нужно выполнить следующие запросы:

Первый:

  • Фильтрация данных по date, filter_a, filter_b, filter_cи др

Во-вторых, с отфильтрованными данными:

  • считать все записи
  • получить среднее из variable_a, variable_bиvariable_c
  • получить стандартное отклонение от variable_a, variable_bиvariable_c
  • получить квартили из variable_a, variable_bиvariable_c
  • группировать данные по groupили second_groupи агрегировать (Count, Avg, Std, ..)

Число пользователей системы составляет около 10 или 15, но количество элементов огромен, прямо сейчас 70М , но это будет 500M в течение нескольких недель , и это будет 1000M примерно через год.

Количество запросов небольшое, не более 10 пользователей одновременно, моя проблема в том, как обрабатывать эти запросы с таким огромным количеством данных.

Что я пробовал до сих пор?

  • Я начал с того mongodb, что вначале это было быстро, но стало медленным при расчете квартилей с 10М +. Это улучшилось, когда я добавил индексы, но это не очень помогло, когда мне пришлось запрашивать все данные. Я начал использовать mongodb, потому что данные были очень динамичными, но, к счастью, формат данных «больше не изменится».

  • Как filter_aи filter_bможно было увидеть как узлы, я попробовал neo4j. Мне очень понравилось это neo4j, но у моего графа было МНОГО ребер, поэтому запросы не были очень быстрыми.

  • Наконец, поскольку формат данных не собирается меняться и это всего лишь одна коллекция / таблица, поэтому не требуется никаких соединений в SQL, я проверил postgresql. Мои тесты были быстрее с postgresql, но я боюсь, что в будущем он не сможет масштабироваться должным образом.

Что мне нужно?

  • Является ли postgresql хорошим выбором для этого случая?
  • Могу ли я использовать другую базу данных? какой из них лучше для этого случая?
  • Что еще я мог сделать, чтобы улучшить это?

редактировать

  • Около 1 млн элементов вставляются каждый день и «не должны меняться» с течением времени.
  • Скорость записи не важна
  • Сложное требование - быстро читать / агрегировать

Спасибо!

Andres
источник
1
Как насчет индексированных представлений в SQL Server / метастазированных представлений в Oracle? Это бегущая совокупность базовой таблицы, поэтому при изменении базовой таблицы индекс также изменяется на лету. Тогда вы всегда можете запросить агрегаты, которые уже рассчитаны для вас.
Али Разеги
@AliRazeghi - это хорошая идея. Во всяком случае, сначала я хочу выбрать лучшую базу данных / дизайн, прежде чем оптимизировать запросы
Andres
1
Для оптимизации исключительно в Postgres я хочу сказать, что здесь могут помочь индексы BRIN, но я ничего не сделал, кроме как прочитал о них. postgresql.org/docs/9.5/static/brin-intro.html
Эрик Дарлинг,
1
Лично я унаследовал многомиллиардную БД для отчетов о строках на OLTP-сервере без большого количества памяти. К счастью, наиболее интересными его частями были «последние 3 недели», но сканы не были неслыханными. Честно говоря, используя очень хорошее сжатие, разбиение, удаление разделов, схему разбиения, оптимизацию кэша SAN и удаление неиспользуемых индексов, мы получили очень хорошую производительность на MS SQL 2008 Ent. 1 миллиард не будет слишком сложным для PGSQL. Какова ширина каждой строки или примерно, сколько места, по вашему мнению, займет каждая строка, и сколько индексов будет на таблицу или процесс ввода?
Али Разеги
2
@ Хорошо, это зависит от того, в каком движке БД он находится и каков максимальный размер каждой строки, чтобы мы могли рассчитать. Например, в PostgreSQL есть varchar и просто char, char легко вычислить, varchar нам нужно угадать среднюю длину. Если бы мы могли знать, какие это типы полей (если это не Mongo или что-то, что хранит его в документе в своем собственном формате), приблизительно, сколько символов мы ожидаем в каждом из них и количество индексов со столбцами. 8 ГБ ОЗУ звучит так, как будто слишком мало, чтобы эффективно извлекать его из памяти, хотя особенно если эта память используется совместно с другими таблицами и ресурсами на сервере.
Али Разеги

Ответы:

5

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

Используя язык сценариев, такой как Python или Ruby, вы можете поэтапно решить проблему, выполняя запросы на «порции» данных за фиксированный промежуток времени, вычисляя промежуточную статистическую сводку, а затем комбинируя результаты по нескольким порциям в цикле на протяжении всей истории. Некоторые статистические показатели сложно объединить между частями, но что-то вроде Avg () требует только sum () и count () для каждого чанка, O (1) и O (размер чанка), поэтому объединение чанков может хорошо масштабироваться.

Jpierc
источник
Я попробовал что-то подобное, используя python / pandas . исчисление было быстрее (пара секунд), но получение всех данных было медленным. Может быть, лучше chunksizeможет помочь. +1
Андрес
1

Поскольку ваши данные не меняются, а только добавляются, я буду хранить данные где угодно; Amazon S3 например, но любая быстро читаемая база данных будет в порядке. Нет индексов. Выбранная вами база данных / ФС должна иметь возможность считывать данные в контейнерах: например, вы можете иметь один файл в день с вашими записями 1М.

Тогда я бы использовал Spark для фильтрации / анализа. Он основан на кластерах, вы можете масштабировать его под свои нужды.

Лео
источник
Я согласен, у меня уже есть отдельный набор данных в день. Я также думал о HDFS и HBase
Andres
0

Ответ зависит от того, как вы собираетесь использовать данные после этого. Если для обработки лучше использовать Cassandra, если для анализа лучше использовать Hive.

Артемий Прототипирование
источник
Я понял, что улей не может быть лучшим выбором для real time. Я ошибаюсь?
Андрес
1
Да, HBase для чтения / записи в реальном времени. Но Кассандра может сделать то же самое. Но я думаю, что HBase лучше.
Артемий прототип
0

Такая ситуация идеальна для хранилищ данных, использующих методы, усовершенствованные Ральфом Кимбаллом и его коллегами, на платформах, подобных SQL Server (та, с которой я больше всего знакома). Они были разработаны специально для этого типа сценария: огромные объемы записей данных, которые являются относительно статичными, для которых вам нужно рассчитать агрегаты такого рода. нетреляционная техника будет подходить для правильно реализованного хранилища данных в приложениях такого рода, хотя некоторые, безусловно, будут лучше, чем другие, если ваша организация просто не может позволить себе лицензии на пакеты программного обеспечения (например, службы анализа SQL Server), которые их реализуют. Существует также кривая обучения внедрению таких языков, как MDX, которые специально разработаны для такого рода доступа к данным. Если хранилище данных является жизнеспособным вариантом для вашей организации, не тратьте время на поиск реляционного решения; это не проблема реляционной базы данных. Я могу опубликовать некоторые основные ссылки на Kimball и т. Д., А также ссылки на SSAS и MDX (извините, я не могу помочь с Oracle и другими конкурентами, с которыми я не знаком) документацию, если это необходимо. Надеюсь, это поможет.

SQLServerSteve
источник