Устройство приложения Spark: драйвер, исполнители, джобы, стадии и задачи
Приложение Spark состоит из драйвера и исполнителей. Драйвер выполняет ваш Python-код, строит план и раздаёт работу; исполнители — процессы на узлах кластера, которые эту работу делают и держат данные в памяти. Работа разбита на три уровня. Джоб создаётся каждым действием (count, write, collect) — одно действие, один джоб. Джоб делится на стадии по границам shuffle: всё, что можно сделать без перемешивания данных между узлами, попадает в одну стадию. Стадия состоит из задач — по одной на партицию, и именно задача является единицей планирования: количество задач в стадии равно количеству партиций, а параллелизм ограничен суммарным числом ядер исполнителей. Отсюда практические выводы: драйвер — узкое место и единая точка отказа, поэтому на нём не должно быть тяжёлых вычислений; а если партиций меньше, чем ядер, часть кластера простаивает.