2016-02-01 17 views
25

Điểm khác nhau giữa điểm kiểm tra tia lửa và tồn tại trên đĩa là gì. Cả hai cửa hàng này có nằm trong đĩa cục bộ không?Điểm khác biệt giữa điểm kiểm tra tia lửa và tồn tại trên đĩa là gì

+0

Đây là một câu hỏi rất chung chung. Tốt hơn là thêm một số ngữ cảnh xung quanh nó. Để trả lời câu hỏi của bạn, nó có thể được lưu trữ vào bất kỳ Vùng lưu trữ liên tục nào - DISK địa phương hoặc HDFS hoặc không gian được gắn NFS, v.v. – Sumit

+3

@Sumit - Đây là câu hỏi rất cụ thể về sự khác biệt giữa hai phương pháp Spark RDD. Câu trả lời có thể được khách quan và tập trung, như câu trả lời của zero323 dưới đây thể hiện. –

Trả lời

29

Có một vài sự khác biệt quan trọng nhưng điểm cơ bản là điều xảy ra với dòng truyền thừa. Persist/cache giữ nguyên dòng truyền thừa trong khi checkpoint ngắt dòng. Cho phép xem xét ví dụ sau:

import org.apache.spark.storage.StorageLevel 

val rdd = sc.parallelize(1 to 10).map(x => (x % 3, 1)).reduceByKey(_ + _) 
  • cache/persist:

    val indCache = rdd.mapValues(_ > 4) 
    indCache.persist(StorageLevel.DISK_ONLY) 
    
    indCache.toDebugString 
    // (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated] 
    // | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated] 
    // +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated] 
    //  | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated] 
    
    indCache.count 
    // 3 
    
    indCache.toDebugString 
    // (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated] 
    // |  CachedPartitions: 8; MemorySize: 0.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 587.0 B 
    // | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated] 
    // +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated] 
    //  | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated] 
    
  • checkpoint:

    val indChk = rdd.mapValues(_ > 4) 
    indChk.checkpoint 
    
    // indChk.toDebugString 
    // (8) MapPartitionsRDD[11] at mapValues at <console>:24 [] 
    // | ShuffledRDD[3] at reduceByKey at <console>:21 [] 
    // +-(8) MapPartitionsRDD[2] at map at <console>:21 [] 
    //  | ParallelCollectionRDD[1] at parallelize at <console>:21 [] 
    
    indChk.count 
    // 3 
    
    indChk.toDebugString 
    // (8) MapPartitionsRDD[11] at mapValues at <console>:24 [] 
    // | ReliableCheckpointRDD[12] at count at <console>:27 [] 
    

Như bạn có thể thấy trong trường hợp l đầu tiên ineage được lưu giữ ngay cả khi dữ liệu được lấy từ bộ nhớ cache. Nó có nghĩa là dữ liệu có thể được tính toán lại từ đầu nếu một số phân vùng của indCache bị mất. Trong trường hợp thứ hai dòng dõi hoàn toàn bị mất sau khi trạm kiểm soát và indChk không mang theo một thông tin cần thiết để xây dựng lại nó nữa.

checkpoint, không giống như cache/persist được tính riêng biệt với các công việc khác. Đó là lý do tại sao RDD được đánh dấu để kiểm tra điểm phải được lưu trong bộ nhớ cache:

Chúng tôi khuyên bạn nên lưu RDD này vào bộ nhớ, nếu không lưu nó vào tệp sẽ yêu cầu tính toán lại.

Cuối cùng là checkpointed dữ liệu liên tục và không bị xóa sau SparkContext bị hủy.

Về lưu trữ dữ liệu SparkContext.setCheckpointDir được sử dụng bởi RDD.checkpoint yêu cầu DFS đường dẫn nếu chạy ở chế độ không phải cục bộ. Nếu không, nó có thể là hệ thống tập tin cục bộ. localCheckpointpersist mà không cần nhân rộng nên sử dụng hệ thống tệp cục bộ.

Note:

