как Spark обрабатывает больше памяти, чем ее емкость - PullRequest
0 голосов
/ 13 июля 2020

Допустим, у моего кластера Spark есть 100G память, во время процесса вычислений Spark создается больше данных (новые фреймы данных, кеши) размером 200G. В этом случае Spark сохранит часть этих данных на Диске или просто OOM?

1 Ответ

1 голос
/ 13 июля 2020

Spark начинает считывать данные только при вызове действия (например, count, collect or write). После вызова действия Spark загружает данные в разделы - количество одновременно загружаемых разделов зависит от количества доступных ядер. Таким образом, в Spark вы можете думать о 1 partition = 1 core = 1 task.

Если вы не применяете преобразование, а делаете, например, count, Spark по-прежнему будет читать данные в разделах, но не будет хранить данные в ваш кластер, и если вы снова выполните count, он снова прочитает все данные. Чтобы избежать чтения данных несколько раз, вы можете вызвать cache или persist, и в этом случае Spark попытается сохранить данные в вашем кластере. В кеше (который совпадает с persist (StorageLevel.MEMORY_ONLY) он будет хранить все разделы в памяти - если он не помещается в памяти, вы получите OOM. Если вы вызовете persist (StorageLevel.MEMORY_AND_DISK), он сохранит столько же как можно в памяти, а остальное будет помещено на диск. Если данные не помещаются на диск, либо ОС обычно убивает ваших рабочих.

В Apache Spark, если данные не помещаются в памяти, то Spark просто сохраняет эти данные на диске. Операторы Spark переносят данные на диск, если они не помещаются в памяти, что позволяет ему хорошо работать с данными любого размера. Аналогичным образом, кэшированные наборы данных, которые не помещаются в памяти, либо переносятся на диск, либо пересчитывается «на лету», когда это необходимо, в соответствии с уровнем хранения RDD. Метод persist в Apache Spark обеспечивает шесть уровней постоянного хранения для сохранения данных.

MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER 
(Java and Scala), MEMORY_AND_DISK_SER 
(Java and Scala), DISK_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK_2, OFF_HEAP.

Хранилище OFF_HEAP находится в стадии экспериментов.

...