Сколько подключений к базе данных из Spark при записи фрейма данных?

Я не понимаю, сколько подключений к базе данных будет выполнено Spark в следующем сценарии:

Допустим, у меня есть программа Spark, которая работает только на одном рабочем узле с одним исполнителем, а количество разделов в кадре данных равно 10. Я хочу записать этот кадр данных в Teradata. Поскольку уровень параллелизма равен 10, а исполнитель только 1, будет ли выполнено 10 соединений при сохранении данных или только 1 соединение?


person amit kumar    schedule 04.11.2020    source источник


Ответы (2)


Начиная со Spark 2.2, параметр numPartitions, указанный для источника данных JDBC, также используется для управления его поведением при записи (в дополнение к предыдущей цели установки уровня параллелизма во время чтения). Из документов Spark:

numPartitions
Максимальное количество разделов, которые можно использовать для параллелизма при чтении и записи таблицы. Это также определяет максимальное количество одновременных подключений JDBC. Если количество разделов для записи превышает этот предел, мы уменьшаем его до этого предела, вызывая объединение (numPartitions) перед записью.

person mazaneicha    schedule 04.11.2020
comment
Спасибо @mazaneicha. Я тоже думал в том же духе, но после того, как недавно столкнулся со странной ситуацией, запутался, правильно ли я понял. При чтении из таблицы Hive и последующей записи в Teradata было создано несколько сеансов блокировки без записи данных. Затем, после уменьшения количества рабочих узлов до 1, удалось без проблем записать несколько тысяч записей. Но с миллионом записей он начал давать сбой из-за взаимоблокировки. Затем, после уменьшения разделов до 1 с помощью объединения (1), загрузка прошла нормально. - person amit kumar; 05.11.2020
comment
Итак, вопрос: если предположить, что Teradata не поддерживает одновременную запись, как данные записывались после уменьшения рабочего до 1, потому что в этом случае также было установлено n соединений на основе n разделов. Во-вторых, при уменьшении раздела до 1 большой набор данных (~ 2 миллиона строк) также был записан без проблем. Поэтому, если одновременная запись является проблемой, предыдущий вариант использования также должен был дать сбой. - person amit kumar; 05.11.2020
comment
Не уверен, возможно, один узел (исполнитель) выполняет задачи (записывает разделы) последовательно? Это будет иметь место, если у вас есть 1 ядро ​​​​на исполнителя. Но я бы начал с проверки конфигурации Teradata на наличие ограничений на количество клиентских подключений. И брандмауэр тоже, если он есть... - person mazaneicha; 05.11.2020

это зависит от вашего решения spark-› teradata.

в общем у вас будет 1 соединение на ядро. каждое ядро ​​перебирает собственные разделы 1 на 1.

например, если вы используете .foreach с пользовательским решением, у вас будет 1 соединение одновременно для 1 строки.

если вы используете foreachPartition с пользовательским решением, у вас будет 1 соединение для многих строк.

person maxime G    schedule 04.11.2020
comment
Привет, @maxime-g, понял. Я понимаю, что количество разделов равно количеству ядер. Пожалуйста, поправьте меня, если я ошибаюсь. Но я не использую foreach/foreachPartition и на самом деле использую Spark JDBC, как здесь spark.apache.org/docs/latest/sql-data-sources-jdbc.html - person amit kumar; 05.11.2020