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 HadoopRDD
dibangun, 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 wordsRDD
yang berisi referensi ke testFile
dan 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, flatMap
fungsi 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 count
akan dihitung, semua dalam memori - jika data cocok dalam memori.
cache
berguna 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 cache
pernyataan 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, cache
dikatakan 'break the lineage' karena menciptakan pos pemeriksaan yang dapat digunakan kembali untuk diproses lebih lanjut.
Aturan praktis: Gunakan cache
ketika garis silsilah RDD Anda bercabang atau ketika RDD digunakan beberapa kali seperti dalam satu lingkaran.