2015-12-23 17 views
5

tôi hiểu quan điểm rằng trong Scala có 2 loại hoạt độngTại sao tồn tại() đều lười biếng đánh giá trong Spark

  1. Transformations
  2. Actions

Transformations như map(), bộ lọc () được đánh giá uể oải. Vì vậy, tối ưu hóa có thể được thực hiện trên thực thi hành động. Ví dụ: nếu tôi thực thi hành động đầu tiên() thì Spark sẽ tối ưu hóa để chỉ đọc dòng đầu tiên.

Nhưng tại sao hoạt động persist() được đánh giá một cách lười biếng. Bởi vì một trong hai cách tôi đi, háo hức hoặc lười biếng, nó sẽ tồn tại toàn bộ RDD theo mức lưu trữ.

Bạn có thể vui lòng nêu chi tiết cho tôi tại sao persist() là chuyển đổi thay vì hành động không.

Trả lời

5

Đối với những người mới bắt đầu mong muốn kiên trì sẽ gây ô nhiễm toàn bộ đường ống. cache hoặc persist chỉ thể hiện ý định. Nó không có nghĩa là chúng ta sẽ đi đến điểm khi RDD được vật chất hóa và có thể thực sự được lưu trữ. Hơn nữa có những bối cảnh nơi dữ liệu được lưu trữ tự động.

Bởi vì một trong hai cách tôi đi, háo hức hoặc lười biếng, nó sẽ tiếp tục tồn tại toàn bộ RDD theo mức lưu trữ.

Nó không chính xác. Thing là, persist không liên tục. Vì nó được nêu rõ in the documentation cho cấp MEMORY_ONLY kiên trì:

Nếu RDD không phù hợp trong bộ nhớ, một số phân vùng sẽ không được lưu trữ và sẽ được tính toán lại một cách nhanh chóng mỗi khi họ đang cần.

Với MEMORY_AND_DISK dữ liệu còn lại được lưu vào đĩa nhưng vẫn có thể bị gỡ bỏ nếu không đủ bộ nhớ để lưu bộ nhớ cache tiếp theo. Điều gì còn quan trọng hơn nữa:

Spark tự động theo dõi việc sử dụng bộ nhớ cache trên mỗi nút và loại bỏ các phân đoạn dữ liệu cũ trong thời gian ít nhất được sử dụng gần đây (LRU).

Bạn cũng có thể tranh luận rằng cache/persist là ngữ nghĩa khác nhau từ hành động Spark được thực hiện cho cụ IO tác dụng phụ. cache là một gợi ý cho động cơ Spark mà chúng tôi có thể muốn sử dụng lại đoạn mã sau này.

0

tồn tại là một cái tên khó hiểu vì nó không tồn tại trong suốt thời gian sử dụng ngữ cảnh của bạn.

vẫn tồn tại giống với bộ nhớ cache. Dữ liệu được lưu trữ trong lần đầu tiên nó được tính toán để nếu bạn sử dụng RDD của bạn trong một phép tính khác, kết quả sẽ không được tính toán lại.

+1

Sai chúng không giống nhau, 'lưu giữ vĩnh viễn' trên đĩa nhưng' cache' lưu trong mem, hơn nữa 'persist' có một số cách để làm việc trên các API' scala' và 'java'. –

+0

Tôi đứng (sửa chữa một phần): cache() = persist() = persist (StorageLevel.MEMORY_ONLY) Nó vẫn là một cách để tạm thời lưu trữ các tính toán trung gian. Nó chỉ được thực hiện khi cần thiết như vậy nó là một hoạt động lười biếng –

+0

Đó là câu hỏi của tôi "Tại sao làm cho kiên trì() gọi lười biếng?" Bởi vì cuối cùng nó sẽ lưu trữ (cho rằng ngữ cảnh đời sống) RDD theo mức lưu trữ (như MEMORY_ONLY, DISK_ONLY, vv). Trong các biến đổi khác, tôi đồng ý rằng chúng tôi có thể đạt được tối ưu hóa chi phí với sự lười biếng. –

5

Nếu bạn có một số dữ liệu mà bạn có thể hoặc không thể sử dụng, làm cho persist() háo hức sẽ không hiệu quả. Một phép biến đổi Spark bình thường tương ứng với một số def trong Scala. Một biến vĩnh viễn biến nó thành một lazy val.

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