Myślę, że pytanie byłoby lepiej sformułowane jako:
Kiedy musimy wywołać pamięć podręczną lub utrwalić na RDD?
Procesy Spark są leniwe, to znaczy nic się nie wydarzy, dopóki nie będzie to wymagane. Aby szybko odpowiedzieć na pytanie, po val textFile = sc.textFile("/user/emp.txt")wydaniu danych nic się nie dzieje, tylko HadoopRDDkonstruuje się plik, wykorzystując plik jako źródło.
Powiedzmy, że trochę przekształcamy te dane:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Znowu nic się nie dzieje z danymi. Teraz jest nowy RDD, wordsRDDktóry zawiera odniesienie testFilei funkcję do zastosowania w razie potrzeby.
Tylko wtedy, gdy akcja jest wywoływana na RDD, jak wordsRDD.countłańcuch RDD, nazywany rodowodem, zostanie wykonany. Oznacza to, że dane podzielone na partycje zostaną załadowane przez moduły wykonawcze klastra Spark, flatMapfunkcja zostanie zastosowana, a wynik zostanie obliczony.
Linii liniowej, takiej jak w tym przykładzie, cache()nie potrzeba. Dane zostaną załadowane do executorów, wszystkie transformacje zostaną zastosowane i na koniec countzostanie obliczony, wszystko w pamięci - jeśli dane mieszczą się w pamięci.
cachejest przydatne, gdy linia rodowa RDD się rozgałęzia. Powiedzmy, że chcesz przefiltrować słowa z poprzedniego przykładu do liczby słów pozytywnych i negatywnych. Możesz zrobić to tak:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Tutaj każda gałąź ponownie ładuje dane. Dodanie wyraźnej cacheinstrukcji zapewni, że przetwarzanie wykonane wcześniej zostanie zachowane i ponownie użyte. Praca będzie wyglądać następująco:
val textFile = sc.textFile("/user/emp.txt")
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
wordsRDD.cache()
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Z tego powodu cachemówi się, że „przerywa linię”, ponieważ tworzy punkt kontrolny, który można ponownie wykorzystać do dalszego przetwarzania.
Praktyczna zasada: użyj, cachegdy linia rodowa twojego RDD rozgałęzia się lub gdy RDD jest używany wiele razy, jak w pętli.