Динамическое партиционирование в Apache Spark

курсы Apache Spark SQL для инженеров данных и разработчиков, разработка Spark, Apache Spark SQL для разработчиков, Spark SQL инженерия больших данных, обучение разработчиков Apache Spark, Школа Больших Данных Учебный Центр Коммерсант

В этой статье для дата-инженеров и разработчиков распределенных приложений рассмотрим, что такое динамическое партиционирование таблиц в Apache Spark, зачем это нужно и как реализовать такие вставки разделов. Разбираем на практическом примере.

Что такое динамическое партиционирование в Apache Spark

Партиционирование – это разделение данных на основе значения столбца и их сохранение в разных разделах или папках. Этот механизм позволяет оптимизировать производительность задания, обеспечив равномерное распределение рабочих нагрузок между исполнителями Spark. Благодаря партиционированию Spark SQL может загружать только те разделы, которые действительно необходимы, избегая фильтрации ненужных данных на JVM. Это ускоряет загрузку и повышает эффективность утилизации памяти, улучшая общую производительность распределенного приложения. Также с партиционированным набором данных Spark SQL может одновременно выполняться в разных каталогах. Про лучшие практики разделения данных мы подробно рассказывали здесь и здесь.

Однако, природа данных часто бывает изменчива, а это значит, что на практике возникает потребность переопределять ранее указанные разделы. В частности, дата-инженеру часто требуется запускать ежедневную загрузку или ETL-конвейер для загрузки данных в HDFS. Например, если данные изначально разделены по дате, то в этом случае возникнут обновленные или дополнительные записи, относящиеся к предыдущим датам. С технической точки зрения, это будет операция вставки и обновления (UPSERT) в существующие разделы и загрузка данных текущей даты в новый раздел. Чтобы выполнить это, нужно обновить режим переопределения разделов Spark. Это делается изменением следующей конфигурации:

spark.conf.set(«spark.sql.sources.partitionOverwriteMode»,»dynamic»)

Анализ данных с Apache Spark

Код курса
SPARK
Ближайшая дата курса
13 мая, 2024
Продолжительность
32 ак.часов
Стоимость обучения
96 000 руб.

Таким образом, даже при невозможности обновлять отдельные записи в HDFS, можно обновить нужные разделы. Но для этого необходимо иметь полные данные в разделе, который будет перезаписан в памяти. Это обеспечит выполнение функции Spark SQL, которая реализует SQL-операторы INSERT OVERWRITE TABLE над партиционированными отношениями HadoopFsRelations, ограничивая удаление разделов для перезаписи партиционированной таблицы и ее разделов новыми данными.

Можно сказать, что динамические разделы — это столбцы разделов, значения которых не определены явно в предложении PARTITION операторов SQL INSERT OVERWRITE TABLE в части partitionSpec. А статические разделы — это столбцы разделов, значения которых определены явно в предложении PARTITION операторов SQL INSERT OVERWRITE TABLE в части partitionSpec.

Динамические вставки разделов поддерживаются только в режиме SQL для операторов SQL INSERT OVERWRITE TABLE и не поддерживаются для нефайловых источников данных, например InsertableRelations. Важно, что при динамической вставке разделов поведение ключевого слова OVERWRITE управляется свойством конфигурации spark.sql.sources.partitionOverwriteMode, которая по умолчанию установлена в статический режим. Это свойство определяет, должен ли Spark удалять все разделы, соответствующие спецификации раздела, независимо от того, есть ли данные для записи или нет (статическое партиционирование), или удалять только те разделы, в которые будут записаны данные (динамическое партиционирование). Если режим динамической перезаписи включен, Spark удалит только те разделы, для которых есть данные для записи. А все остальные разделы остаются нетронутыми.

В заключение рассмотрим пример партиционированной таблицы с одним разделом по столбцу p1:

spark.range(10)
  .withColumn("p1", 'id % 2)
  .write
  .mode("overwrite")
  .partitionBy("p1")
  .saveAsTable("partitioned_table")

Динамическое разделение по столбцу даты задается следующим образом:

INSERT OVERWRITE TABLE stats
PARTITION(country = 'RF', year = 2022, month = 8, day)
SELECT ad, SUM(impressions), SUM(clicks), log_day
FROM impression_logs
GROUP BY ad;

Core Spark - основы для разработчиков

Код курса
CORS
Ближайшая дата курса
13 мая, 2024
Продолжительность
16 ак.часов
Стоимость обучения
48 000 руб.

Узнайте больше про администрирование и использование Apache Spark для задач дата-инженерии, разработки распределенных приложений и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://medium.com/@tharun026/dynamic-partition-upsert-spark-1ff1a1025813
  2. https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-dynamic-partition-inserts.html
Поиск по сайту