После прочтения некоторых онлайн-форумов и вопросов о переполнении стека я понял следующее:
Разлив данных происходит, когда исполнителю не хватает памяти.И случайный разлив (память) - это размер десериализованной формы данных в памяти в тот момент, когда мы их разлили.
Я запускаю искру локально, и я установил память искрового драйвера на 10g
.
Если мое понимание верно, то если для операции groupBy
требуется больше, чем 10GB
памяти выполнения, она должна пролить данные на диск.
Предположим, что операция groupBy
требуется 12GB
памяти, так как память драйвера установлена на 10GB
, она должна пролить почти 2GB
данных на диск, поэтому Shuffle Spill (Disk) должен быть 2GB, а Shuffle spill (memory) должен быть развернут, что составляет 10GB, потому чтослучайный разлив (память) - это размер данных в памяти во время разлива.
Если мое понимание верно, то Shuffle spill (memory) <= Executor memory
.В моем случае это память драйвера, так как я запускаю искру локально.
Но похоже, что я что-то упустил, ниже приведены значения из spark ui.
Total Time Across All Tasks: 41 min
Locality Level Summary: Process local: 45
Input Size / Records: 1428.1 MB / 42783987
Shuffle Write: 3.8 GB / 23391365
Shuffle Spill (Memory): 26.7 GB
Shuffle Spill (Disk): 2.1 GB
Даже если я установилпамяти искрового драйвера до 10g
, как может быть разлив памяти больше, чем память, выделенная для драйвера.
Я наблюдал, как потребление памяти в диспетчере задач Windows никогда не превышало 10.5GB
во время выполнения задания, тогда какВозможно, Shuffle Spill (Memory) составляет 26,7 ГБ.
DAG:
Хронология событий: 45 задач из-за 45 разделов для4,25 ГБ данных.
Вот код, который я пытаюсь запустить , который является решением для моей предыдущей проблемы .