Я думаю, що питання краще сформулювати так:
Коли нам потрібно викликати кеш або зберегти RDD?
Іскрові процеси ледачі, тобто нічого не відбудеться, поки цього не потрібно. Для швидкої відповіді на запитання після val textFile = sc.textFile("/user/emp.txt")видачі даних нічого не відбувається, лише a HadoopRDDпобудовано, використовуючи файл як джерело.
Скажімо, ми трохи перетворимо ці дані:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Знову ж таки, нічого не трапляється з даними. Тепер з'явився новий RDD, wordsRDDякий містить посилання testFileта функцію, яку потрібно застосувати за потреби.
Тільки тоді, коли буде викликана дія на RDD, наприклад wordsRDD.count, ланцюг RDD, який називається lineage, буде виконуватися. Тобто дані, розбиті на розділи, будуть завантажені виконавцями кластера Spark, flatMapфункція буде застосована і результат буде обчислений.
На лінійній лінії, як у цьому прикладі, cache()вона не потрібна. Дані будуть завантажені виконавцями, всі перетворення будуть застосовані і, нарешті, countбуде обчислено, все в пам'яті - якщо дані вмістяться в пам'яті.
cacheє корисним, коли родовід RDD розгалужується. Скажімо, ви хочете відфільтрувати слова попереднього прикладу в кількість позитивних і негативних слів. Ви можете зробити це так:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Тут кожна гілка випускає перезавантаження даних. Додавання явного cacheтвердження забезпечить збереження та повторне використання попередньо обробленої обробки. Робота буде виглядати приблизно так:
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()
З цієї причини, cacheяк кажуть, "порушується лінія", оскільки вона створює контрольну точку, яку можна повторно використовувати для подальшої обробки.
Правило великого пальця: використовуйте, cacheколи лінія вашого RDD розгалужується або коли RDD використовується кілька разів, як у циклі.