Tôi có một chương trình Java bằng cách sử dụng Apache Spark. Phần thú vị nhất của chương trình trông như thế này:Java Apache Spark: Chuỗi chuyển đổi dài dẫn đến thời gian bậc hai
long seed = System.nanoTime();
JavaRDD<AnnotatedDocument> annotated = documents
.mapPartitionsWithIndex(new InitialAnnotater(seed), true);
annotated.cache();
for (int iter = 0; iter < 2000; iter++) {
GlobalCounts counts = annotated
.mapPartitions(new GlobalCounter())
.reduce((a, b) -> a.sum(b)); // update overall counts (*)
seed = System.nanoTime();
// copy overall counts which CountChanger uses to compute a stochastic thing (**)
annotated = annotated
.mapPartitionsWithIndex(new CountChanger(counts, seed), true);
annotated.cache();
// adding these lines causes constant time complexity like i want
//List<AnnotatedDocument> ll = annotated.collect();
//annotated = sc.parallelize(ll, 8);
}
Vì vậy, trong thực tế, các dòng (**) kết quả trong một RDD
với hình thức
documents
.mapPartitionsWithIndex(initial)
.mapPartitionsWithIndex(nextIter)
.mapPartitionsWithIndex(nextIter)
.mapPartitionsWithIndex(nextIter)
... 2000 more
một chuỗi rất dài của bản đồ thực sự. Ngoài ra, dòng (*) buộc tính toán (không lười) tại mỗi lần lặp vì số lượng cần được cập nhật.
Tôi có vấn đề là tôi có được một độ phức tạp thời gian đó tăng tuyến tính với mỗi lần lặp, và vì vậy bậc hai tổng thể:
Tôi nghĩ rằng điều này là do Spark cố gắng để "nhớ" mỗi RDD trong chuỗi, và thuật toán khoan dung lỗi hoặc bất cứ điều gì gây ra điều này để phát triển. Tuy nhiên, tôi thực sự không có ý tưởng.
Điều tôi thực sự muốn làm là tại mỗi lần lặp lại cho Spark biết "thu gọn" RDD sao cho chỉ cái cuối cùng được giữ trong bộ nhớ và làm việc. Điều này sẽ dẫn đến thời gian lặp lại mỗi lần lặp lại, tôi nghĩ vậy. Điều này có thể không? Có bất kỳ giải pháp khác?
Cảm ơn!
Có lý do nào để bạn lưu vào bộ đệm RDD cho mỗi lần lặp không? Thay vì bộ nhớ đệm RDD tích lũy cuối cùng ở cuối vòng lặp? –
Tôi vẫn đang thử nghiệm với các hiệu ứng của bộ nhớ đệm để câu trả lời của tôi sẽ phải "không thực sự". – bombax
Bạn có thực sự tái sử dụng RDD từng tính toán không? Hoặc là nó một RDD tươi mỗi khi bạn muốn tính toán các quầy? –