Оптимизация преобразований

Используйте следующие стратегии оптимизации производительности для операций преобразования в потоках данных сопоставления в Фабрике данных Azure и конвейерах Azure Synapse Analytics.

Оптимизация операций соединения, проверки существования и поиска

Трансляции

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

Если размер транслируемых данных слишком велик для узла Spark, может возникнуть ошибка из-за нехватки памяти. Чтобы избежать ошибок из-за нехватки памяти, используйте оптимизированные для операций в памяти кластеры. Если во время выполнения потока данных возникают ошибки из-за превышения времени ожидания трансляции, то можно отключить оптимизацию трансляции. Однако это приведет к более медленному выполнению потоков данных.

При работе с источниками данных, для выполнения запросов к которым может требоваться больше времени (например, это могут быть запросы к большим базам данных), рекомендуется отключить трансляцию для операций соединения. Источник, запросы к которому выполняются долго, может привести к превышению времени ожидания Spark, когда кластер пытается транслировать данные на вычисленные узлы. Еще одна ситуация, в которой стоит отключить трансляцию, — когда в потоке данных есть поток, который агрегирует значения, используемые в последующем преобразовании поиска. Такой сценарий может запутать оптимизатор Spark и привести к превышению времени ожидания.

Оптимизация преобразования

Перекрестные с соединения

Если вы используете литеральные значения в условиях соединения или у обеих сторон соединения имеется несколько совпадений, то Spark выполнит это соединение как перекрестное. Перекрестное соединение — это полное декартово произведение, после которого соединенные значения отфильтровываются. Это значительно медленнее, чем другие типы соединения. Убедитесь, что в условиях соединения обеих сторон указаны ссылки на столбцы, чтобы избежать снижения производительности.

Сортировка перед соединением

В отличие от таких инструментов, как SQL Server Integration Services, преобразование "Соединение" необязательно является операцией соединения слиянием. Перед преобразованием не требуется выполнять сортировку по ключам соединения. Использование преобразований сортировки в потоках данных для сопоставления не рекомендуется.

Производительность преобразования окна

Преобразование окна в потоке данных для сопоставления секционирует данные по значению в столбцах, выбранных для предложения over() в параметрах преобразования. Существует ряд очень популярных статистических и аналитических функций, доступных для преобразования окна. Однако если ваш вариант использования предназначен для создания окна по всему набору данных с целью ранжирования rank() или нумерации строк rowNumber(), рекомендуется вместо этого использовать преобразование ранга и преобразование суррогатного ключа. Эти преобразования эффективнее оперируют полными наборами данных с помощью данных функций.

Повторное секционирование неравномерно распределенных данных

Некоторые преобразования, такие как соединение и агрегирование, перемешивают секции данных в случайном порядке и иногда могут приводить к неравномерному распределению данных. Неравномерное распределение означает, что данные неравномерно распределены по секциям. Очень неравномерное распределение данных может привести к замедлению нисходящих операций преобразования и записи в приемники. Можно проверить асимметрию данных в любой точке выполнения потока данных, щелкнув преобразование на экране мониторинга.

Асимметрия и эксцесс

На экране мониторинга отобразится распределение данных по каждой секции, а также две метрики, "Асимметрия" и "Эксцесс". Асимметрия — это мера того, насколько асимметричны данные. Этот показатель может иметь положительное, нулевое, отрицательное или неопределенное значение. Отрицательная асимметрия означает, что левый "хвост" длиннее правого. Эксцесс — это мера того, распределены ли данные с медленно или быстро убывающим "хвостом". Высокие значения эксцесса нежелательны. Оптимальные диапазоны асимметрии находятся между –3 и 3, а диапазоны эксцесса не должны превышать 10. Чтобы проще интерпретировать эти числа, взгляните на диаграмму секций и проверьте, нет ли там отдельного столбца, который значительно больше остальных.

Если после преобразования ваши данные секционированы неравномерно, можно использовать вкладку "Оптимизация" для повторного секционирования. Перемешивание данных в случайном порядке занимает некоторое время и может не повысить производительность потока данных.

Совет

Если вам нужно повторно секционировать данные, но имеются нисходящие преобразования, которые перемешивают данные в случайном порядке, то следует использовать хэш-секционирование по столбцу, используемому в качестве ключа соединения.

Примечание

Преобразования внутри потока данных (за исключением преобразования приемника) не изменяют секционирование файлов и папок неактивных данных. Секционирование в каждом преобразовании перераспределяет данные в кадрах данных временного бессерверного кластера Spark, которым управляет ADF для каждого выполнения потока данных.

Дальнейшие действия

Ознакомьтесь с другими статьями о производительности потоков данных.