Если я кеширую Spark Dataframe, а затем перезаписываю ссылку, будет ли сохраняться исходный фрейм данных? - PullRequest
0 голосов
/ 17 февраля 2020

Предположим, у меня была функция для генерирования (py) фрейма данных искры, кэширующего фрейм данных в память в качестве последней операции.

def gen_func(inputs):
   df = ... do stuff...
   df.cache()
   df.count()
   return df

В моем понимании кэширование Spark работает следующим образом:

  1. Когда cache/persist плюс действие (count()) вызывается для фрейма данных, он вычисляется из его DAG и кэшируется в памяти, прикрепляется к объекту, который ссылается на него.
  2. Пока существует ссылка на этот объект, возможно, внутри других функций / других областей, df будет продолжать кэшироваться, и все группы DAG, зависящие от df, будут использовать кэшированные данные в памяти как начальная точка.
  3. Если все ссылки на 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 будет вычислять все с нуля, несмотря на то, что он был сгенерирован из ранее кэшированного фрейма данных?

Я спрашиваю об этом, потому что недавно я исправлял некоторые проблемы нехватки памяти с моим кодом, и мне кажется, что кеширование может быть проблемой. Тем не менее, я не совсем понимаю все детали того, что является безопасным способом использования кэша, и как можно случайно сделать недействительной свою кэшированную память. Чего не хватает в моем понимании? Я отклоняюсь от лучшей практики в выполнении вышеупомянутого? Спасибо!

...