Sorunun daha iyi formüle edileceğini düşünüyorum:
RDD'de ne zaman önbellek çağırmamız veya devam etmemiz gerekir?
Kıvılcım süreçleri tembeldir, yani gerekli olana kadar hiçbir şey olmayacaktır. Soruyu hızlı bir şekilde cevaplamak için val textFile = sc.textFile("/user/emp.txt")
, yayınlandıktan sonra , HadoopRDD
dosyaya kaynak olarak kullanılarak verilere hiçbir şey olmaz, sadece a oluşturulur.
Diyelim ki bu verileri biraz dönüştürüyoruz:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Yine, verilere hiçbir şey olmuyor. Şimdi , gerektiğinde uygulanacak wordsRDD
bir başvuru testFile
ve bir işlev içeren yeni bir RDD var .
Yalnızca RDD üzerinde eylem çağrıldığında, örneğin wordsRDD.count
, soy olarak adlandırılan RDD zinciri yürütülür. Yani, bölümler halinde ayrılmış veriler Spark kümesinin yürütücüler tarafından yüklenecek, flatMap
işlev uygulanacak ve sonuç hesaplanacaktır.
Doğrusal bir soyda, bu örnekteki gibi cache()
, gerekli değildir. Veriler yürütücülere yüklenecek, tüm dönüşümler uygulanacak ve son count
olarak tüm bellekte hesaplanacak - veriler belleğe sığarsa.
cache
RDD'nin kökü dallandığında yararlıdır. Diyelim ki önceki örneğin kelimelerini pozitif ve negatif kelimeler için bir sayıya filtrelemek istiyorsunuz. Bunu şu şekilde yapabilirsiniz:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Burada, her şube verilerin yeniden yüklenmesini sağlar. Açık bir cache
ifade eklemek, daha önce yapılan işlemlerin korunmasını ve yeniden kullanılmasını sağlayacaktır. İş şu şekilde görünecektir:
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()
Bu nedenle, cache
daha sonraki işlemler için tekrar kullanılabilecek bir kontrol noktası oluşturduğundan 'soyun kırılması' söylenir.
Temel kural: Kullanım cache
zaman RDD soy dışarı dalları veya RDD bir döngü içinde gibi birden çok kez kullanıldığında.