Hỏi đáp về IT
Mã xác nhận Thay đổi một
HNQ Bigdata engineering

Quản lý các phân vùng Spark với Coalesce và Repartition

Duyệt qua: 358
  https://medium.com/@mrpowers/managing-spark-partitions-with-coalesce-and-repartition-4050c57ad5c4 Spark chia dữ liệu thành các phân vùng và thực hiện các phép tính trên các phân vùng song song. Bạn nên hiểu cách dữ liệu được phân vùng và khi nào bạn cần điều chỉnh phân vùng theo cách thủ công để giữ cho các tính toán Spark của bạn hoạt động hiệu quả. Việc hiểu phân vùng bộ nhớ là hoàn toàn quan trọng đối với các lập trình viên Spark. Bài đăng này đề cập đến phân vùng bộ nhớ và bạn nên xem Beautiful Spark để biết chi tiết về các chủ đề liên quan như xây dựng hồ phân vùng trên đĩa và cách thực hiện các thao tác lọc nhanh. Giới thiệu về phân vùng Lest tạo một DataFrame gồm các số để minh họa cách dữ liệu được phân vùng:
val x = (1 đến 10) .toList 
val numberDf = x.toDF (“số”)
Trên máy tính của tôi, numberDf được chia thành bốn phân vùng:
numberDf.rdd.partitions.size // => 4
Phân vùng Eac h là một tệp CSV riêng biệt khi bạn ghi DataFrame vào đĩa.
numberDf.write.csv (“/ Users / powers / Desktop / spark_output / number”)
Đây là cách dữ liệu được phân tách trên các phân vùng khác nhau.
Phân vùng A: 1, 2 
Phân vùng B: 3, 4, 5
Phân vùng C: 6, 7
Phân vùng D: 8, 9, 10
liên kết lại Phương pháp liên kết làm giảm số lượng phân vùng trong DataFrame. Đây là cách hợp nhất dữ liệu trong hai phân vùng:
val sốDf2 = sốDf.coalesce (2)
Chúng tôi có thể xác minh rằng liên kết đã tạo một DataFrame mới chỉ với hai phân vùng:
numberDf2.rdd.partitions.size // => 2
numberDf2 sẽ được ghi ra đĩa dưới dạng hai tệp văn bản:
numberDf2.write.csv (“/ Users / powers / Desktop / spark_output / number2”)
Các phân vùng trong numberDf2 có dữ liệu sau:
Phân vùng A: 1, 2, 3, 4, 5 
Phân vùng C: 6, 7, 8, 9, 10
Thuật toán liên kết đã di chuyển dữ liệu từ Phân vùng B sang Phân vùng A và di chuyển dữ liệu từ Phân vùng D sang Phân vùng C. Dữ liệu trong Phân vùng A và Phân vùng C không di chuyển theo thuật toán liên kết. Thuật toán này nhanh trong một số tình huống nhất định vì nó giảm thiểu chuyển động của dữ liệu. Tăng phân vùng Bạn có thể cố gắng tăng số lượng phân vùng bằng cách liên kết, nhưng nó sẽ không hoạt động!
val numberDf3 = numberDf.coalesce (6) 
numberDf3.rdd.partitions.size // => 4
numberDf3 giữ bốn phân vùng mặc dù chúng tôi đã cố gắng tạo 6 phân vùng với liên kết (6). Thuật toán kết hợp thay đổi số lượng nút bằng cách di chuyển dữ liệu từ một số phân vùng sang phân vùng hiện có. Thuật toán này rõ ràng không thể tăng số lượng phân vùng. sự phân chia lại Phương pháp phân vùng lại có thể được sử dụng để tăng hoặc giảm số lượng phân vùng trong DataFrame. Hãy tạo một homerDf từ numberDf với hai phân vùng.
val homerDf = numberDf.repartition (2) 
homerDf.rdd.partitions.size // => 2
Hãy kiểm tra dữ liệu trên từng phân vùng trong homerDf:
Phân vùng ABC: 1, 3, 5, 6, 8, 10 
Phân vùng XYZ: 2, 4, 7, 9
Phân vùng ABC chứa dữ liệu từ Phân vùng A, Phân vùng B, Phân vùng C và Phân vùng D. Phân vùng XYZ cũng chứa dữ liệu từ mỗi phân vùng gốc. Thuật toán phân vùng lại thực hiện xáo trộn dữ liệu đầy đủ và phân phối dữ liệu đồng đều giữa các phân vùng. Nó không cố gắng giảm thiểu sự di chuyển của dữ liệu như thuật toán liên kết. Tăng phân vùng Phương pháp phân vùng lại cũng có thể được sử dụng để tăng số lượng phân vùng.
val bartDf = numberDf.repartition (6) 
bartDf.rdd.partitions.size // => 6
Đây là cách dữ liệu được phân chia giữa các phân vùng trong bartDf.
Phân vùng 00000: 5, 7 
Phân vùng 00001: 1
Phân vùng 00002: 2
Phân vùng 00003: 8
Phân vùng 00004: 3, 9
Phân vùng 00005: 4, 6, 10
Phương thức phân vùng lại thực hiện xáo trộn toàn bộ dữ liệu, do đó số lượng phân vùng có thể được tăng lên. Sự khác biệt giữa liên kết và phân vùng lại Thuật toán phân vùng lại thực hiện xáo trộn toàn bộ dữ liệu và tạo ra các phân vùng dữ liệu có kích thước bằng nhau. kết hợp kết hợp các phân vùng hiện có để tránh xáo trộn toàn bộ. phân vùng lại theo cột Hãy sử dụng dữ liệu sau để kiểm tra cách một DataFrame có thể được phân vùng lại theo một cột cụ thể.
+ ----- + ------- + 
| tuổi tác | màu sắc |
+ ----- + ------- +
| 10 | xanh lam |
| 13 | màu đỏ |
| 15 | xanh lam |
| 99 | màu đỏ |
| 67 | xanh lam |
+ ----- + ------- +
Chúng ta sẽ bắt đầu bằng cách tạo DataFrame:
val people = Danh sách ( 
(10, "blue"),
(13, "red"),
(15, "blue"),
(99, "red"),
(67, "blue")
)
val peopleDf = people. toDF ("tuổi", "màu")
Hãy phân vùng lại DataFrame theo cột màu:
colorDf = peopleDf.repartition ($ "color")
Khi phân vùng theo cột, Spark sẽ tạo tối thiểu 200 phân vùng theo mặc định. Ví dụ này sẽ có hai phân vùng với dữ liệu và 198 phân vùng trống.
Vách ngăn 00091 
13, đỏ
99, đỏ
Vách ngăn 00168
10, xanh lam
15, xanh lam
67, xanh lam
ColorDf chứa các phân vùng khác nhau cho mỗi màu và được tối ưu hóa để chiết xuất theo màu. Phân vùng theo cột tương tự như lập chỉ mục một cột trong cơ sở dữ liệu quan hệ. Ví dụ về thế giới thực Giả sử bạn có một hồ dữ liệu chứa 2 tỷ hàng dữ liệu (1TB) được chia thành 13.000 phân vùng. Bạn muốn tạo một vũng dữ liệu lấy mẫu ngẫu nhiên của một phần triệu hồ dữ liệu. Nhóm dữ liệu sẽ được sử dụng trong quá trình phát triển và nhóm dữ liệu sẽ được dành riêng cho mã cấp sản xuất. Bạn muốn ghi dữ liệu vũng tàu ra S3 để dễ dàng truy cập. Đây là cách bạn cấu trúc mã:
val dataPuddle = dataLake.sample (true, 
0,000001 ) dataPuddle.write.parquet ("s3a: // my_bucket / puddle /")
Spark không điều chỉnh số lượng phân vùng khi một DataFrame lớn được lọc, vì vậy dataPuddle cũng sẽ có 13.000 phân vùng. DataPuddle chỉ chứa 2.000 hàng dữ liệu, vì vậy rất nhiều phân vùng sẽ trống. Việc đọc hoặc ghi hàng nghìn tệp văn bản trống vào S3 là không hiệu quả - chúng ta nên cải thiện mã này bằng cách phân vùng lại.
val dataPuddle = dataLake.sample (true, 
0,000001 ) val goodPuddle = dataPuddle.repartition (4)
goodPuddle.write.parquet ("s3a: // my_bucket / puddle /")
Tại sao chúng tôi lại chọn 4 phân vùng cho data puddle? Dữ liệu nhỏ hơn một triệu lần, vì vậy chúng tôi giảm số lượng phân vùng một triệu và giữ nguyên lượng dữ liệu trên mỗi phân vùng. 13.000 phân vùng / 1.000.000 = 1 phân vùng (làm tròn). Chúng tôi đã sử dụng 4 phân vùng để vũng dữ liệu có thể tận dụng tính song song của Spark.
bigdata 2020/11/23 11:14

Để lại dấu chân

Bước trên một chân

Bình luận

copyright © bigdata 2010-2020
Processed in 0 seconds, 0 queries