Комментарии 3
@SacredDiablo, спасибо за статью! Показалось, что не раскрыты понятия "Гибкое определение" и "предрасчет".
Как я понял, Гибкое определение + repartition это об этом:
// Получение списка файлов и определение конфигурации
// Определение объема данных
val perfectBlockSize = 256 * 1024 * 1024
val repartitionCount = tableSize / perfectBlockSize
но информацию про остальные столбцы на этом изображении я не увидел:

Привет!
Да, это действительно не вошло в статью - слишком много кода в статье начинают путать =) Подробнее есть в коде на git (ссылка есть в статье, но я только сейчас понял, что она сливается с текстом) - https://github.com/SacredDiabloPub/highload2024/blob/master/src/main/scala/GroupFunction.scala
Гибкое определение (которое дальше уже называется автоопределение, т.к. появилась функция. которая позволяет определять размеры блоков) - это когда в начале каждого расчёта мы смотрим на объём данных, который у нас будет и исходя из этого задаём конфигурацию для spark. В случае с предрасчётом - мы во время тестов смотрим данные, с помощью той же функции определяем подходящие параметры, усредняем их и хардкодим.
Вся разница между гибким определением и гибким определением + repartition в том, что мы дополнительно заставляем данные перемешаться, что вызывает накладные расходы на перемещение между экзекьюторами. Это может быть полезно в определённых ситуациях - но чаще всего достаточно правильно подобрать размеры блоков для чтения.
Оптимизация Spark-приложений: шаг за шагом от базовых техник до продвинутых приёмов