Apache Spark / المتوسط: التوزيع وأدلة التنفيذ / الدرس 9
تنظيم Parquet ونشر المخرجات بأمان
صمم مجموعات ملفات بحدود صريحة للمخطط وتقليص القراءة والنشر والتعافي.
في هذه الصفحة
أهداف الدرس
- افصل تقليص الأعمدة واكتشاف الأقسام وتنظيم المخرج.
- اشرح لماذا لا تكوّن كتابة الملفات العادية جدولاً معاملاتياً عاماً.
تفيد الصيغة العمودية أحمال الأعمدة المختارة
تخزن Parquet البيانات بصيغة عمودية، مع مخطط وبيانات تعريف يستفيد منها القارئ. إذا احتاج التقرير site_id وkwh فقط، فاخترهما بدلاً من نقل كل حمولة التشخيص. قد يقلل تقليص الأعمدة ودفع الشروط المدعومة العمل، لكن أثرهما الفعلي يعتمد على المصدر والتعبير والخطة. ويغير الضغط أيضاً العلاقة بين بايتات الملف وحجم البيانات في الذاكرة. ليس صغر المجلد المضغوط دليلاً على ملاءمة collect لذاكرة المشغّل. راجع الصيغة والمخطط ومتطلبات الاستعلام معاً، وتحقق من مسار القراءة الفعلي؛ فلا يضمن امتداد الملف وحده التنفيذ الأمثل.
اقرأ صورة مقصودة بأعمدة محددة
يفترض مقطع PySpark مجلداً اصطناعياً يتضمن مخططه reading_day من نوع تاريخ. يبني خطة تختار يوماً واحداً وثلاثة أعمدة. يستطيع القارئ اكتشاف أعمدة الأقسام من تنظيم مجلدات مدعوم، لكن قراءة مجلد فرعي وحده أو اختيار مسار أساس غير صحيح قد يغير الاكتشاف. افحص المخطط والخطة الناتجين قبل تفسير غياب عمود قسم. لم يُفتح مجلد هنا. ويجب أن يثبت جرد الملفات لدفعة منشورة؛ فالمجلد الذي يعدله كاتب آخر أثناء التشغيل لا يصبح تلقائياً صورة مصدر متسقة.
daily = (spark.read.parquet('lab-input/curated-readings')
.where("reading_day = DATE '2026-10-01'")
.select('site_id', 'reading_id', 'kwh'))
daily.explain(mode='formatted')
خطة توضيحية على مجلد مختبر خيالي. يحدد المحرك أثر تقليص القراءة الفعلي، ولم يُقَس هنا.
اختر المجلدات وفق طريقة الاستهلاك اللاحقة
تنشئ partitionBy حسب reading_day مجلدات يومية عند الكتابة، ولا تَعِد بملف مادي واحد لكل يوم. تزيد الملفات الصغيرة الكثيرة تكلفة عرض الملفات وفتحها، وقد يقلل ملف ضخم واحد التوازي المفيد. كما قد ينشئ تقسيم المجلدات حسب معرّفات العدادات الكثيرة عدداً مفرطاً من المجلدات. اختر تنظيماً محدوداً وفق الشروط الشائعة واحتياجات الاحتفاظ، واضبط أقسام التنفيذ بصورة مستقلة. وليس دمج المخطط مطابقة دلالية مجانية؛ فتغيير الوحدة تحت اسم العمود نفسه خرق للعقد حتى إذا أمكن قراءة بيانات تعريف كل ملف.
انشر إصداراً جديداً بدلاً من الاستبدال العابر
تستخدم الكتابة التوضيحية errorifexists في مسار دفعة اصطناعية جديد، ولذلك لا توصي باستبدال مجموعة بيانات مهيأة. وفي نظام معتمد فعلياً، لا تكفي كتابة ناجحة؛ بل تلزم مطابقة أعداد المصدر وخطوة نشر متفق عليها قبل استخدام القراء لها. قد يكون مخرج Spark مجلداً من ملفات أجزاء وبيانات تعريف، لا ملف CSV أوParquet واحداً باسمه. ولسلوك تثبيت الكتابة في تخزين الكائنات وموصلاته متطلبات خاصة بالنشر. ولا توفر Parquet العادية بذاتها معاملات ACID متعددة الكتّاب أوتاريخ تراجع أوحوكمة كتالوج؛ وقد تضيف صيغ جداول خارجية ذلك بضماناتها الخاصة.
(curated.write.mode('errorifexists')
.partitionBy('reading_day')
.parquet('lab-output/readings-batch-20261001-v1'))
مقطع كتابة توضيحي فقط؛ لم يُنشأ مسار أو يُغير. ولا يُدعى عدد ملفات أو سلوك تثبيت معين.
تحتاج المجموعة القابلة للقراءة بياناً يعيد إنتاجها
سجل هوية دفعة المصدر وإصدار المخطط وأعداد الصفوف والمرفوضات وموقع المخرج وإصدار النشر. تحقق من مفاتيح ممثلة ومجاميع الطاقة، لا حالة مهمة ناجحة فقط. وإذا وقع إخفاق بعد وجود بعض الملفات، فاتبع بروتوكول التثبيت والتنظيف المختار، لا حذف مسارات مشتركة اعتباطياً. أبقِ القراء على آخر إصدار متحقق منه حتى قبول الجديد. لا تقرأ الدورة ملفات أوتكتبها أوتحذفها ولا تقيس التخزين. يفحص التحقق بالمكتبة القياسية نص الخطة ونماذج بيانات تعريف آمنة فقط، ولا يدعي اختبار محرك Parquet أوتخزين كائنات.
الأخطاء الشائعة وإصلاحها
يُتوقع أن يحوي مجلد اليوم ملفاً واحداً
- لماذا يحدث؟
- اختلط تقسيم المجلدات المنطقي بمخرجات المهام.
- كيف تصلحه؟
- افحص جرد الملفات الناتجة وعقد المستهلك.
- كيف تتجنب تكراره؟
- راجع عدد المجلدات وتكلفة الملفات الصغيرة مستقلين.
يُملأ عمود قسم غائب بقيم مخمنة
- لماذا يحدث؟
- لم يُتحقق من مسار القراءة أوأساس اكتشاف الأقسام.
- كيف تصلحه؟
- افحص نطاق المجلد وحاجة basePath والمخطط الفعلي.
- كيف تتجنب تكراره؟
- اختبر قراءة الجذر والمجلد الفرعي الممثلين بمختبر مصرح.
يُعامل استبدال ناجح كخطة تراجع
- لماذا يحدث؟
- اختلط استبدال الملفات بتاريخ معاملاتي ذي إصدارات.
- كيف تصلحه؟
- حدد النشر ذي الإصدارات والتعافي المدعوم صراحة.
- كيف تتجنب تكراره؟
- تحقق من ضمانات الموصل وصيغة الجدول قبل الاعتماد عليها.
اختبر فهمك
1. هل تضمن partitionBy("reading_day") ملف Parquet واحداً لكل يوم؟
اعرض الحل المشروح
لا. تحدد تنظيم المجلدات؛ وتحدد المهام وسلوك الكاتب وعوامل أخرى الملفات. راجع تقليص القراءة اللاحقة وجرد الملفات معاً. قد ينشئ مفتاح مجلدات كثير القيم تكلفة تشغيلية حتى مع نجاح الكتابة.
2. ماذا يفعل القراء إذا كُتب إصدار دفعة جديد جزئياً فقط؟
اعرض الحل المشروح
يواصلون استخدام آخر إصدار منشور متحقق منه وفق البروتوكول. طابق الدفعة وأكمل تثبيتها أوتعافيها المدعوم قبل التحويل. لا تستنتج ذرية النشر من وجود مجلد فحسب.
أهم ما تعلمته
- صيغة الملفات وتنظيم المجلدات وضمانات النشر مسائل منفصلة.
- يدعم بيان دفعة متحقق منه الإصلاح وإعادة الإنتاج.