Hỏi đáp về IT
Mã xác nhận Thay đổi một
Ngô Quang Hải quanghaisoft@yahoo.com Bigdata engineering

Apache Spark 3.0 tăng hiệu suất khối lượng công việc SQL của bạn như thế nào

Duyệt qua: 194

Trong hầu hết các lĩnh vực hoạt động với dữ liệu phức tạp, Spark đã nhanh chóng trở thành khung máy tính phân tán trên thực tế cho các nhóm trong vòng đời dữ liệu và phân tích. Một trong những tính năng được chờ đợi nhất của Spark 3.0 là khung thực thi truy vấn thích ứng (AQE) mới, khắc phục các sự cố đã gây ra nhiều khối lượng công việc Spark SQL. Những điều đó đã được ghi lại vào đầu năm 2018 trong blog này từ một nhóm hỗn hợp Intel và Baidu. Để có cái nhìn sâu hơn về khuôn khổ, hãy tham gia khóa học Điều chỉnh hiệu suất Apache Spark được cập nhật của chúng tôi .

link gốc: https://blog.cloudera.com/how-does-apache-spark-3-0-increase-the-performance-of-your-sql-workloads/

Kinh nghiệm của chúng tôi với Workload XM chắc chắn xác nhận tính thực tế và mức độ nghiêm trọng của những vấn đề đó.

AQE được giới thiệu lần đầu trong Spark 2.4 nhưng với Spark 3.0 thì nó được phát triển hơn nhiều. Mặc dù Cloudera khuyên bạn nên đợi để sử dụng nó trong sản xuất cho đến khi chúng tôi xuất xưởng Spark 3.1, nhưng AQE đã có sẵn để bạn bắt đầu đánh giá trong Spark 3.0 ngay bây giờ. 

Đầu tiên, hãy xem xét các loại vấn đề mà AQE giải quyết.

Sai sót trong thiết kế chất xúc tác ban đầu

Sơ đồ bên dưới đại diện cho kiểu xử lý phân tán xảy ra khi bạn thực hiện một truy vấn theo nhóm đơn giản bằng cách sử dụng DataFrames.

Thiết kế chất xúc tác

Spark xác định số lượng phân vùng thích hợp cho giai đoạn đầu tiên, nhưng đối với giai đoạn thứ hai, sử dụng số ma thuật mặc định là 200.

Điều đó tồi tệ vì ba lý do:

  1. 200 rất khó có thể là số lượng phân vùng lý tưởng và số lượng phân vùng là một trong những yếu tố quan trọng ảnh hưởng đến hiệu suất;
  2. nếu bạn ghi đầu ra của giai đoạn thứ hai đó vào đĩa, bạn có thể kết thúc với 200 tệp nhỏ;
  3. Các tính năng tối ưu hóa và sự vắng mặt của chúng có tác dụng phụ: nếu quá trình xử lý tiếp tục sau giai đoạn thứ hai, bạn có thể bỏ lỡ các cơ hội tiềm năng để tối ưu hóa hơn.

Những gì bạn có thể làm là đặt thủ công giá trị của thuộc tính này cho lần xáo trộn này trước khi thực hiện truy vấn của bạn bằng một câu lệnh như sau:

spark.conf.set (“spark.sql.shuffle.partitions”, ”2 ″)

Điều đó cũng tạo ra một số thách thức:

  • Đặt thuộc tính này trước mỗi truy vấn thật tẻ nhạt
  • Những giá trị đó sẽ trở nên lỗi thời với sự phát triển của dữ liệu của bạn
  • Cài đặt này sẽ được áp dụng cho tất cả các lần xáo trộn trong truy vấn của bạn

Trước giai đoạn đầu tiên trong ví dụ trước, sự phân bố và khối lượng dữ liệu đã được biết và Spark có thể đưa ra một giá trị hợp lý cho số lượng phân vùng. Tuy nhiên, đối với giai đoạn thứ hai, thông tin này vẫn chưa được biết đến là cái giá phải trả để có được nó là thực hiện quá trình xử lý thực tế của giai đoạn đầu tiên: do đó phải sử dụng đến một con số kỳ diệu. 

