2 миллиона запросов к фрейму данных - PullRequest
1 голос
/ 14 июля 2020

Мне нужно выполнить 2 миллиона запросов к таблице с тремя столбцами t (s, p, o), размер которой составляет 10 миллиардов строк. Тип данных каждого столбца - строка.

Только два типа запросов:

  • select s p o from t where s = param
  • select s p o from t where o = param

Если я сохраню таблицу в базе данных Postgresql, это займет 6 часов с использованием Java ThreadPoolExecutor.

Как вы думаете, Spark может еще больше ускорить обработку запросов? Какая стратегия была бы лучшей? Это мои идеи:

  • Загрузить таблицу в dataframe и запустить запросы к фрейму данных.
  • Загрузить таблицу в базу данных parquet и запустить запросы к в этой базе данных.
  • Используйте Spark 2.4 для запуска запросов к базе данных Postgresql вместо прямого запроса.
  • Используйте Spark 3.0 для запуска запросов к базе данных, загруженной в PG-Strom, модуль расширения PostgreSQL с поддержкой GPU.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Стат. c Данные? Искра; В противном случае настройте Postgres

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

Определите размер данных, выполнив SELECT pg_size_pretty( pg_total_relation_size('tablename')); Разделите результат на количество ядер, доступных Spark, пока вы не получите между 1 / 8 и 3/4 гиг.

Сохранить как паркет , если у вас действительно есть данные stati c или если вы хотите быстро восстановиться после сбоя.

Если исходные данные часто обновляются, вы можете добавить индексы в Postgres. Это может быть так же просто, как добавление индекса для каждого столбца. Разбиение на Postgres также может помочь.

Придерживайтесь Postgres. Новые базы данных не подходят для структурированных данных, таких как ваша. Есть варианты распараллеливания. Аврора, если вы на AWS.

PG-Strom вам не подойдет. У вас простые данные с несколькими столбцами. Включение и отключение их в GPU будет слишком сильно замедлять вас.

0 голосов
/ 14 июля 2020

Использование Apache Spark поверх существующих MySQL или PostgresSQL серверов (без необходимости экспортировать или даже передавать данные в Spark или Had oop) может повысить производительность запросов. чем в десять раз. Использование нескольких серверов MySQL (репликация или Percona XtraDB Cluster) дает нам дополнительное повышение производительности для некоторых запросов. Вы также можете использовать функцию кеширования Spark для кэширования всей таблицы результатов запроса MySQL. Идея проста: Spark может читать данные MySQL или PostgresSQL через JDB C, а также выполнять запросы SQL, поэтому мы можем напрямую подключать его к БД и запускать запросы. Почему это быстрее? Для длительных запросов (например, отчетов или бизнес-аналитики) это может быть намного быстрее, поскольку Spark - это система с массовым параллелизмом. Например, MySQL может использовать только одно ядро ​​ЦП на запрос, тогда как Spark может использовать все ядра на всех узлах кластера.

Но я рекомендую вам использовать No- SQL (HBase, Cassandra, ... ) или Новые- SQL решения для ваших анализов, потому что они имеют лучшую производительность при увеличении масштаба ваших данных.

...