Câu trả lời:
Với cache()
, bạn chỉ sử dụng mức lưu trữ mặc định:
MEMORY_ONLY
cho RDDMEMORY_AND_DISK
cho bộ dữ liệuVới persist()
, bạn có thể chỉ định mức lưu trữ nào bạn muốn cho cả RDD và Bộ dữ liệu .
Từ các tài liệu chính thức:
- Bạn có thể đánh dấu một
RDD
mục được duy trì bằng cách sử dụng các phương thứcpersist
() hoặccache
() trên đó.- mỗi tồn tại
RDD
có thể được lưu trữ bằng cách sử dụng khác nhaustorage level
- Các
cache
phương pháp () là một cách viết tắt cho việc sử dụng các mức lưu trữ mặc định, đó làStorageLevel.MEMORY_ONLY
(cửa hàng deserialized đối tượng trong bộ nhớ).
Sử dụng persist()
nếu bạn muốn chỉ định mức lưu trữ khác hơn:
MEMORY_ONLY
đến RDDMEMORY_AND_DISK
cho bộ dữ liệuLiên kết thú vị cho tài liệu chính thức: chọn mức lưu trữ nào
MEMORY_AND_DISK
là giá trị mặc định chỉ dành cho Bộ dữ liệu. MEMORY_ONLY
vẫn là giá trị mặc định cho RDD
Sự khác biệt giữa
cache
vàpersist
hoạt động hoàn toàn là cú pháp. bộ đệm là từ đồng nghĩa của bền hoặc tồn tại (MEMORY_ONLY
), tứccache
là chỉpersist
với mức lưu trữ mặc địnhMEMORY_ONLY
/ ** * Duy trì RDD này với mức lưu trữ mặc định (
MEMORY_ONLY
). * /
def contin (): this.type = contin (StorageLevel.MEMORY_ONLY)/ ** * Duy trì RDD này với mức lưu trữ mặc định (
MEMORY_ONLY
). * /
def cache (): this.type = contin ()
xem thêm chi tiết tại đây ...
Bộ nhớ đệm hoặc lưu trữ là các kỹ thuật tối ưu hóa cho các tính toán Spark (lặp và tương tác). Chúng giúp lưu kết quả tạm thời một phần để chúng có thể được sử dụng lại trong các giai đoạn tiếp theo. Những kết quả tạm thời nhưRDD
s được lưu trong bộ nhớ (mặc định) hoặc lưu trữ rắn hơn như đĩa và / hoặc sao chép.
RDD
s có thể được lưu trữ bằng cách sử dụng cache
hoạt động. Họ cũng có thể được kiên trì sử dụng persist
hoạt động.
persist
,cache
Các chức năng này có thể được sử dụng để điều chỉnh mức lưu trữ của một
RDD
. Khi giải phóng bộ nhớ, Spark sẽ sử dụng mã định danh mức lưu trữ để quyết định phân vùng nào sẽ được giữ. Tham số ít biến thểpersist
() vàcache
() chỉ là viết tắt chopersist(StorageLevel.MEMORY_ONLY).
Cảnh báo : Một khi mức lưu trữ đã được thay đổi, nó không thể thay đổi lại!
Chỉ vì bạn có thể lưu trữ một RDD
trong bộ nhớ không có nghĩa là bạn nên mù quáng làm như vậy. Tùy thuộc vào số lần truy cập dữ liệu và số lượng công việc liên quan đến việc đó, tính toán lại có thể nhanh hơn giá phải trả do áp lực bộ nhớ tăng.
Không nên nói rằng nếu bạn chỉ đọc một tập dữ liệu một khi không có điểm nào trong bộ nhớ đệm, nó thực sự sẽ làm cho công việc của bạn chậm hơn. Kích thước của bộ dữ liệu được lưu trong bộ nhớ cache có thể được nhìn thấy từ Spark Shell ..
Các biến thể liệt kê ...
def cache(): RDD[T]
def persist(): RDD[T]
def persist(newLevel: StorageLevel): RDD[T]
* Xem ví dụ dưới đây: *
val c = sc.parallelize(List("Gnu", "Cat", "Rat", "Dog", "Gnu", "Rat"), 2)
c.getStorageLevel
res0: org.apache.spark.storage.StorageLevel = StorageLevel(false, false, false, false, 1)
c.cache
c.getStorageLevel
res2: org.apache.spark.storage.StorageLevel = StorageLevel(false, true, false, true, 1)
Lưu ý: Do sự khác biệt rất nhỏ và hoàn toàn cú pháp giữa bộ nhớ đệm và sự kiên trì của RDD
hai thuật ngữ thường được sử dụng thay thế cho nhau.
Xem thêm trực quan tại đây ....
Kiên trì trong bộ nhớ và đĩa:
Bộ nhớ đệm có thể cải thiện hiệu suất của ứng dụng của bạn đến một mức độ lớn.
Không có sự khác biệt. Từ RDD.scala
.
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): this.type = persist()
Spark cung cấp 5 loại mức lưu trữ
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
sẽ sử dụng MEMORY_ONLY
. Nếu bạn muốn sử dụng một cái gì đó khác, sử dụngpersist(StorageLevel.<*type*>)
.
Theo mặc định persist()
sẽ lưu trữ dữ liệu trong heap JVM dưới dạng các đối tượng chưa được xác thực.
Cache () và contin () cả hai phương thức đều được sử dụng để cải thiện hiệu suất tính toán tia lửa. Các phương pháp này giúp lưu kết quả trung gian để chúng có thể được sử dụng lại trong các giai đoạn tiếp theo.
Sự khác biệt duy nhất giữa cache () và contin () là, bằng cách sử dụng kỹ thuật Cache, chúng ta chỉ có thể lưu kết quả trung gian trong bộ nhớ khi cần trong khi ở Persist (), chúng ta có thể lưu kết quả trung gian ở 5 cấp độ lưu trữ (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK, DISK_ONLY).
cache()
bây giờ sử dụng MEMORY_AND_DISK