Nguyên tắc thiết kế thực thi truy vấn thích ứng

Ý tưởng chính của AQE là làm cho kế hoạch thực hiện không phải là cuối cùng và cho phép đánh giá ở từng ranh giới giai đoạn. Do đó, kế hoạch thực thi được chia nhỏ thành các phần trừu tượng "giai đoạn truy vấn" mới được phân định theo từng giai đoạn.

Giờ đây, Catalyst dừng lại ở từng ranh giới giai đoạn để thử và áp dụng các tối ưu hóa bổ sung dựa trên thông tin có sẵn trên dữ liệu trung gian.

Do đó, AQE có thể được định nghĩa là một lớp trên cùng của Spark Catalyst, lớp này sẽ sửa đổi kế hoạch Spark một cách nhanh chóng.

Bất kỳ nhược điểm? Một số, nhưng chúng là nhỏ:

  • Việc thực hiện dừng lại ở mỗi ranh giới giai đoạn để Spark xem xét kế hoạch của nó nhưng điều đó được bù đắp bởi những lợi ích về hiệu suất.
  • Giao diện người dùng Spark khó đọc hơn vì Spark tạo ra nhiều công việc hơn cho một ứng dụng nhất định và những công việc đó không chọn Nhóm công việc và mô tả mà bạn đã đặt.

Số phân vùng ngẫu nhiên thích ứng

Tính năng này của AQE đã có từ Spark 2.4.

Để kích hoạt nó, bạn cần đặt spark.sql.adaptive.enabled thành true , giá trị mặc định là false . Khi AQE được bật, số lượng phân vùng trộn sẽ tự động được điều chỉnh và không còn là giá trị mặc định 200 hoặc giá trị đặt thủ công.

Đây là cách thực thi truy vấn TPC-DS đầu tiên trông như thế nào trước và sau khi bật AQE:

Thực thi truy vấn TPC-DS

Tự động chuyển đổi sắp xếp Hợp nhất tham gia để truyền phát kết hợp

AQE chuyển đổi các phép nối hợp nhất sắp xếp thành các phép nối băm phát sóng khi thống kê thời gian chạy của bất kỳ phía tham gia nào nhỏ hơn ngưỡng tham gia băm phát sóng.

Đây là giai đoạn cuối cùng của quá trình thực thi truy vấn TPC-DS thứ hai trông như thế nào trước và sau khi bật AQE:

TPC-DS thứ hai

Phân vùng ngẫu nhiên kết hợp động

Nếu số lượng phân vùng xáo trộn lớn hơn số lượng của nhóm theo khóa thì rất nhiều chu kỳ CPU bị mất do sự phân bố không cân bằng của các khóa

Khi cả hai 

  • tia lửa . sql . thích nghi . được kích hoạt và 
  • tia lửa . sql . thích nghi . kết hợp lạiPartitions . được kích hoạt 

được đặt thành true , Spark sẽ kết hợp các phân vùng trộn liền kề theo

đến kích thước mục tiêu được chỉ định bởi spark.sql.adaptive.advisoryPartitionSizeInBytes để tránh quá nhiều tác vụ nhỏ.

Tự động tối ưu hóa các liên kết bị lệch

Skew là Kryptonite của quá trình xử lý phân tán. Nó thực sự có thể làm ngưng trệ quá trình xử lý của bạn trong nhiều giờ:

Nếu không có tối ưu hóa, thời gian cần thiết để thực hiện phép nối sẽ được xác định bởi phân vùng lớn nhất.

Do đó, tối ưu hóa kết hợp xiên sẽ chia phân vùng A0 thành các tiêu đề con bằng cách sử dụng giá trị được chỉ định bởi spark.sql.adaptive.advisoryPartitionSizeInBytes và nối từng phân vùng đó với phân vùng B0 tương ứng của bảng B.

