Как хранить большие объемы _structured_ данных?

9

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

Эти данные структурированы. В реляционной базе данных она будет храниться как: | user | timestamp | latitude | longitude |

Однако данных слишком много. Ежедневно будет 60 × 60 × 24 = 86 400 записей на пользователя. Даже с 1000 пользователей это означает 86 400 000 записей в день.

И это не только 86 400 000 записей в день. Потому что эти записи будут обработаны и обработанные версии будут также сохранены. Итак, умножьте это число примерно на 2.

Как я планирую использовать данные

По сути, я планирую сделать более грубые версии данных о местоположении для более удобного потребления. Это:

  1. Сортировать полученные данные по временным меткам.
  2. Повторяя этот список по порядку, определите, значительно ли изменилось местоположение (проверив, насколько изменились широта и долгота)
  3. Представлять несущественные изменения местоположения в виде одной записи в выходных данных (следовательно, выходные данные представляют собой более грубую версию данных о местоположении).
  4. Повторяйте этот процесс на выходе, требуя еще большего изменения широты и долготы для значительного изменения. Следовательно, вывод, который будет получен из предыдущего вывода, будет еще более грубым.
  5. Повторяйте весь процесс столько, сколько нужно.
  6. Соберите диапазон разрешений и отправьте их пользователям. Кроме того, сохраните все разрешения данных для последующего использования.

Что я должен использовать для хранения этих данных? Должен ли я использовать реляционную базу данных или решение NoSQL? Что еще нужно учитывать при разработке этого приложения?

Утка
источник
3
Подобные 2000 записей в секунду, вероятно, не будут беспокоить современный движок SQL. Простым тестом емкости было бы получить консольную программу, записывающую случайные файлы в загружаемые файлы.
17
1
@Caleth Но это масштабируемое? Как насчет того, когда база пользователей увеличивается в 100 раз?
Утку
3
Измерьте, что ваше оборудование может в настоящее время обрабатывать Скорее всего, узким местом будет либо процессор, «обрабатывающий» значения, либо необработанная скорость диска. Что вы намерены делать со всеми этими данными? Это должно сформировать, какую технологию вы выберете для хранения
Caleth
3
Калет абсолютно прав. Миллионы записей не волнуют современную систему баз данных. Хранилища NoSQL очень хорошо пишут огромные объемы данных очень быстро, но в конечном итоге вы захотите сделать что-то, что потребует повторного чтения . Сколько вам нужно чтения, часто определяет, какой магазин вам следует использовать.
Килиан Фот
3
Чтобы дать хороший ответ, нам нужно знать, как вы планируете использовать эти данные. База данных может быть хорошим выбором, если вам нужны специальные запросы, а решение на основе файлов, вероятно, будет лучше для анализа всего набора данных. Голосование закрыть.
kdgregory

Ответы:

9

Некоторые альтернативы для хранения этих данных:

  1. Очередь сообщений (возможно, распределенная), как Apache Kafka

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

  1. Реляционные базы данных

Вы можете просто записать его в базу данных, а когда объем превышает емкость БД для обработки, вы можете разделить базу данных (= иметь несколько подмножеств данных на разных серверах баз данных). Преимущество: вы можете использовать реляционную БД и вам не нужно изучать что-то новое. Недостаток: весь код, связанный с БД, должен знать, на каком фрагменте данных находится часть данных, агрегированные запросы должны выполняться в прикладном программном обеспечении.

  1. Распределенная база данных NoSQL, как Cassandra.

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

  1. Hadoop / файл

Данные добавляются в файлы, которые автоматически распределяются по серверам платформой Hadoop, обрабатываются на этих серверах с использованием таких инструментов, как M / R или Apache Spark, и, наконец, запрашиваются (в виде файлов) с использованием механизма Hadoop SQL, такого как Hive или Impala.

Какой выбрать?

Компромиссы между этими альтернативами являются сложными, и они очень сильно зависят как от вашей записи, так и от ваших схем чтения, поэтому единственный человек, который может принять решение об этих компромиссах, это вы. Если вам не хватает времени для глубокого понимания этих альтернатив, просто используйте реляционную БД и в процессе работы придумайте решение шардинга. По всей вероятности, ЯГНИ .

Джори Себрехтс
источник
Я предоставил более подробную информацию о том, как я планирую использовать данные. Хотели бы вы добавить что-нибудь, учитывая эту информацию?
Утку
Мне все еще не совсем ясно, что вы подразумеваете под «резолюцией». Вы хотите агрегировать на географический уровень (город, штат, ...) или в какую-то систему координат, такую ​​как геохэш? Или вас интересует количество дельты, потому что вы хотите создавать уведомления на основе порогов движения? Короче: для чего все это?
Джори Себрехтс
Это для отслеживания пользователей. Пользователи отслеживают друг друга, и я строю график, где пользователи, которых они отслеживают, были на устройствах за последние 5 часов. По сути, чем тоньше зернистость, тем лучше. Однако мобильные устройства имеют ограниченный объем памяти, поэтому вы не можете отправлять данные, не уменьшив их разрешение. То есть, скажем, пользователь A отслеживает пользователей B, C и D. Если я просто перенаправлю любые данные о местоположении, которые получу от B, C и D, в A, не выполняя никакой обработки на стороне сервера, память устройства пользователя A заполнится очень быстро , Следовательно, мне нужно сделать некоторую обработку.
Утку
Если бы я строил то, что вы описываете, я бы построил это как серию журналов Кафки, соединенных посредством потоковой передачи искры, где позиции интегрированы в окна в искровом потоке, а конечный выходной журнал Кафки предоставляется как pull и нажмите веб-API для клиентов. Однако ... это очень специфическая технология, и в зависимости от вашего опыта и доступного времени, этот выбор может быть неправильным для вас.
Джори Себрехтс
Спасибо. Я буду иметь это в виду, но, следуя принципу YAGNI, я планирую сейчас использовать реляционную базу данных. Когда возникнет необходимость, я переключусь на то, что лучше подходит для приложения. Пожалуйста, не стесняйтесь редактировать любую информацию в своем ответе, если хотите.
Утку
6

Посмотрите на ваши требования немного глубже. Есть способ создать иллюзию отслеживания позиции каждую секунду.

Если у вас есть приложение, которое знает ваше текущее местоположение GPS и записывает его в базу данных, зачем вам продолжать записывать местоположение, если оно не меняется? Даже если вам требуются данные, если пользователь спал в течение 7 часов, вы можете программно заполнить недостающие временные интервалы дублирующим местоположением для выполнения ваших расчетов или картирования или чего-либо еще, что вам нужно сделать.

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

JeffO
источник
2

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

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

Артур Гавличек
источник