Tôi nghĩ rằng câu hỏi sẽ được xây dựng tốt hơn như:
Khi nào chúng ta cần gọi bộ đệm hoặc tiếp tục sử dụng RDD?
Quá trình Spark là lười biếng, nghĩa là, sẽ không có gì xảy ra cho đến khi nó được yêu cầu. Để trả lời nhanh câu hỏi, sau khi val textFile = sc.textFile("/user/emp.txt")được ban hành, không có gì xảy ra với dữ liệu, chỉ có a HadoopRDDđược xây dựng, sử dụng tệp làm nguồn.
Giả sử chúng ta biến đổi dữ liệu đó một chút:
val wordsRDD = textFile.flatMap(line => line.split("\\W"))
Một lần nữa, không có gì xảy ra với dữ liệu. Bây giờ có một RDD mới wordsRDDchứa tham chiếu đến testFilevà một chức năng sẽ được áp dụng khi cần thiết.
Chỉ khi một hành động được gọi theo RDD, như wordsRDD.countchuỗi RDD, được gọi là dòng sẽ được thực thi. Đó là, dữ liệu, được chia nhỏ trong các phân vùng, sẽ được tải bởi người thi hành của cụm Spark, flatMapchức năng sẽ được áp dụng và kết quả sẽ được tính toán.
Trên một dòng dõi tuyến tính, như một trong ví dụ này, cache()là không cần thiết. Dữ liệu sẽ được tải cho người thực thi, tất cả các biến đổi sẽ được áp dụng và cuối cùng countsẽ được tính toán, tất cả trong bộ nhớ - nếu dữ liệu phù hợp với bộ nhớ.
cachelà hữu ích khi dòng dõi của RDD phân nhánh. Giả sử bạn muốn lọc các từ của ví dụ trước thành số đếm cho các từ tích cực và tiêu cực. Bạn có thể làm điều này như thế:
val positiveWordsCount = wordsRDD.filter(word => isPositive(word)).count()
val negativeWordsCount = wordsRDD.filter(word => isNegative(word)).count()
Ở đây, mỗi chi nhánh phát hành tải lại dữ liệu. Thêm một cachetuyên bố rõ ràng sẽ đảm bảo rằng việc xử lý được thực hiện trước đó được bảo tồn và tái sử dụng. Công việc sẽ như thế này:
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()
Vì lý do đó, cacheđược cho là 'phá vỡ dòng dõi' vì nó tạo ra một điểm kiểm tra có thể được sử dụng lại để xử lý thêm.
Nguyên tắc chung: Sử dụng cachekhi dòng dõi RDD của bạn phân nhánh hoặc khi RDD được sử dụng nhiều lần như trong một vòng lặp.