RDD checkpointing là một khái niệm khác so với một chekpointing trong Spark Streaming. Cái cũ được thiết kế để giải quyết vấn đề dòng, cái thứ hai là tất cả về độ tin cậy của luồng và phục hồi lỗi.

1

Nếu bạn kiểm tra the relevant part of the documentation, nó sẽ nói về cách ghi dữ liệu vào hệ thống đáng tin cậy, ví dụ: HDFS. Nhưng bạn có thể nói với Apache Spark nơi viết thông tin điểm kiểm tra của mình.

Mặt khác, sự bền bỉ là về dữ liệu bộ nhớ đệm chủ yếu trong bộ nhớ, như this part of the documentation cho biết rõ ràng.

Vì vậy, tùy thuộc vào thư mục bạn đã cung cấp cho Apache Spark.

+1

Sự kiên trì trong phát trực tiếp là vấn đề khá khác nhau và không thực sự liên quan đến bộ nhớ đệm. – zero323

12

Tôi nghĩ rằng bạn có thể tìm thấy một câu trả lời rất chi tiết here

Trong khi đó là rất khó để tóm tắt tất cả trong trang đó, tôi sẽ nói

Persist

  • kiên trì hoặc bộ nhớ đệm với StorageLevel.DISK_ONLY làm cho việc tạo ra RDD được tính toán và lưu trữ tại một vị trí sao cho việc sử dụng tiếp theo của RDD đó sẽ không vượt quá các điểm đó trong việc tính toán lại lớp lót.
  • Sau khi tiếp tục được gọi, Spark vẫn nhớ dòng truyền thừa của RDD mặc dù nó không gọi nó.
  • Thứ hai, sau khi ứng dụng kết thúc, bộ nhớ cache sẽ bị xóa hoặc tập tin bị phá hủy

checkpointing

  • cửa hàng checkpointing các RDD thể chất để HDFS và phá hủy các dòng đã tạo ra nó.
  • Tệp điểm kiểm tra sẽ không bị xóa ngay cả sau khi ứng dụng Spark bị chấm dứt.
  • Tệp điểm kiểm tra có thể được sử dụng trong lần chạy công việc hoặc chương trình điều khiển tiếp theo
  • Kiểm tra RDD tạo tính toán kép vì trước tiên thao tác sẽ gọi bộ nhớ cache trước khi thực hiện công việc tính toán và ghi vào thư mục điểm kiểm tra.

Bạn có thể muốn đọc bài viết để biết thêm chi tiết hoặc nội bộ của điểm kiểm tra của Spark hoặc hoạt động Cache.

1
  1. Persist (MEMORY_AND_DISK) sẽ lưu trữ các khung dữ liệu vào đĩa và bộ nhớ tạm thời mà không vi phạm các dòng của chương trình ví dụ: df.rdd.toDebugString() sẽ trả về kết quả tương tự. Đó là khuyến cáo sử dụng kéo dài (*) trên một tính toán, có nghĩa là sẽ được tái sử dụng để tránh tính toán lại các kết quả trung gian:

    df = df.persist(StorageLevel.MEMORY_AND_DISK) 
    calculation1(df) 
    calculation2(df) 
    

    Note, mà bộ nhớ đệm khung dữ liệu không đảm bảo, rằng nó sẽ vẫn còn trong ký ức cho đến khi bạn gọi nó lần sau. Tùy thuộc vào việc sử dụng bộ nhớ, bộ nhớ đệm có thể bị loại bỏ.

  2. Điểm kiểm tra(), mặt khác, ngắt dòng và buộc khung dữ liệu được lưu trữ trên đĩa. Không giống như việc sử dụng bộ nhớ cache()/persist(), việc kiểm tra thường xuyên có thể làm chậm chương trình của bạn. Các điểm kiểm tra được khuyến cáo sử dụng khi a) làm việc trong môi trường không ổn định để cho phép khôi phục nhanh từ thất bại b) lưu trữ các trạng thái tính toán trung gian khi các mục nhập mới của RDD phụ thuộc vào các mục trước đó, để tránh tính toán lại chuỗi phụ thuộc dài trong trường hợp thất bại

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