2014-09-02 23 views
12

Nói rằng tôi có ba RDD chức năng chuyển kêu gọi rdd1:Bộ nhớ cache Spark RDD sẽ đi bao xa?

def rdd2 = rdd1.f1 
def rdd3 = rdd2.f2 
def rdd4 = rdd3.f3 

Bây giờ tôi muốn bộ nhớ cache rdd4, vì vậy tôi gọi rdd4.cache().

Câu hỏi của tôi:

sẽ chỉ là kết quả từ hành động trên rdd4 được lưu trữ hoặc mỗi RDD trên rdd4 sẽ được lưu trữ? Giả sử tôi muốn lưu bộ nhớ cache cả hai rdd3rdd4, tôi có cần lưu chúng vào bộ nhớ cache riêng không?

Trả lời

19

Toàn bộ ý tưởng về bộ nhớ cache là tia lửa không giữ kết quả trong bộ nhớ trừ khi bạn yêu cầu. Vì vậy, nếu bạn lưu bộ nhớ cache RDD cuối cùng trong chuỗi nó chỉ giữ kết quả của một trong bộ nhớ. Vì vậy, có, bạn cần bộ nhớ cache một cách riêng biệt, nhưng hãy nhớ bạn chỉ cần bộ nhớ cache một RDD nếu bạn đang sử dụng nó nhiều hơn một lần, ví dụ:

rdd4.cache() 
val v1 = rdd4.lookup("key1") 
val v2 = rdd4.lookup("key2") 

Nếu bạn không gọi bộ nhớ cache trong trường hợp này rdd4 sẽ được tính toán lại cho mọi cuộc gọi tra cứu (hoặc bất kỳ hàm nào khác yêu cầu đánh giá). Bạn có thể muốn đọc paper on RDD's nó khá dễ hiểu và giải thích các ý tưởng đằng sau những lựa chọn nhất định mà họ đã thực hiện liên quan đến công việc của RDD như thế nào.

+0

Đánh giá cao câu trả lời của bạn. Vì vậy, bất cứ khi nào sẽ có một ngã ba, bạn cần phải bộ nhớ cache mà rdd để giảm tính toán lặp đi lặp lại. Nỗi đau duy nhất là không khoan nhượng trên rdd lưu trữ (vì tôi có nhiều ngã ba trên sự biến đổi rdd của tôi). Tôi sẽ đọc lại bài báo. Cảm ơn – EdwinGuo

+0

@EdwinGuo không trích dẫn tôi về điều này nhưng tôi nghĩ hầu hết mọi người thấy rằng dành thêm thời gian để unpersist thường rắc rối hơn nó có giá trị, nó tốt hơn để cho JVM xử lý này như unresisting là một hoạt động rất tốn kém – aaronman

+0

ok, tôi có nên mở ra một câu hỏi khác không? cố gắng tìm kiếm người không khoan nhượng, không may mắn. "Đánh dấu RDD là không liên tục và xóa tất cả các khối cho nó khỏi bộ nhớ và đĩa." từ gitHub, đã không đề cập đến nhiều – EdwinGuo

Các vấn đề liên quan