الحاجة إلى تحسين الكتابة على Apache Spark

تعمل أحمال العمل التحليلية على محركات معالجة البيانات الكبيرة مثل Apache Spark بشكل أكثر كفاءة عند استخدام أحجام ملفات أكبر قياسية. تلعب العلاقة بين حجم الملف وعدد الملفات وعدد عمال Spark وتكويناته دورًا مهمًا في الأداء. يمكن أن يكون لأحمال عمل الاستيعاب في جداول مستودع البيانات السمة الموروثة لكتابة الكثير من الملفات الصغيرة باستمرار؛ يعرف هذا السيناريو عادة باسم "مشكلة الملف الصغير".

تحسين الكتابة هي ميزة Delta Lake على Synapse التي تقلل من عدد الملفات المكتوبة وتهدف إلى زيادة حجم الملف الفردي للبيانات المكتوبة. إنه يحسن الأقسام ديناميكيا أثناء إنشاء الملفات بحجم افتراضي 128 ميغابايت. قد يتم تغيير حجم الملف الهدف لكل متطلبات حمل العمل باستخدام التكوينات.

تحقق هذه الميزة حجم الملف باستخدام مرحلة تبديل بيانات إضافية عبر الأقسام، ما يتسبب في تكلفة معالجة إضافية أثناء كتابة البيانات. يجب أن تفوق عقوبة الكتابة الصغيرة كفاءة القراءة على الجداول.

إشعار

  • وهو متوفر على Synapse Pools لإصدارات Apache Spark أعلى من 3.1.

ميزات تحسين الكتابات

  • وهي متوفرة على جداول Delta Lake لكل من أنماط الكتابة الدفعية والدفقية.
  • ليست هناك حاجة لتغيير نمط الأمر spark.write. يتم تمكين الميزة بواسطة إعداد تكوين أو خاصية جدول.
  • فهي تقلل من عدد معاملات الكتابة مقارنة بأمر OPTIMIZE.
  • ستكون عمليات OPTIMIZE أسرع لأنها ستعمل على ملفات أقل.
  • سيعمل أمر VACUUM لحذف الملفات القديمة غير المنسوخة أيضًا بشكل أسرع.
  • ستقوم الاستعلامات بمسح عدد أقل من الملفات بأحجام ملفات أكثر مثالية، مما يؤدي إلى تحسين أداء القراءة أو استخدام الموارد.

تحسين سيناريوهات استخدام الكتابة

متى يتم استخدامها

  • تخضع الجداول المقسمة في Delta lake لأنماط الكتابة التي تنشئ أحجام ملفات دون المستوى الأمثل (أقل من 128 ميغابايت) أو أحجام ملفات غير قياسية (ملفات ذات أحجام مختلفة بينها).
  • إعادة تقسيم إطارات البيانات التي ستتم كتابتها إلى القرص بحجم ملفات دون المستوى الأمثل.
  • جداول Delta lake المقسمة التي تستهدفها أوامر SQL الدفعية الصغيرة مثل UPDATE وDELETE وMERGE وCREATE TABLE AS SELECT وINSERT INTO وما إلى ذلك.
  • سيناريوهات استيعاب الدفق مع أنماط بيانات الإلحاق بالجداول المقسمة في Delta lake حيث يكون زمن الانتقال الإضافي للكتابة مقبولاً.

متى يجب تجنبها

  • جداول غير مقسمة.
  • استخدم الحالات التي يكون فيها زمن انتقال الكتابة الإضافي غير مقبول.
  • جداول كبيرة ذات جداول تحسين محددة جيدًا وأنماط قراءة.

كيفية تمكين وتعطيل ميزة تحسين الكتابة

يتم تعطيل ميزة تحسين الكتابة بشكل افتراضي. في Spark 3.3 Pool، يتم تمكينه افتراضيا للجداول المقسمة.

بمجرد تعيين التكوين للتجمع أو جلسة العمل، ستستخدم جميع أنماط كتابة Spark الوظيفة.

لاستخدام ميزة تحسين الكتابة، قم بتمكينها باستخدام التكوين التالي:

  1. Scala وPySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true

للتحقق من قيمة التكوين الحالية، استخدم الأمر كما هو موضح:

  1. Scala وPySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`

لتعطيل ميزة تحسين الكتابة، قم بتغيير التكوين التالي كما هو موضح:

  1. Scala وPySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false

التحكم في تحسين الكتابة باستخدام خصائص الجدول

على جداول جديدة

  1. SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

استخدام واجهة برمجة تطبيقات DeltaTableBuilder:

val table = DeltaTable.create()
  .tableName("<table_name>")
  .addColumnn("<colName>", <dataType>)
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

في الجداول الموجودة

  1. SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

استخدام واجهة برمجة تطبيقات DeltaTableBuilder

val table = DeltaTable.replace()
  .tableName("<table_name>")
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

كيفية الحصول على تغيير تكوين حجم الملف الأقصى الحالي لتحسين الكتابة

للحصول على قيمة التكوين الحالية، استخدم الأوامر أدناه. القيمة الافتراضية هي 128 ميغابايت.

  1. Scala وPySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • لتغيير قيمة التكوين
  1. Scala وPySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

الخطوات التالية