Apache Spark / الأساسي: أسس علاقية ذات أنواع / الدرس 1
المشغّل والمنفذون والخطط الكسولة
حدّد موضع عملية DataFrame داخل تنفيذ Spark، وميّز بناء خطة الحساب عن حساب نتيجتها.
في هذه الصفحة
أهداف الدرس
- اشرح التطبيق والمشغّل والمنفذ والقسم والمهمة.
- ميّز التحويلات والأفعال والنتائج التي تعود إلى المشغّل.
ينسق التطبيق عملاً موزعاً
تتلقى تعاونية للطاقة الشمسية قراءات عدادات من مواقع كثيرة. يستطيع Spark معالجة المجموعة كتطبيق واحد، مع توزيع العمل على أقسام. ينسق المشغّل driver التطبيق ويبني خطط التنفيذ، بينما تشغّل العمليات المنفذة executors المهام وتحتفظ ببيانات العمل ذات الصلة. يخصص مدير العنقود الموارد، لكنه لا يقرر المعنى التجاري للكيلوواط ساعة. قد يعمل التطبيق محلياً للتعلم المستقل، أو يُنشر ضمن بيئات عنقودية مدعومة. ولا يجعل أي من الخيارين Spark تلقائياً قاعدة بيانات العدادات المعتمدة. حدّد اكتمال المصدر وهوية القراءة وكيفية نشر المخرج بصورة مستقلة عن بنية التنفيذ.
يصف DataFrame عملية حسابية
يمثل DataFrame صفوفاً بأعمدة مسماة ذات أنواع، وخطة منطقية. عادة يبني اختيار الأعمدة أو تصفية الصفوف خطة أخرى، من دون مسح كل المدخلات فوراً. يتيح هذا التنفيذ الكسول تحسين سلسلة العمليات قبل تشغيلها. يفترض المقطع جلسة SparkSession اسمها spark أُجيز استخدامها مسبقاً، وينشئ علاقة اصطناعية من قيم محلية. ليس برنامجاً مستقلاً، ولذلك يحمل runnable:false. لا تبدأ الدورة SparkSession أو عملية Java أو عنقوداً. كما أن تسمية متغير filtered لا تثبت أن صفوفه قُيمت، أو أن أخطاء المصدر كان يجب أن تظهر بالفعل.
readings = spark.createDataFrame(
[('north', 2), ('south', 4), ('north', 3)],
'site STRING, kwh INT'
)
filtered = readings.where('kwh >= 3').select('site', 'kwh')
يحتوي مجتمع التصفية المنطقي south=4 وnorth=3. تبني التحويلات خطة؛ ولا يُدعى تنفيذها على المحرك.
ينشئ الفعل حد تنفيذ
يطلب فعل مثل count أوcollect أوالكتابة من Spark إنتاج نتيجة. ويمكن للمحرك تقسيم العمل إلى وظائف jobs ومراحل stages ومهام tasks وفق الخطة وحدود shuffle؛ فلا يقابل السطر الواحد في المصدر مرحلة واحدة بالضرورة. وقد يؤدي تكرار الأفعال إلى إعادة الحساب ما لم يُستخدم حفظ مناسب أو آلية إعادة استخدام أخرى. يعيد count قيمة مفردة صغيرة إلى المشغّل، بينما يجلب collect كل الصفوف المختارة وقد يستنفد ذاكرته. وليس كل ما يتسع موزعاً على المنفذين قابلاً للاحتواء في المشغّل. استخدم نتائج تشخيص محدودة، وانشر المخرجات الكبيرة بصورة موزعة.
filtered.explain(mode='formatted')
# In an independent authorized lab only:
result_count = filtered.count()
2
يصف explain خطة، بينما يعيد count القيمة2 لهذه البيانات الثابتة إذا نُفذ. لم يُستدع أي منهما أثناء التأليف.
القسم وحدة عمل لا مفتاح أعمال
يحوي القسم جزءاً من البيانات الموزعة، وتعالجه عادة مهمة واحدة في مرحلة معينة. قد يظهر الموقع نفسه في عدة أقسام إدخال، ولا يعادل الملف المادي دائماً قسماً واحداً في Spark. وقد يحتاج التجميع أو الربط بالموقع إلى إعادة توزيع الصفوف حتى تلتقي المفاتيح المرتبطة. تسمى هذه الحركة shuffle، ولها آثار في الشبكة والتسلسل والتخزين. قد تنفق التطبيقات ذات الأقسام الصغيرة الكثيرة وقتاً في الجدولة، بينما يهيمن قسم ضخم واحد على زمن الإكمال. اختر التقسيم من أدلة الحمل المرصود، لا من عدد صفوف عام لكل مهمة.
سمِّ حدود البيئة بدقة
تستخدم الدورة وثائق Apache Spark 4.0.1 ومقاطع PySpark أوSpark SQL كأساس تعليمي مسمى. تذكر وثائق هذا الإصدار Java 17 أو21 وScala 2.13 وPython 3.9 فأحدث؛ وليست هذه تعليمات تثبيت أو ادعاءات تخص كل منصة مدارة. يفصل Spark Connect العميل عن الخادم بطريقة تختلف عن PySpark التقليدي، فلا تنتقل إليه تلقائياً افتراضات RDD أوSparkContext منخفضة المستوى. لا تُثبت هنا تبعيات. المخرجات المتوقعة نتائج منطقية للبيانات التجريبية، وأي نماذج Python آمنة تُستخدم في التحقق منفصلة صراحة عن تنفيذ Spark الفعلي.
الأخطاء الشائعة وإصلاحها
يُفترض أن التحويل تحقق من كل بيانات المصدر
- لماذا يحدث؟
- اختلط بناء الخطة الكسول بتقييم البيانات عند تنفيذ فعل.
- كيف تصلحه؟
- حدّد حد التنفيذ، وتحقق من المدخل المقصود أثناء تشغيل مصرح به.
- كيف تتجنب تكراره؟
- وثق الفحوص التي تتطلب تقييم بيانات المصدر.
يستنفد collect ذاكرة المشغّل
- لماذا يحدث؟
- نُقلت النتيجة الموزعة كاملة إلى عملية واحدة.
- كيف تصلحه؟
- استخدم فحصاً محدوداً أو نشراً موزعاً.
- كيف تتجنب تكراره؟
- ضع ميزانية لنتائج المشغّل مستقلة عن تخزين المنفذين.
يُفترض أن الموقع يشغل قسم إدخال واحداً
- لماذا يحدث؟
- اختلطت هوية الأعمال بتنظيم المدخلات المادي.
- كيف تصلحه؟
- افحص توزيع المفاتيح المطلوب والخطة.
- كيف تتجنب تكراره؟
- افصل مستوى التفصيل المنطقي عن التقسيم المادي.
اختبر فهمك
1. لماذا لا يثبت إسناد filtered أن الصفوف المعيبة في المصدر قد قُرئت؟
اعرض الحل المشروح
يبني الإسناد عادة خطة منطقية. يحدث التقييم عندما يحتاج فعل إلى البيانات، وقد تتجنب بعض التحسينات قراءة حقول أو صفوف غير مستخدمة. ضع التحقق عند حد تقييم مقصود، وسجل نطاقه. لا تدّع جودة المصدر لمجرد وجود متغير DataFrame.
2. ماذا يعيد count للمثال ذي القراءات الثلاث بعد تطبيق kwh >= 3؟
اعرض الحل المشروح
يتأهل صفان: south بقيمة4 وnorth بقيمة3. يحدد هذا الاستدلال المحلي العدد المتوقع، لا عدد المنفذين أو المهام أو المراحل الذي سيختاره Spark. تحتاج تلك التفاصيل المادية إلى الخطة الفعلية وأدلة تشغيل مصرح بها.
أهم ما تعلمته
- الخطة المنطقية والنتيجة المنفذة أثران مختلفان.
- ذاكرة المشغّل والسعة الموزعة ميزانيتان مستقلتان.