Написання понад 50 мільйонів від Pyspark df до PostgresSQL, найкращий ефективний підхід


16

Що було б найефективнішим способом вставити мільйони записів, скажімо, 50 мільйонів із фрейму даних Spark до таблиць Postgres. У минулому я це робив від іскри до MSSQL, використовуючи опцію масової копії та розміру партії, яка теж була успішною.

Чи є щось подібне, що може бути тут для Postgres?

Додавши код, який я спробував, і час, який знадобився для запуску процесу:

def inserter():
    start = timer()
    sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\
    .option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \
    .option("dbtable", "public.full_load").option("user", "root").option("password", "password").save()
    end = timer()
    print(timedelta(seconds=end-start))
inserter()

Тому я зробив вищезазначений підхід для 10 мільйонів записів і мав 5 паралельних з'єднань, як зазначено в, numPartitionsа також спробував розмір партії 200k .

Загальний час, який знадобився процесу, склав 0: 14: 05,760926 (чотирнадцять хвилин і п’ять секунд).

Чи є якийсь інший ефективний підхід, який би скоротив час?

Яким би був ефективний чи оптимальний розмір партії, яку я можу використовувати? Чи збільшить розмір моєї партії роботу швидше? Або відкриття декількох з'єднань, тобто> 5 допоможе мені зробити процес швидшим?

В середньому 14 хвилин на 10 мільйонів записів непогано , але шукати людей, які б це зробили раніше, щоб допомогти відповісти на це питання.


1
Ви можете спочатку перенести дані у локальний файл CSV, а потім використати власні інструменти імпорту PostgreSQL для його імпорту - це залежить від того, де знаходиться вузьке місце: це повільний експорт з Pyspark або повільний імпорт до Postgres, чи щось інше? (Тим не менш, 14 хвилин на 50 мільйонів рядків мені не здаються поганими - які індекси визначені на столі?).
Дай

Дай, у мене є df, який становить 52 мільйонів, і тепер я пишу це на Postgres, це нова таблиця, яку я створюю за допомогою наведеного вище коду. Я не створив таблицю в Postgres, а потім писав там. Чи є краща можливість, якщо я спершу зможу створити таблицю та індексувати її там у Postgres, а потім надсилати дані з spark df?
Chetan_Vasudevan

2
(Це навпаки - індекси сповільнюють вставки операцій у таблиці, але прискорюють вибір запитів)
Dai

Дай, тому я просто створюю таблицю в Postgres без індексу, а потім намагаюся вставити та виміряти свою ефективність?
Chetan_Vasudevan

Відповіді:


4

Я фактично робив таку ж роботу раніше, але використовуючи Apache Sqoop.

Я б сказав, що для відповіді на це питання ми повинні намагатися оптимізувати зв’язок між Spark та PostgresSQL, зокрема, даними, що надходять від Spark до PostgreSql.

Але будьте обережні, не забувайте іскрову сторону. Немає сенсу виконувати mapPartitions, якщо кількість розділів занадто висока порівняно з кількістю максимальних з'єднань, які підтримує PostgreSQL, якщо у вас занадто багато розділів і ви відкриваєте з'єднання для кожного, ви, ймовірно, матимете наступну помилку org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Для налаштування процесу вставки я підійшов би до проблеми, виконуючи наступні кроки:

  • Пам'ятайте, що кількість розділів важливо. Перевірте кількість розділів, а потім відрегулюйте його залежно від кількості паралельного з'єднання, яке ви хочете мати. Можливо, ви хочете мати одне підключення на розділ, тому я б запропонував перевірити coalesce, як згадується тут .
  • Перевірте максимальну кількість з'єднань, які підтримує ваш екземпляр postgreSQL, і ви хочете збільшити кількість .
  • Для вставки даних у PostgreSQL рекомендується використовувати команду COPY . Ось також більш детальна відповідь про те, як пришвидшити вставку postgreSQL.

Нарешті, немає жодної срібної кулі, яка б виконувала цю роботу. Ви можете використовувати всі поради, які я згадував вище, але це дійсно залежить від ваших даних та випадків використання.


Dbustosp Я обов'язково спробую перераховані вище поради, до цього часу ви точно заслужите нагороду.
Chetan_Vasudevan

@chetan_vasudevan, якщо ви надаєте більш детальну інформацію про використовувані вами дані, розмір на запис тощо. Якщо дані є загальнодоступними, я можу спробувати щось самостійно та порівняти час.
dbustosp

Дані Dbustosp мають 80 стовпців і 55 мільйонів записів. Я почав працювати над пропозиціями, які ви мені дали.
Chetan_Vasudevan

@Chetan_Vasudevan Загальний розмір набору даних? Який формат вхідних даних?
dbustosp

@Chetan_Vasudevan Будь-яке оновлення?
dbustosp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.