Я думаю, що питання краще сформулювати так:
Коли нам потрібно викликати кеш або зберегти 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 використовується кілька разів, як у циклі.