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 HadoopRDD
konstruuje 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, wordsRDD
który zawiera odniesienie testFile
i 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, flatMap
funkcja 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 count
zostanie obliczony, wszystko w pamięci - jeśli dane mieszczą się w pamięci.
cache
jest 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 cache
instrukcji 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 cache
mówi się, że „przerywa linię”, ponieważ tworzy punkt kontrolny, który można ponownie wykorzystać do dalszego przetwarzania.
Praktyczna zasada: użyj, cache
gdy linia rodowa twojego RDD rozgałęzia się lub gdy RDD jest używany wiele razy, jak w pętli.