2014-11-20 18 views
15

Khi giảm số lượng phân vùng, người dùng có thể sử dụng coalesce, điều này thật tuyệt vì nó không gây ra ngẫu nhiên và có vẻ hoạt động ngay lập tức (không yêu cầu thêm giai đoạn công việc).Spark: tăng số lượng phân vùng mà không gây ra ngẫu nhiên?

Tôi muốn làm điều ngược lại đôi khi, nhưng repartition gây ra ngẫu nhiên. Tôi nghĩ rằng một vài tháng trước, tôi thực sự đã làm việc này bằng cách sử dụng CoalescedRDD với balanceSlack = 1.0 - vì vậy điều sẽ xảy ra là nó sẽ phân chia một phân vùng sao cho vị trí phân vùng kết quả trong đó tất cả trên cùng một nút (vì vậy mạng nhỏ IO).

Loại chức năng này là tự động trong Hadoop, một trong những chỉ cần chỉnh kích thước phân chia. Nó dường như không hoạt động theo cách này trong Spark trừ khi một người đang giảm số lượng phân vùng. Tôi nghĩ rằng giải pháp có thể là viết một phân vùng tùy chỉnh cùng với RDD tùy chỉnh mà chúng tôi định nghĩa getPreferredLocations ... nhưng tôi nghĩ đó là một điều đơn giản và phổ biến để làm chắc chắn phải có một cách tiến thẳng về phía trước?

Những điều thử:

.set("spark.default.parallelism", partitions) trên tôi SparkConf, và khi trong bối cảnh của việc đọc gỗ Tôi đã thử sqlContext.sql("set spark.sql.shuffle.partitions= ..., mà trên 1.0.0 gây lỗi và không thực sự muốn tôi muốn, tôi muốn phân vùng số để thay đổi trên tất cả các loại công việc, chứ không phải chỉ là xáo trộn.

+0

Bất kỳ may mắn nào tìm được giải pháp cho điều này? – nbubis

Trả lời

3

Xem không gian này

https://issues.apache.org/jira/browse/SPARK-5997

Đây là loại tính năng rõ ràng thực sự đơn giản cuối cùng sẽ được thực hiện - tôi đoán ngay sau khi họ hoàn thành tất cả các tính năng không cần thiết trong Dataset s.

0

Tôi không hiểu chính xác điểm của bạn là gì. Bạn có nghĩa là bạn có bây giờ 5 phân vùng, nhưng sau khi hoạt động tiếp theo bạn muốn phân phối dữ liệu đến 10? Bởi vì có 10, nhưng vẫn còn sử dụng 5 không có ý nghĩa nhiều ... Quá trình gửi dữ liệu đến các phân vùng mới đã xảy ra đôi khi.

Khi thực hiện coalesce, bạn có thể loại bỏ phân vùng không được theo dõi, ví dụ: nếu ban đầu bạn đã 100, nhưng sau đó sau khi reduceByKey bạn nhận được 10 (như ở đó chỉ có 10 khóa), bạn có thể đặt coalesce.

Nếu bạn muốn quá trình này để đi theo con đường khác, bạn chỉ có thể buộc một số loại phân vùng:

[RDD].partitionBy(new HashPartitioner(100)) 

Tôi không chắc chắn đó là những gì bạn đang tìm kiếm, nhưng hy vọng như vậy.

+3

Mỗi phân vùng đều có một vị trí, tức là một nút, giả sử tôi có 5 phân vùng và 5 nút. Nếu tôi gọi 'repartition', hoặc mã của bạn, đến 10 phân vùng, điều này sẽ trộn dữ liệu - đó là dữ liệu cho mỗi 5 nút có thể truyền qua mạng vào các nút khác. Điều tôi muốn, đó là Spark đơn giản chia từng phân vùng thành 2 mà không di chuyển bất kỳ dữ liệu nào xung quanh - đây là những gì xảy ra trong Hadoop khi tinh chỉnh các thiết lập chia nhỏ. – samthebest

+0

Tôi không chắc chắn nếu bạn có thể làm điều đó. Tôi đoán rằng bạn cần một số chức năng '.forEachNode'. Nhưng tôi chưa bao giờ thấy bất cứ điều gì như thế này. Và tôi không chắc liệu nó có thể được thực hiện dễ dàng hay không. Trình phân vùng phải trả về cùng một phân vùng cho cùng một đối tượng mỗi lần. Theo mặc định, Spark sử dụng 'HashPartitioner', làm ** hashCode modulo number_of_partitions **. Nếu bạn chỉ chia dữ liệu thành hai phân vùng mới, chúng chắc chắn sẽ kết thúc ở vị trí của chúng. Đó là lý do tại sao shuffle là cần thiết. Có lẽ nếu bạn có phân vùng riêng của bạn, nó có thể tăng số lượng phân vùng mà không xáo trộn trên mạng. – szefuf

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