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 wordsRDD
chứa tham chiếu đến testFile
và 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.count
chuỗ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, flatMap
chứ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 count
sẽ được tính toán, tất cả trong bộ nhớ - nếu dữ liệu phù hợp với bộ nhớ.
cache
là 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 cache
tuyê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 cache
khi 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.