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 , HadoopRDDdosyaya 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 wordsRDDbir başvuru testFileve 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, flatMapiş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 countolarak tüm bellekte hesaplanacak - veriler belleğe sığarsa.
cacheRDD'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 cacheifade 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, cachedaha sonraki işlemler için tekrar kullanılabilecek bir kontrol noktası oluşturduğundan 'soyun kırılması' söylenir.
Temel kural: Kullanım cachezaman RDD soy dışarı dalları veya RDD bir döngü içinde gibi birden çok kez kullanıldığında.