16 июня 2022 года вышла новая версия Apache Spark – 3.3.0. Разбираем главные фичи этого минорного релиза, особенно важные для дата-инженера и разработчика распределенных приложений: от расширения поддержки ANSI SQL до профилирования UDF на Python.
Главные изменения Apache Spark 3.3.0
Apache Spark 3.3.0 — это четвертый релиз линейки 3.x, в котором решено более 1600 запросов Jira на исправление ошибок, внесение улучшений и добавление новых фич. В частности, в этом выпуске улучшена производительность SQL-запросов c JOIN за счет фильтров Блума, расширен охват API Pandas, включая поддержку популярных функций этой Python-библиотеки, например, datetime.timedelta и merge_asof, упрощена миграция из традиционных хранилищ данных за счет улучшения соответствия стандарту ANSI SQL и поддержки десятков новых встроенных функций. Также повышена производительность разработки распределенных приложений благодаря улучшенной обработке ошибок, автодополнению, и профилированию данных.
Наиболее важными изменениями этого релиза можно назвать следующие:
- Фильтрация среды выполнения на уровне строк для повышения производительности соединений больших таблиц за счет уменьшения объема перемешиваемых данных. Row-level Runtime Filtering используется при появлении широковещательного соединения, генерирует динамический фильтр на основе меньшей части данных и передает его в источник данных.
- Усовершенствования ANSI для соответствия стандарту ANSI SQL. Это специальный режим для Spark SQL, который меняет диалект с Hive на совместимый с ANSI. Если для параметра sql.ansi.enabled установлено значение true, будет использоваться диалект, совместимый с ANSI, а не Hive. Поэтому теперь Spark SQL будет создавать исключения во время выполнения для недопустимых операций, включая ошибки целочисленного переполнения, синтаксического анализа строк и пр. фреймворк будет использовать различные типы правил принуждения для разрешения конфликтов между типами данных с учетом их приоритете.
- Поддержка сложных типов для векторизованного считывателя Parquet, который ускоряет декодирование файла. Он используется по умолчанию для чтения Parquet-файлов и может быть изменен с помощью свойства sql.parquet.enableVectorizedReader. Чтобы включить сложные типы, нужно изменить значение параметра spark.sql.parquet.enableNestedColumnVectorizedReader на true. Это ускорит чтение Parquet-файлов с вложенными типами столбцов, такими как структура, массив и пр.
- Поддержка метаданных скрытых файлов для Spark SQL через новый интерфейс, который позволяет пользователям запрашивать метаданные входных файлов для всех форматов файлов и отображать их как встроенные скрытые столбцы. Теперь пользователи могут видеть эти метаданные только тогда, когда явно ссылаются на них, например, в указании пути к файлу или его имени.
- Профилировщик для пользовательских функций Python. В PySpark уже было профилирование, но только для RDD. Начиная с версии 3.3.0 можно использовать его в UDF. Профилирование не включено по умолчанию, поэтому следует установить для параметра python.profile значение true.
- Представление Trigger.AvailableNow для выполнения потоковых запросов в нескольких пакетах. Параметр триггера описывает время обработки потоковых данных, будет ли запрос выполняться как микропакетный запрос с фиксированным пакетным интервалом или как запрос непрерывной обработки. Ранее потоковые запросы с Once всегда загружали все доступные данные в одном пакете. Но объем данных, которые могут обрабатывать запросы, ограничен, чтобы предотвратить OOM-ошибку на драйвере. Из-за этого был введен новый триггер под названием TRigger.AvailableNow.
- Расширенные возможности push-down в DataSource V2 (DSV2) – механизме Spark SQL для доступа к данным из внешних источников. Помимо простого извлечения данных, он предлагает оптимизацию для ускорения передачи путем делегирования агрегатов самому источнику данных, сокращая сетевой ввод-вывод. Начиная с версии 3.3.0 доступны дополнительные возможности фильтрации, такие как push down top N к источнику данных JDBC V2, поддержка частичного агрегирования AVG и полной агрегированной загрузки DS V2.
- Поддержка Executor Rolling и настраиваемых планировщиков Kubernetes. Spark в Kubernetes поддерживается, начиная с релиза 2.3 в 2017 году, а в 2021 году он получил статус общей доступности в версии 3.1.1. Сегодня производственные Spark-приложения очень часто разворачиваются в Kubernetes, который становится важным бэкендом управления ресурсами. С ростом количества заданий нужна возможность их расширенного планирования, организации очереди ресурсов, групповое планирование и пр. Ранее планировщик Kubernetes по умолчанию поддерживал только планирование на основе подов и не мог обеспечивать планирование на основе заданий для Spark-приложений. В версии 3.3.0 пользователи могут гибко настраивать планировщики Kubernetes.
- Наконец, для улучшения информационной безопасности и ухода от рисков критической уязвимости библиотеки log4j 1, о чем мы писали здесь, выполнена миграция на 2-ю версию этого компонента логирования.
Читайте в нашей новой статье о том, как разработчики Databrics хотят улучшить Spark Structured Streaming в рамках нового проекта Lightspeed. А освоить администрирование и использование Apache Spark для задач дата-инженерии, разработки распределенных приложений и аналитики больших данных вам помогут специализированные курсы в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark
- Машинное обучение в Apache Spark
- Графовые алгоритмы в Apache Spark
Источники