2016-03-04 25 views
5

Giả sử tôi tạo ra như một RDD (Tôi đang sử dụng Pyspark):Spark quyết định cách phân vùng RDD như thế nào?

list_rdd = sc.parallelize(xrange(0, 20, 2), 6) 

sau đó tôi in các yếu tố phân vùng với phương pháp glom() và có được

[[0], [2, 4], [6, 8], [10], [12, 14], [16, 18]] 

như thế nào Spark quyết định làm thế nào để phân vùng danh sách của tôi? Lựa chọn cụ thể của các yếu tố đến từ đâu? Nó có thể kết hợp chúng một cách khác nhau, để lại một số phần tử khác hơn 0 và 10 một mình, để tạo ra 6 phân vùng được yêu cầu. Trong lần chạy thứ hai, các phân vùng đều giống nhau.

Sử dụng một phạm vi lớn hơn, với 29 yếu tố, tôi nhận được các phân vùng trong mô hình của 2 yếu tố tiếp theo là ba yếu tố:

list_rdd = sc.parallelize(xrange(0, 30, 2), 6) 
[[0, 2], [4, 6, 8], [10, 12], [14, 16, 18], [20, 22], [24, 26, 28]] 

Sử dụng một phạm vi nhỏ hơn của 9 yếu tố tôi nhận được

list_rdd = sc.parallelize(xrange(0, 10, 2), 6) 
[[], [0], [2], [4], [6], [8]] 

Vì vậy, những gì tôi suy ra là Spark tạo ra các phân vùng bằng cách chia nhỏ danh sách thành một cấu hình trong đó nhỏ nhất có thể được theo sau bởi các bộ sưu tập lớn hơn và lặp lại.

Câu hỏi đặt ra là nếu có lý do đằng sau lựa chọn này, rất thanh lịch, nhưng nó cũng mang lại lợi thế về hiệu suất?

Trả lời

2

Trừ khi bạn chỉ định một trình phân vùng cụ thể, thì điều này là "ngẫu nhiên" ở chỗ nó phụ thuộc vào việc triển khai cụ thể RDD đó. Trong trường hợp này, bạn có thể đi đến số ParallelCollectionsRDD để tìm hiểu thêm.

getPartitions được định nghĩa là:

val slices = ParallelCollectionRDD.slice(data, numSlices).toArray 
slices.indices.map(i => new ParallelCollectionPartition(id, i, slices(i))).toArray 

nơi slice được nhận xét như (định dạng lại để phù hợp hơn):

/** 
* Slice a collection into numSlices sub-collections. 
* One extra thing we do here is to treat Range collections specially, 
* encoding the slices as other Ranges to minimize memory cost. 
* This makes it efficient to run Spark over RDDs representing large sets of numbers. 
* And if the collection is an inclusive Range, 
* we use inclusive range for the last slice. 
*/ 

Lưu ý rằng có một số lưu ý liên quan đến bộ nhớ. Vì vậy, một lần nữa, điều này sẽ được cụ thể để thực hiện.

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