Chúng tôi sử dụng .cache()
trên RDD để lưu bộ đệm dữ liệu liên tục vào bộ dữ liệu, Mối quan tâm của tôi là khi bộ đệm này sẽ hết hạn?.
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
Chúng tôi sử dụng .cache()
trên RDD để lưu bộ đệm dữ liệu liên tục vào bộ dữ liệu, Mối quan tâm của tôi là khi bộ đệm này sẽ hết hạn?.
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
Câu trả lời:
Nó sẽ không hết hạn cho đến khi Spark hết bộ nhớ, tại thời điểm đó, nó sẽ loại bỏ RDD khỏi bộ đệm được sử dụng ít nhất. Khi bạn yêu cầu một cái gì đó đã được mở khóa, nó sẽ tính toán lại đường ống và đặt lại vào bộ đệm. Nếu điều này quá tốn kém, hãy bỏ qua các RDD khác, đừng lưu chúng vào vị trí đầu tiên hoặc duy trì chúng trên hệ thống tệp của bạn.
Ngoài câu trả lời của Jan, tôi muốn chỉ ra rằng bộ lưu trữ RDD (/ bộ đệm) được tuần tự hóa hoạt động tốt hơn nhiều so với bộ nhớ đệm RDD thông thường cho các bộ dữ liệu lớn .
Nó cũng giúp tối ưu hóa việc thu gom rác, trong trường hợp bộ dữ liệu lớn.
Ngoài ra, từ các tài liệu tia lửa:
Khi các đối tượng của bạn vẫn còn quá lớn để lưu trữ hiệu quả mặc dù điều chỉnh này, một cách đơn giản hơn nhiều để giảm mức sử dụng bộ nhớ là lưu trữ chúng ở dạng tuần tự, sử dụng StorageLevels được tuần tự hóa trong API lưu giữ RDD, chẳng hạn như MEMORY_ONLY_SER. Spark sau đó sẽ lưu trữ mỗi phân vùng RDD dưới dạng một mảng byte lớn. Nhược điểm duy nhất của việc lưu trữ dữ liệu ở dạng tuần tự là thời gian truy cập chậm hơn, do phải giải tuần tự hóa từng đối tượng một cách nhanh chóng. Chúng tôi thực sự khuyên bạn nên sử dụng Kryo nếu bạn muốn lưu trữ dữ liệu ở dạng tuần tự hóa, vì nó dẫn đến kích thước nhỏ hơn nhiều so với tuần tự hóa Java (và chắc chắn hơn các đối tượng Java thô).
Spark sẽ tự động hủy liên tục / xóa RDD hoặc Dataframe nếu RDD không còn được sử dụng nữa. Để kiểm tra xem RDD có được lưu trong bộ nhớ cache hay không, vui lòng kiểm tra Spark UI và kiểm tra tab Storage và xem chi tiết Bộ nhớ.
Từ thiết bị đầu cuối, bạn có thể sử dụng rdd.unpersist()
hoặc sqlContext.uncacheTable("sparktable")
xóa RDD hoặc các bảng khỏi Bộ nhớ. Spark được thực hiện cho Đánh giá lười biếng, trừ khi và cho đến khi bạn nói bất kỳ hành động nào, nó không tải hoặc xử lý bất kỳ dữ liệu nào vào RDD hoặc DataFrame.
MEMORY_ONLY_SER
chỉ có sẵn trong Scala / Java, không phải Python.