Saya pikir pertanyaannya akan dirumuskan sebagai:
Kapan kita perlu memanggil cache atau tetap menggunakan RDD?
Proses percikan bersifat malas, yaitu, tidak ada yang akan terjadi sampai diperlukan. Untuk menjawab pertanyaan dengan cepat, setelah val textFile = sc.textFile("/user/emp.txt")dikeluarkan, tidak ada yang terjadi pada data, hanya yang HadoopRDDdibangun, menggunakan file sebagai sumber.
Katakanlah kita mengubah data itu sedikit:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Sekali lagi, tidak ada yang terjadi pada data. Sekarang ada RDD baru wordsRDDyang berisi referensi ke testFiledan fungsi untuk diterapkan ketika dibutuhkan.
Hanya ketika suatu tindakan dipanggil pada RDD, seperti wordsRDD.count, rantai RDD, yang disebut garis keturunan akan dieksekusi. Artinya, data, yang dipecah dalam partisi, akan dimuat oleh pelaksana cluster Spark, flatMapfungsi akan diterapkan dan hasilnya akan dihitung.
Pada garis keturunan linier, seperti yang ada dalam contoh ini, cache()tidak diperlukan. Data akan dimuat ke pelaksana, semua transformasi akan diterapkan dan akhirnya countakan dihitung, semua dalam memori - jika data cocok dalam memori.
cacheberguna ketika garis silsilah RDD keluar. Katakanlah Anda ingin memfilter kata-kata dari contoh sebelumnya ke dalam hitungan untuk kata-kata positif dan negatif. Anda bisa melakukan ini seperti itu:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Di sini, setiap cabang mengeluarkan ulang data. Menambahkan cachepernyataan eksplisit akan memastikan bahwa pemrosesan yang dilakukan sebelumnya dipertahankan dan digunakan kembali. Pekerjaan akan terlihat seperti ini:
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()
Untuk alasan itu, cachedikatakan 'break the lineage' karena menciptakan pos pemeriksaan yang dapat digunakan kembali untuk diproses lebih lanjut.
Aturan praktis: Gunakan cacheketika garis silsilah RDD Anda bercabang atau ketika RDD digunakan beberapa kali seperti dalam satu lingkaran.