Я думаю, что это, вероятно, неправильное использование персистентной операции.Persist используется для хранения всего rdd-содержимого в заданном месте, по умолчанию в памяти.Ваш rdd - это файл размером 50 ГБ, и он не помещается в память.StorageLevel.DISK_ONLY скопирует ваш файл во временную папку искры.Таким образом, ваш файл существует в двух экземплярах на диске без дополнительного значения.
1: rdd = sc.textFile('file:///myBigFile.xml')
2: small_rdd = heavy_computation(rdd).persist()
3: rdd1 = more_heavy_computation(small_rdd)
4: rdd2 = more_heavy_computation(small_rdd)
В этом примере промежуточный результат (2 :) сохраняется функцией persist () в памяти.Я предполагаю, что промежуточный результат был очень дорогим для вычисления (тяжелым при использовании процессора в течение большого количества времени) и помещается в память.Вам нужен результат дважды (3: / 4 :).Без использования постоянных строк 3 и 4 будет произведен перерасчет heavy_computation.Использование persist () heavy_computation выполняется один раз, а промежуточный результат используется для 3 + 4.
ПРИМЕЧАНИЕ. Если вычисление промежуточного результата было очень дорогим, но не умещалось в памяти, альтернативой является DISK_ONLY.Например, для вычисления промежуточного результата потребовался целый день, было бы лучше сохранить его на диск, чем вычислять его во второй раз.
Обратите внимание, что spark работает лениво.Приведенный выше пример не заметит, что процессор будет работать при добавлении этого:
6: rdd1.show()
7: rdd2.show()
Операции, такие как show / save / write / ... позволяет свече начать вычисление.
rdd = sc.textFile('file:///myBigFile.xml')
rdd.take(60).show()
Это будетбегите быстро и не должны исчерпывать память.