Предположим, у меня была функция для генерирования (py) фрейма данных искры, кэширующего фрейм данных в память в качестве последней операции.
def gen_func(inputs):
df = ... do stuff...
df.cache()
df.count()
return df
В моем понимании кэширование Spark работает следующим образом:
- Когда
cache/persist
плюс действие (count()
) вызывается для фрейма данных, он вычисляется из его DAG и кэшируется в памяти, прикрепляется к объекту, который ссылается на него. - Пока существует ссылка на этот объект, возможно, внутри других функций / других областей, df будет продолжать кэшироваться, и все группы DAG, зависящие от df, будут использовать кэшированные данные в памяти как начальная точка.
- Если все ссылки на df удалены, Spark создает кеш как память для сбора мусора. Он может не собираться мусором немедленно, вызывая некоторые кратковременные блоки памяти (и, в частности, утечки памяти, если вы генерируете кэшированные данные и выбрасываете их слишком быстро), но в конечном итоге он будет очищен.
Мой вопрос: предположим, я использую gen_func
для генерации фрейма данных, но затем перезаписываю исходную ссылку на фрейм данных (возможно, с filter
или withColumn
).
df=gen_func(inputs)
df=df.filter("some_col = some_val")
In Насколько я понимаю, RDD / DF в Spark неизменны, поэтому переназначенный df после фильтра и df перед фильтром относятся к двум совершенно различным объектам. В этом случае ссылка на исходный df, который был cache/counted
, была перезаписана. Означает ли это, что кэшированный фрейм данных больше недоступен и будет собирать мусор? Означает ли это, что новый постфильтр df
будет вычислять все с нуля, несмотря на то, что он был сгенерирован из ранее кэшированного фрейма данных?
Я спрашиваю об этом, потому что недавно я исправлял некоторые проблемы нехватки памяти с моим кодом, и мне кажется, что кеширование может быть проблемой. Тем не менее, я не совсем понимаю все детали того, что является безопасным способом использования кэша, и как можно случайно сделать недействительной свою кэшированную память. Чего не хватает в моем понимании? Я отклоняюсь от лучшей практики в выполнении вышеупомянутого? Спасибо!