أسئلة مقابلة PySpark
بقلم Aaron Cao · آخر تحديث

تتركز مقابلات PySpark على نموذج التنفيذ وعلى الأداء. توقع أن تشرح الفرق بين transformation وaction، وأن تحدد أي العمليات تسبب shuffle، وأن تختار broadcast join، وأن تشخص data skew، وأن تبرر استخدام caching، وأن تصف كيف تضبط job ينفد منه الذاكرة.
بماذا يسأل القائمون على المقابلة عن نموذج التنفيذ؟
يمكنك كتابة كود PySpark يعمل وتتعثر هنا رغم ذلك، لأن هذه الأسئلة تسأل عما يفعله المحرك لا عما يقوله كودك. يفتح القائمون على المقابلة بها تحديدا لأنها تفصل بين من ضبط job فعلا ومن شغله فقط. يغطي هذا القسم أسئلة النموذج وما تتضمنه الإجابة الكاملة.
- transformation أم action، ما الفرق؟ تبني transformation خطة وتعيد DataFrame جديدا بشكل lazy؛ أما action مثل
countأوcollectأو عملية write فتشغل التنفيذ. لا يُحسب شيء حتى يطلب action نتيجة. - لماذا يفيد laziness؟ يرى optimizer السلسلة كاملة قبل تشغيلها، فيستطيع إعادة ترتيب الفلاتر وتقليم الأعمدة ودمج الخطوات.
- تحويل narrow أم wide؟ عمليات narrow مثل
filterوselectتُبقي كل partition ناتجة معتمدة على partition إدخال واحدة. عمليات wide مثلgroupByوjoinوdistinctتعيد توزيع البيانات بين partitions، وهذا هو shuffle. - ما shuffle ولماذا يهم؟ تنتقل البيانات عبر الشبكة وتلامس القرص، مكونة حدا بين stages. غالبا ما تكون أكثر ما يكلف job.
- اشرح job وstage وtask. يبدأ action وظيفة job، وحدود shuffle تقسمها إلى stages، ويشغل كل stage task واحدا لكل partition.
- RDD أم DataFrame أم Dataset؟ فضل DataFrame، لأن Catalyst optimizer والتنفيذ العمودي ينطبقان هناك. تبقى RDD للتحكم منخفض المستوى. Dataset المكتوبة النوع مفهوم خاص بـ JVM، فالإجابة الصادقة في Python أنها لا تنطبق.
انطق كلمتي shuffle وstage عندما تناسبان الإجابة. يستخدمهما القائمون على المقابلة كطريقة سريعة لمعرفة هل قرأت Spark UI من قبل.
كيف تجيب عن أسئلة الأداء؟
معظم مقابلات PySpark لمستوى senior هي مقابلات أداء. تصل الأسئلة كسيناريوهات لا كتعريفات.
- join بطيء. ماذا تتحقق منه؟ حجم كل طرف أولا. إذا كان أحدهما يتسع في ذاكرة executor، اعمل له broadcast وتجنب shuffle تماما. وإلا فانظر إلى partitioning وskew قبل المساس بحجم الكلاستر.
- ما data skew وكيف تصلحه؟ عدد قليل من key يحتفظ بمعظم الصفوف، فيعمل task واحد طويلا بعد انتهاء البقية. تشمل الحلول salting للـ hot key، أو broadcast للطرف الصغير، أو تصفية قيم null التي تُجزأ hash كلها إلى نفس المكان. الإشارة التشخيصية هي تشتت مدة task في Spark UI.
- متى تعمل cache أو persist؟ عندما يعاد استخدام DataFrame عبر عدة action وتكون إعادة الحساب مكلفة. عمل cache لشيء يُستخدم مرة واحدة يهدر الذاكرة، وunpersist مهم في jobs الطويلة.
- repartition أم coalesce؟ repartition يعمل shuffle ويمكنه زيادة أو تقليل partitions بالتساوي؛ أما coalesce فيدمج دون shuffle كامل، وهي الطريقة الأرخص لتقليل ملفات الإخراج.
- لماذا تتجنب UDF بلغة Python؟ تُسلسل الصفوف بين JVM وعملية Python، ولا يرى optimizer داخل الدالة. فضل الدوال built-in، ولا تلجأ إلى vectorized UDF إلا حين لا توجد دالة built-in.
- لماذا يُعد
collectخطيرا؟ يسحب النتيجة كاملة إلى driver وقد يستنفد ذاكرته. - فشل job بخطأ out of memory. ما ترتيب تحقيقك؟ هل هو driver أم executor، ثم skew، ثم حجم partition، ثم إعدادات الذاكرة. رفع الذاكرة كخطوة أولى إجابة تدل على قلة الخبرة.
سُئل data engineer كان يجري مقابلة لفريق platform لماذا استغرقت job ليلية كانت تعمل منذ سنة أربع ساعات فجأة. لم تكن الإجابة الصحيحة تغييرا في الإعدادات، بل أن شريكا upstream بدأ بإرسال قيم null في join key، فتحول كل صف null بنفس hash إلى partition واحدة. يكافئ القائمون على المقابلة هذا الترتيب: انظر إلى البيانات قبل الكلاستر.
توجد بنوك أسئلة ذات صلة حسب الدور تحت interview questions by role.
ما الأسئلة العملية وأسئلة معالجة البيانات التي تظهر؟
تتحقق الأسئلة المتبقية مما إذا كنت قد أطلقت pipeline فعلا وليس فقط أنهيت tutorial.
- كيف تقرأ البيانات بكفاءة؟ صيغ عمودية مثل Parquet، وpartition pruning على عمود الفلتر، وpredicate pushdown. اشرح لماذا قراءة بايتات أقل أفضل من تحسين ما يحدث بعد ذلك.
- لماذا تعرّف schema بدلا من ترك النظام يستنتجه؟ يكلف الاستنتاج مرورا إضافيا على البيانات وقد يخمن الأنواع بشكل غير متسق بين عمليات التشغيل.
- كيف تتعامل مع قيم null والتكرارات؟ الدوال ذات الصلة، إضافة إلى أن join key المليء بقيم null يخلق skew.
- لماذا تُستخدم window function؟ الترتيب والمجاميع التراكمية وإزالة التكرار للوصول إلى أحدث سجل لكل key، وهي مهمة شائعة جدا في pipeline.
- كيف تكتب الإخراج دون إنتاج آلاف الملفات الصغيرة؟ coalesce أو repartition قبل الكتابة، وتقسيم الإخراج partition حسب عمود ذي cardinality معقولة.
- كيف تختبر كود PySpark؟ جلسات محلية صغيرة مع DataFrame تجريبية، ومنطق العمل مقسم إلى دوال تستقبل وتعيد DataFrame.
- كيف ترسل وتضبط job؟ عدد executor والأنوية والذاكرة، والمنطق القائل إن كثرة executor الصغيرة وقلة الكبيرة كليهما يهدر السعة.
كيف يجب أن تتدرب قبل المقابلة؟
تفشل إجابات PySpark بصوت عال بطريقة يمكن التعرف عليها. يعرف المرشح أن shuffle مكلف لكنه لا يستطيع تحديد أي العمليات تسببه، فتتحول الإجابة إلى قائمة صفات. قراءة بنك أسئلة تنتج تعرفا، والتعرف ليس نفس الشرح الذي يُقدم بينما ينتظر شخص ما.
خذ pipeline واحدا بنيته واسرده من البداية إلى النهاية: القراءة، وكل transformation، وأين تقع حدود stage، وما الذي ستتحقق منه أولا إذا تباطأ. افعل ذلك بصوت عال حتى تتوقف عن إعادة البدء. تمرين هذه المطالبات أمام مقابل AI يطرح سؤال المتابعة أقرب إلى جولة حقيقية من إعادة قراءة الملاحظات، ولهذا بُني وضع mock interview.
بنى Aaron Cao، مؤسس SubcueAI، التدريب حول فجوة الكلام هذه بدلا من توفير المزيد من الأسئلة. في مقابلة مباشرة، يمكن لتطبيق سطح المكتب وSide Panel في إضافة المتصفح إظهار البنية بينما يتحدث القائم على المقابلة، ما يساعد أكثر في المادة التي تدربت عليها بالفعل. يستغرق الإعداد بضع دقائق وموصوف في صفحة tutorial.
الأسئلة الشائعة
هل تتضمن مقابلات PySpark كتابة كود مباشرة؟
كم من SQL أحتاج لدور PySpark؟
هل يجب أن أتعلم Scala لمقابلة Spark؟
ما أكثر خطأ شائع في مقابلة PySpark؟
هل يمكن لمساعد AI أن يساعدني خلال مقابلة data engineering مباشرة؟
أسئلة ذات صلة
- ما أنواع الأسئلة التي تطرح في مقابلات البرمجة، وكيف يمكن لمساعد ذكاء اصطناعي أن يفيدك؟
- ما الأسئلة التي تُطرح في مقابلة فيديو HireVue؟
- ما أسئلة مقابلة Databricks التي ينبغي أن أتوقعها؟
- ما أسئلة مقابلة .NET التي ينبغي أن أتوقعها؟
- ما أسئلة مقابلة مهندس الجودة التي ينبغي أن أتوقعها؟
- ما أسئلة مقابلات الكوانت التي ينبغي أن أتوقعها؟