Do đó, bạn cần cung cấp AQE với định nghĩa của bạn về độ lệch.

Điều này liên quan đến hai thuộc tính:

  1. spark.sql.adaptive.skewJoin.skewedPartitionFactor là tương đối: một phân vùng được coi là lệch nếu kích thước của nó lớn hơn hệ số này nhân với kích thước phân vùng trung bình và cũng lớn hơn
  2. spark.sql.adaptive.skewedPartitionThresholdInBytes , là tuyệt đối: đó là ngưỡng bên dưới mà độ lệch sẽ bị bỏ qua.

Cắt tỉa phân vùng động

Ý tưởng cắt tỉa phân vùng động (DPP) là một trong những kỹ thuật tối ưu hóa hiệu quả nhất: chỉ đọc dữ liệu bạn cần. DPP không phải là một phần của AQE, trên thực tế, AQE cần được vô hiệu hóa để DPP diễn ra. Mặt tích cực, điều này cho phép DPP được backport sang Spark 2.4 cho CDP.

Việc tối ưu hóa này được thực hiện cả trên phương án logic và phương án vật lý.

  1. Ở cấp độ logic, bộ lọc chiều được xác định và truyền qua phần nối sang phía bên kia của quá trình quét.
  2. Sau đó, ở cấp vật lý, bộ lọc được thực thi một lần ở phía thứ nguyên và kết quả được truyền tới bảng chính nơi bộ lọc cũng được áp dụng.

DPP thực sự có thể hoạt động với các loại liên kết khác (ví dụ: SortMergeJoin) nếu bạn tắt spark.sql.optimizer.dynamicPartitionPruning.reuseBroadcastOnly . 

Trong trường hợp đó, Spark sẽ ước tính xem liệu bộ lọc DPP có thực sự cải thiện hiệu suất truy vấn hay không.

Ví dụ: DPP có thể dẫn đến tăng hiệu suất lớn cho các truy vấn có tính chọn lọc cao nếu truy vấn của bạn lọc trên một tháng duy nhất trong số 5 năm dữ liệu.

DPP và mặc định

Không phải tất cả các truy vấn đều có được hiệu suất tăng ấn tượng như vậy nhưng 72 trong số 99 truy vấn TPC-DS đều bị ảnh hưởng tích cực bởi DPP.

Phần kết luận

Spark đã đi được một chặng đường dài từ mô hình cốt lõi ban đầu của nó: thực hiện một cách lười biếng một kế hoạch tĩnh được tối ưu hóa trên một tập dữ liệu tĩnh.

Phần tập dữ liệu tĩnh đã bị thách thức bằng cách phát trực tuyến: nhóm Spark đầu tiên tạo ra một thiết kế dựa trên RDD vụng về trước khi đưa ra một giải pháp tốt hơn liên quan đến DataFrames.

Theo một cách nào đó, phần kế hoạch tĩnh đã bị thách thức bởi SQL và khuôn khổ Thực thi Truy vấn Thích ứng, theo một cách nào đó, Truyền có cấu trúc là gì đối với thư viện phát trực tuyến ban đầu: giải pháp thanh lịch mà lẽ ra phải có.

Với khuôn khổ AQE, DPP và sự hỗ trợ tăng cường cho GPU và Kubernetes, triển vọng tăng hiệu suất là rất hứa hẹn và chúng ta sẽ thấy việc áp dụng nhanh chóng Spark 3.0. Nếu bạn muốn có kinh nghiệm thực tế với AQE, cũng như các công cụ và kỹ thuật khác để làm cho công việc Spark của bạn chạy ở hiệu suất cao nhất, hãy đăng ký khóa học Điều chỉnh hiệu suất Apache Spark của Cloudera .

bigdata 2021/1/18 11:04

Để 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