Перекос данных: как обнаружить и чем лечить
Перекос — ситуация, когда одна партиция после shuffle оказывается во много раз больше остальных: 199 задач заканчиваются за минуту, а двухсотая работает час и потом падает с OOM. Причина всегда одна — неравномерное распределение ключа: NULL вместо идентификатора, технический аккаунт с миллионом событий, страна, дающая 80% трафика. Обнаруживается это в Spark UI на вкладке Stages: в сводке по задачам максимум сильно отличается от медианы по времени и по объёму прочитанного shuffle. Лечится по возрастанию сложности: AQE с spark.sql.adaptive.skewJoin.enabled умеет разбивать перекошенные партиции сам и решает большинство случаев; broadcast убирает shuffle целиком, если вторая сторона мала; изоляция проблемных ключей — обработать NULL и топ-ключи отдельно; и, наконец, соление — добавление случайного суффикса к ключу с последующей двухшаговой агрегацией, когда всё остальное не помогло.