2014-06-17 17 views
12

Tôi đang sử dụng API Python của Spark và chạy Spark 0.8.Sự khác nhau giữa các lát và phân vùng RDD là gì?

Tôi đang lưu trữ một RDD lớn các vectơ dấu phẩy động và tôi cần thực hiện các phép tính của một vectơ đối với toàn bộ tập hợp.

Có sự khác biệt nào giữa các lát và phân vùng trong RDD không?

Khi tôi tạo RDD, tôi chuyển nó thành tham số làm cho nó lưu trữ RDD dưới dạng 100 lát và tạo 100 tác vụ khi thực hiện các phép tính. Tôi muốn biết nếu phân vùng dữ liệu sẽ cải thiện hiệu suất vượt quá việc cắt bằng cách cho phép hệ thống xử lý dữ liệu hiệu quả hơn (tức là có sự khác biệt giữa hoạt động thực hiện trên phân vùng so với chỉ hoạt động trên mọi phần tử trong RDD đã cắt).

Ví dụ: có sự khác biệt đáng kể nào giữa hai đoạn mã này không?

rdd = sc.textFile(demo.txt, 100) 

vs

rdd = sc.textFile(demo.txt) 
rdd.partitionBy(100) 
+1

http://stackoverflow.com/questions/23436640/what-is-the-different-between-an-rdd-partition-and-a-slice tia lửa-apache –

Trả lời

23

Tôi tin slicespartitions là điều tương tự trong Apache Spark.

Tuy nhiên, có sự khác biệt tinh tế nhưng có thể có ý nghĩa giữa hai phần mã bạn đã đăng.

Mã này sẽ nỗ lực để tải demo.txt trực tiếp vào 100 phân vùng sử dụng 100 công việc đồng thời:

rdd = sc.textFile('demo.txt', 100) 

Đối với văn bản không nén, nó sẽ làm việc như mong đợi. Nhưng nếu thay vì demo.txt bạn có một số demo.gz, bạn sẽ kết thúc bằng RDD chỉ với 1 phân vùng. Không thể song song đọc các tệp chống gzipped.

Mặt khác, đoạn code sau đầu tiên sẽ mở demo.txt thành một RDD với số mặc định của các phân vùng, sau đó nó sẽ phân vùng lại một cách rõ ràng các dữ liệu vào phân vùng 100 mà là tương đương về kích thước.

rdd = sc.textFile('demo.txt') 
rdd = rdd.repartition(100) 

Vì vậy, trong trường hợp này, ngay cả với một demo.gz bạn sẽ kết thúc với một RDD với 100 phân vùng.

Lưu ý phụ, tôi đã thay thế partitionBy() bằng repartition() vì đó là những gì tôi tin rằng bạn đang tìm kiếm. partitionBy() yêu cầu RDD là RDD của bộ dữ liệu. Vì repartition() không có sẵn trong Spark 0.8.0, nên thay vào đó bạn có thể sử dụng coalesce(100, shuffle=True).

Spark có thể chạy 1 tác vụ đồng thời cho mỗi phân đoạn của RDD, tối đa số lõi trong cụm của bạn. Vì vậy, nếu bạn có một cụm với 50 lõi, bạn muốn RDD của bạn ít nhất có 50 phân vùng (và có lẽ là 2-3x times that).

Tính đến Spark 1.1.0, bạn có thể kiểm tra có bao nhiêu phân vùng một RDD có như sau:

rdd.getNumPartitions() # Python API 
rdd.partitions.size  // Scala API 

Trước 1.1.0, cách để làm điều này với các API Python là rdd._jrdd.splits().size().

2

Bạn có thể làm phân vùng như sau:

import org.apache.spark.Partitioner 

val p = new Partitioner() { 
    def numPartitions = 2 
    def getPartition(key: Any) = key.asInstanceOf[Int] 
} 
recordRDD.partitionBy(p) 
Các vấn đề liên quan