2016-01-04 18 views
6

Vấn đề: Tôi muốn nhập dữ liệu vào Spark EMR từ S3 sử dụng:Làm thế nào để thiết lập số lượng phân vùng/nút khi nhập dữ liệu vào Spark

data = sqlContext.read.json("s3n://.....") 

Có cách nào tôi có thể thiết lập số lượng các nút mà Spark sử dụng để tảiquá trình dữ liệu? Đây là một ví dụ về cách tôi xử lý dữ liệu:

data.registerTempTable("table") 
SqlData = sqlContext.sql("SELECT * FROM table") 

Context: Dữ liệu không phải là quá lớn, phải mất một thời gian dài để nạp vào Spark và cũng để truy vấn từ. Tôi nghĩ rằng Spark phân vùng dữ liệu thành quá nhiều nút. Tôi muốn có thể thiết lập thủ công. Tôi biết khi giao dịch với RDD và sc.parallelize Tôi có thể chuyển số lượng phân vùng làm đầu vào. Ngoài ra, tôi đã thấy repartition(), nhưng tôi không chắc liệu nó có thể giải quyết được vấn đề của tôi hay không. Biến số dataDataFrame trong ví dụ của tôi.

Hãy để tôi xác định phân vùng chính xác hơn. Định nghĩa một: thường được gọi là "khóa phân vùng", nơi một cột được chọn và lập chỉ mục để tăng tốc độ truy vấn (đó không phải là những gì tôi muốn). Định nghĩa hai: (đây là nơi mà mối quan tâm của tôi) giả sử bạn có một tập dữ liệu, Spark quyết định nó sẽ phân phối nó trên nhiều nút để nó có thể chạy các hoạt động trên dữ liệu song song. Nếu kích thước dữ liệu quá nhỏ, điều này có thể làm chậm quá trình. Làm cách nào tôi có thể đặt giá trị đó

+0

Bản sao có thể có của [Cách xác định phân vùng của Khung dữ liệu Spark?] (Http://stackoverflow.com/questions/30995699/how-to-define-partitioning-of-a-spark-dataframe) –

+0

Hãy để tôi xác định phân vùng chính xác hơn. Định nghĩa một: thường được gọi là "khóa phân vùng", trong đó cột được chọn và lập chỉ mục để tăng tốc truy vấn. Định nghĩa hai: (đây là nơi mà mối quan tâm của tôi) giả sử bạn có một tập dữ liệu, Spark quyết định nó sẽ phân phối nó trên nhiều nút để nó có thể chạy các hoạt động trên dữ liệu song song. Nếu kích thước dữ liệu quá nhỏ, điều này có thể làm chậm quá trình. Làm thế nào tôi có thể thiết lập giá trị đó? – pemfir

+0

Bạn chính xác trong việc phân biệt rõ ràng giữa phân đoạn bảng như trong cơ sở dữ liệu quan hệ so với phân vùng RDD. Xem [Cách xác định phân vùng của một khung dữ liệu Spark?] (http://stackoverflow.com/questions/30995699/how-to-define-partitioning-of-a-spark-dataframe), mô tả cách phân vùng DataFrame, như trong _RDD/phân vùng phân vùng_. –

Trả lời

6

Theo mặc định, nó phân vùng thành 200 bộ. Bạn có thể thay đổi nó bằng cách sử dụng lệnh set trong sql context sqlContext.sql("set spark.sql.shuffle.partitions=10");. Tuy nhiên bạn cần phải thiết lập nó một cách thận trọng dựa trên các đặc điểm dữ liệu của bạn.

4

bạn có thể gọi repartition() trên dataframe để đặt phân vùng. Bạn thậm chí có thể thiết lập spark.sql.shuffle.partitions khách sạn này sau khi tạo bối cảnh tổ ong hoặc bằng cách châm ngòi-Trình jar

spark-nộp .... --conf spark.sql.shuffle.partitions = 100 hoặc dataframe.repartition (100)

0

số phân vùng "đầu vào" được cố định bởi cấu hình file System.

1 tệp 1Go, với kích thước khối là 128M sẽ cung cấp cho bạn 10 tác vụ. Tôi không chắc chắn bạn có thể thay đổi nó.

phân vùng có thể rất xấu, nếu bạn có nhiều phân vùng đầu vào, thao tác này sẽ tạo ra nhiều sự lộn xộn (lưu lượng dữ liệu) giữa các phân vùng.

Không có phương pháp ma thuật, bạn phải thử và sử dụng webUI để xem có bao nhiêu tác vụ được tạo.

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