фонОбработка реляционной модели в Кассандре
Мы выбрали Cassandra как наш двигатель хранения, так как у нас есть приложение, которое должно обрабатывать асинхронной передачи сообщений между многими пользователями на сайте и события, хранящих (некоторые виды аналитики, то, что происходит на месте и когда и т. д.). Также у нас есть платформа для голосования, поэтому мы сохраняем голоса на каждого пользователя в день, и Cassandra хороши в этих случаях использования.
Недавно у нас появились новые требования к построению реляционной модели поверх нашей существующей системы (по крайней мере, мы считаем ее реляционной). Некоторые типы политических кандидатов со списками рабочих мест, образованием, историческим голосованием, одобрения и т.д.
Проблемных
У нас есть отношения, которые могут быть отредактированы на обоих концах (т.е. кандидат поддерживается компаниями, но в нашей административной панели, которую можно редактировать без кандидата). Кандидат - это одна строка в нашей Cassandra DB, идентифицированная UUID. На лицевой стороне нам нужна полная информация о кандидатах (политическая партия, школы, рабочие места, история голосования, вспомогательные компании). Мы хотим разместить большинство информации о кандидатах в одной строке, чтобы мы могли читать данные с одного чтения. Однако, когда мы размещаем список поддерживающих компаний UDT, у нас есть проблемы с его редактированием (мы должны изменить его в таблицах company_by_id
и candidate_by_id
).
Вопрос
Как решить проблему редактирования и вопросы реляционной модели в нашей ситуации?
Мы придумали несколько решений:
- Гусеницы отношений в Кассандре с дополнительными индексных как таблицы:
candidates_by_supporting_company
. При обновлении компании мы обновляем кандидатов, которые также имеют эту компанию. - Похож на 1, но с использованием вторичный индекс, если отношение низкое беззаконие и обновление на основе вторичного индекса (у нас есть 10 политических партий, поэтому мы можем поместить индекс в политическую партию в таблицу кандидатов, а при изменении политической партии мы сможем изменить кандидатов политической партией, так как у нас есть индекс)
- Используйте реляционную базу данных для реляционного типа данных и оставляйте Cassandra обрабатывать только подходящие варианты использования, такие как временные ряды данных, обмен сообщениями, сортировка событий (это добавляет стоимость обслуживания еще одной базы данных, затраты на развертывание и проблемы, так как наша система распределена как для репликации данных)
- Используйте Spark для объединения (это не единственная цель - добавить Spark в систему, мы думаем о добавлении его для импорта больших массивов данных в CSV и делать преобразование поэтому с искрой будет добавлен бонусом, и мы можем использовать SparkSQL место, где нам нужно присоединяется)
Мы склоняемся к варианту 3, так как мы добавит Spark в любом случае, мы останемся только с базой данных Cassandra (что не осложняет обслуживание и развертывание еще одной базы данных), и мы получим от JOINS и GROUP BY эффективные на уровне приложений.
Как вы думаете?
У вас есть, может быть, какое-либо мнение о Spark? Нам нужно добавить его из-за импорта огромных исторических файлов из внешнего CSV, чтобы мы могли уже иметь его в проекте, чтобы помочь нам в JOINS и сортировке. –
Конечно, если вам нужно присоединиться к пакетной среде, идите с искру, не задумываясь. Если вам нужно присоединиться к искре в интерактивном env, что-то вроде соединения jdbc из инструмента деловой интелекции, вы можете использовать бережливый сервер искры: вы можете использовать кеш, и вы добьетесь хорошей производительности, но операции сосут немного, потому что бережливый сервер по-моему, не готово к производству –
Другим жизнеспособным вариантом является периодическая денормализация в искровом режиме и сохранение своего рода материализованного представления в паркетном файле над CFS. Это позволит выполнять взаимодействие SQL с божественной производительностью без кеша. Все n памяти –