Как я могу увидеть несколько запросов, которые генерируются для параллельного чтения данных для каждого раздела из базы данных с использованием искры

Я пытаюсь прочитать данные из таблицы Postgres с помощью Spark. Изначально я читал данные в одном потоке без использования lowerBound, upperBound, partitionColumn и numPartitions. Данные, которые я читаю, огромны, около 120 миллионов записей. Поэтому я решил читать данные параллельно, используя partitionColumn. Я могу читать данные, но чтение их 12 параллельными потоками занимает больше времени, чем одним потоком. Я не могу понять, как я могу увидеть 12 SQL-запросов, которые генерируются для параллельного извлечения данных для каждого раздела.

Код, который я использую:

val query = s"(select * from db.testtable) as testquery" 
val df = spark.read
    .format("jdbc")
    .option("url", jdbcurl)
    .option("dbtable", query)
    .option("partitionColumn","transactionbegin")
    .option("numPartitions",12) 
    .option("driver", "org.postgresql.Driver")
    .option("fetchsize", 50000)  
    .option("user","user")
    .option("password", "password")
    .option("lowerBound","2019-01-01 00:00:00")
    .option("upperBound","2019-12-31 23:59:00")
    .load
df.count()

Где и как я могу увидеть 12 параллельных запросов, которые создаются для параллельного чтения данных в каждом потоке?
Я вижу, что в пользовательском интерфейсе Spark создается 12 задач, но не могу найти способ увидеть, какие отдельные 12 запросов генерируются для параллельного извлечения данных из таблицы Postgres.

Можно ли каким-либо образом опустить фильтр, чтобы он считывал данные только за этот год, в данном случае за 2019 год.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
513
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это не совсем несколько запросов, но на самом деле он покажет план выполнения, оптимизированный Spark на основе ваших запросов. Это может быть не идеально в зависимости от этапов, которые вам нужно выполнить.

Вы можете написать свой даг в виде DataFrame, и перед фактическим вызовом действия вы можете использовать для него метод explain(). Читать ее может быть сложно, но она перевернута. Источник находится внизу, пока читаешь это. Это может показаться немного необычным, если вы попытаетесь читать, поэтому начните с базовых преобразований и продвигайтесь шаг за шагом, если вы читаете впервые.

какое объяснение даст. он просто указывает план, но не дает дополнительной информации о запросах. Я хотел знать, почему при параллельном чтении требуется больше времени, а при чтении в одном потоке - меньше времени.

Nikunj Kakadiya 14.12.2020 13:40

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

Piyush Patel 14.12.2020 17:37
Ответ принят как подходящий

Оператор SQL печатается с использованием уровня журнала «info», см. здесь . Вам нужно изменить уровень журнала Spark на «информация», чтобы увидеть SQL. Кроме того, он напечатал только условие where , как и здесь. Вы также можете просмотреть SQL в своей базе данных Postgresql, используя представление pg_stat_statements, которое требует установки отдельного плагина. Есть способ зарегистрировать SQL-запросы и просмотреть их, как , упомянутое здесь .

Я подозреваю, что параллелизм для вас медленный, потому что в столбце «transactionbegin» вашей таблицы нет индекса. partitionColumn должен быть проиндексирован, иначе он будет сканировать всю таблицу во всех этих параллельных сеансах, которые задохнутся.

Спасибо за ответ @Salim. На самом деле я сам выяснил, что некоторые из них связаны с pg_stat_statements, но все же то, что вы упомянули, похоже на то, для чего я искал информацию. Я обязательно попробую.

Nikunj Kakadiya 20.01.2021 05:41

Другие вопросы по теме