ホームページ / テクノロジーの最新情報

Native Execution Engine của Fabric: Tăng tốc Python UDF đến 5.76 lần

Microsoft vừa công bố một cải tiến quan trọng cho Native Execution Engine (NEE) trên nền tảng Microsoft Fabric, giúp tăng tốc đáng kể các workload Spark sử dụng hàm do người dùng định nghĩa (UDF – User-Defined Function) bằng Python/Scala và các kiểu dữ liệu phức tạp. Cải tiến này có thể giúp tăng hiệu năng xử lý lên đến 5.76 lần mà không yêu cầu thay đổi mã nguồn, mang lại lợi ích trực tiếp về chi phí và thời gian cho các doanh nghiệp.

Ví dụ, một pipeline dữ liệu (ETL) xử lý các sự kiện dạng JSON có chứa các mảng dữ liệu lồng nhau. Nếu pipeline này sử dụng UDF Python để áp dụng logic nghiệp vụ riêng, trước đây nó sẽ gặp hai nút thắt hiệu năng: UDF buộc phải tuần tự hóa dữ liệu (serialization) giữa JVM và một Python worker, và dữ liệu lồng nhau khiến engine chuyển từ xử lý theo cột (columnar) tối ưu sang xử lý theo hàng (row-based) chậm hơn. Với NEE được kích hoạt, cả hai hoạt động này đều chạy trên luồng thực thi gốc, giúp tăng tốc độ từ 2 đến 5 lần.

Nút thắt hiệu năng của UDF và dữ liệu phức tạp

Trong quá trình thực thi Spark tiêu chuẩn, các UDF viết bằng Python hoặc Scala yêu cầu engine phải thực hiện nhiều bước tốn kém:

  • Tuần tự hóa (serialize) các hàng từ định dạng nội bộ của Spark.
  • Chuyển dữ liệu sang một tiến trình Python worker riêng biệt.
  • Thực thi UDF, sau đó tuần tự hóa kết quả trở lại JVM.

Mỗi vòng lặp như vậy làm tăng chi phí CPU, áp lực bộ nhớ và phá vỡ cơ chế thực thi vector hóa (vectorized execution). Tương tự, các kiểu dữ liệu phức tạp (mảng, map, struct) có thể buộc engine phải từ bỏ đường dẫn columnar được tối ưu hóa để chuyển sang xử lý theo hàng, làm mất đi lợi ích của việc thực thi gốc cho phần còn lại của truy vấn. Do đó, các đội ngũ kỹ sư thường phải tránh dùng UDF hoặc làm phẳng (flatten) các schema lồng nhau, gây tốn thêm công sức phát triển.

Native Execution Engine giải quyết vấn đề như thế nào

Native Execution Engine (NEE) của Microsoft Fabric xử lý các UDF Python/Scala và các kiểu dữ liệu phức tạp trực tiếp trong engine columnar gốc. Cụ thể:

  • Với UDF Python hoặc Scala: Engine giảm thiểu các vòng lặp tuần tự hóa giữa JVM và Python, giữ dữ liệu ở định dạng columnar lâu hơn. Các vectorized UDFs (UDF được vector hóa) nhận được lợi ích lớn nhất, nhưng các UDF tiêu chuẩn cũng được cải thiện.
  • Với kiểu dữ liệu phức tạp: Các kiểu dữ liệu như mảng (array), map và struct được xử lý nguyên bản trong engine columnar. Các toán tử như explode, truy cập map, và trích xuất trường struct không còn buộc engine phải chuyển về chế độ thực thi theo hàng.

Điều quan trọng nhất là các notebook và job Spark hiện có của doanh nghiệp sẽ tự động hưởng lợi khi NEE được bật mà không cần thay đổi code hay học API mới.

Những con số cải thiện hiệu năng thực tế

Các bài kiểm tra nội bộ của Microsoft trên các workload tiêu biểu cho thấy:

  • Vectorized UDFs bằng Python hoặc Scala: nhanh hơn tới 5.76 lần.
  • Các UDF phức tạp: nhanh hơn từ 1.08 đến 2.5 lần tùy thuộc vào độ phức tạp.
  • Workload TPC-DS end-to-end (bao gồm các truy vấn với kiểu dữ liệu phức tạp): thực thi nhanh hơn tới 2.35 lần.

Các bài benchmark này được chạy trên các dataset quy mô sản xuất sử dụng cấu hình cluster điển hình của doanh nghiệp.

Biểu đồ so sánh hiệu năng của Native Execution Engine trên Microsoft Fabric, cho thấy thời gian thực thi giảm đáng kể.

Đây là những cải tiến có ý nghĩa đối với kỹ thuật dữ liệu quy mô doanh nghiệp:

  • Pipeline ETL nhanh hơn.
  • Giảm thời gian tính toán của cluster.
  • Có khả năng giảm chi phí vận hành.
  • Cải thiện hiệu năng phân tích tương tác.

Hỗ trợ gốc cho các kiểu dữ liệu phức tạp

Native Execution Engine của Fabric cũng bổ sung hỗ trợ tối ưu hóa cho các kiểu dữ liệu Arrays, Maps, và Structs. Điều này cho phép các pipeline duy trì tối ưu hóa hoàn toàn mà không cần chuyển đổi chế độ thực thi. Các hoạt động liên quan đến dữ liệu lồng nhau giờ đây có thể hưởng lợi từ các tối ưu hóa gốc trong khi vẫn giữ được sự linh hoạt mà các lập trình viên mong đợi từ Spark. Điều này đặc biệt hữu ích cho các kịch bản tối ưu hóa lakehouse nâng cao như Z-ORDER, liquid clustering và phân tích dữ liệu bán cấu trúc.

Tầm quan trọng cho tương lai ngành kỹ thuật dữ liệu

Các workload phân tích đang phát triển để bao gồm AI, ra quyết định thời gian thực, dữ liệu bán cấu trúc, và tầm quan trọng ngày càng tăng của Python. Khi các workload vượt ra ngoài BI truyền thống, các engine hiệu năng không thể chỉ tập trung vào việc tăng tốc các truy vấn SQL đơn giản.

Native Execution Engine của Fabric phản ánh sự thay đổi này. Nó được thiết kế không chỉ để tăng tốc SQL cổ điển, mà còn cho thế hệ workload phân tích tiếp theo đòi hỏi sự linh hoạt, quy mô và hiệu năng thực thi cao trên các mô hình lập trình đa dạng. Doanh nghiệp không còn phải đánh đổi sự linh hoạt để lấy hiệu năng.

Bắt đầu sử dụng

Để tận dụng những cải tiến này, doanh nghiệp có thể thực hiện các bước sau:

  1. Bật Native Execution Engine: Đi tới Workspace Settings > Data Engineering/Science > Spark Settings > Environment. Thay đổi môi trường mặc định sang môi trường đã bật Native Execution Engine.
  2. Chạy workload của bạn: Thực thi một notebook hoặc Spark job hiện có đang sử dụng UDF hoặc các kiểu dữ liệu phức tạp.
  3. Xác minh thực thi gốc: Kiểm tra các cảnh báo nội tuyến để xác nhận không có cảnh báo về việc chuyển đổi (fallback), cho thấy các hoạt động đang chạy trên engine gốc.

👋 Hi! Bạn cần tư vấn gì về dịch vụ Microsoft?