إرشادات ضبط الأداء ل Spark على HDInsight Azure Data Lake Storage Gen1

عند ضبط الأداء على Spark، تحتاج إلى مراعاة عدد التطبيقات التي سيتم تشغيلها على نظام المجموعة الخاص بك. بشكل افتراضي، يمكنك تشغيل أربعة تطبيقات بشكل متزامن على مجموعة HDI (ملاحظة: الإعداد الافتراضي عرضة للتغيير). قد تقرر استخدام عدد أقل من التطبيقات حتى تتمكن من تجاوز الإعدادات الافتراضية واستخدام المزيد من نظام المجموعة لتلك التطبيقات.

المتطلبات الأساسية

المعلمات

عند تشغيل وظائف Spark، إليك أهم الإعدادات التي يمكن ضبطها لزيادة الأداء على Data Lake Storage Gen1:

  • Num-executors - عدد المهام المتزامنة التي يمكن تنفيذها.

  • ذاكرة المنفذ - مقدار الذاكرة المخصصة لكل منفذ.

  • Executor-cores - عدد الذاكرات الأساسية المخصصة لكل منفذ.

منفذو Num سيقوم منفذو Num بتعيين الحد الأقصى لعدد المهام التي يمكن تشغيلها بالتوازي. يرتبط العدد الفعلي للمهام التي يمكن تشغيلها بالتوازي بالذاكرة وموارد وحدة المعالجة المركزية المتوفرة في نظام المجموعة الخاص بك.

ذاكرة المنفذ هذا هو مقدار الذاكرة التي يتم تخصيصها لكل منفذ. تعتمد الذاكرة المطلوبة لكل منفذ على الوظيفة. بالنسبة للعمليات المعقدة، يجب أن تكون الذاكرة أعلى. بالنسبة للعمليات البسيطة مثل القراءة والكتابة، ستكون متطلبات الذاكرة أقل. يمكن عرض مقدار الذاكرة لكل منفذ في Ambari. في Ambari، انتقل إلى Spark واعرض علامة التبويب Configs .

الذاكرات الأساسية للمنفذ يؤدي هذا إلى تعيين مقدار الذاكرات الأساسية المستخدمة لكل منفذ، والذي يحدد عدد مؤشرات الترابط المتوازية التي يمكن تشغيلها لكل منفذ. على سبيل المثال، إذا كان executor-cores = 2، فيمكن لكل منفذ تشغيل مهمتين متوازيتين في المنفذ. ستعتمد الذاكرات الأساسية للمنفذ المطلوبة على الوظيفة. لا تتطلب المهام الثقيلة الإدخال/الإخراج قدرا كبيرا من الذاكرة لكل مهمة حتى يتمكن كل منفذ من التعامل مع مهام أكثر متوازية.

بشكل افتراضي، يتم تعريف نواة YARN ظاهرية لكل نواة فعلية عند تشغيل Spark على HDInsight. يوفر هذا الرقم توازنا جيدا بين التزامن ومقدار تبديل السياق من مؤشرات ترابط متعددة.

الإرشاد

أثناء تشغيل أحمال عمل Spark التحليلية للعمل مع البيانات في Data Lake Storage Gen1، نوصي باستخدام أحدث إصدار HDInsight للحصول على أفضل أداء مع Data Lake Storage Gen1. عندما تكون مهمتك أكثر كثافة في الإدخال/إخراج، يمكن تكوين معلمات معينة لتحسين الأداء. Data Lake Storage Gen1 هو نظام أساسي للتخزين قابل للتطوير بدرجة كبيرة يمكنه التعامل مع معدل النقل العالي. إذا كانت الوظيفة تتكون أساسا من القراءة أو الكتابة، فقد تؤدي زيادة التزامن للإدخار/الإخراج من وإلى Data Lake Storage Gen1 إلى زيادة الأداء.

هناك بعض الطرق العامة لزيادة التزامن لوظائف الإدخال/إخراج المكثفة.

الخطوة 1: تحديد عدد التطبيقات التي تعمل على نظام المجموعة الخاص بك - يجب أن تعرف عدد التطبيقات التي تعمل على نظام المجموعة بما في ذلك التطبيق الحالي. تفترض القيم الافتراضية لكل إعداد Spark أن هناك 4 تطبيقات تعمل بشكل متزامن. لذلك، سيكون لديك 25٪ فقط من المجموعة المتوفرة لكل تطبيق. للحصول على أداء أفضل، يمكنك تجاوز الإعدادات الافتراضية عن طريق تغيير عدد المنفذين.

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

الخطوة 3: تعيين الذاكرات الأساسية للمنفذ - بالنسبة لأحمال العمل كثيفة الإدخال/الإخراج التي لا تحتوي على عمليات معقدة، من الجيد البدء بعدد كبير من الذاكرات الأساسية للمنفذ لزيادة عدد المهام المتوازية لكل منفذ. يعد تعيين الذاكرات الأساسية للمنفذ على 4 بداية جيدة.

executor-cores = 4

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

الخطوة 4: تحديد مقدار ذاكرة YARN في نظام المجموعة - تتوفر هذه المعلومات في Ambari. انتقل إلى YARN واعرض علامة التبويب Contigs. يتم عرض ذاكرة YARN في هذه النافذة. لاحظ أثناء وجودك في النافذة، يمكنك أيضا رؤية حجم حاوية YARN الافتراضي. حجم حاوية YARN هو نفس الذاكرة لكل معلمة منفذ.

إجمالي ذاكرة YARN = العقد * ذاكرة YARN لكل عقدة

الخطوة 5: حساب منفذي num

حساب قيد الذاكرة - المعلمة num-executors مقيدة إما بالذاكرة أو بواسطة وحدة المعالجة المركزية. يتم تحديد قيد الذاكرة من خلال مقدار ذاكرة YARN المتوفرة لتطبيقك. خذ إجمالي ذاكرة YARN وقسمها على ذاكرة المنفذ. يجب إلغاء تحجيم القيد لعدد التطبيقات حتى نقسم على عدد التطبيقات.

قيد الذاكرة = (إجمالي ذاكرة YARN / ذاكرة المنفذ) / # من التطبيقات

حساب قيد وحدة المعالجة المركزية - يتم حساب قيد وحدة المعالجة المركزية كإجمالي الذاكرات الأساسية الظاهرية مقسوما على عدد الذاكرات الأساسية لكل منفذ. هناك 2 نواة ظاهرية لكل نواة فعلية. على غرار قيد الذاكرة، قسمنا على عدد التطبيقات.

الذاكرات الأساسية الظاهرية = (العقد في نظام المجموعة * # من الذاكرات الأساسية الفعلية في العقدة * 2) قيد وحدة المعالجة المركزية = (إجمالي الذاكرات الأساسية الظاهرية / # من الذاكرات الأساسية لكل منفذ) / # من التطبيقات

تعيين num-executors - يتم تحديد معلمة num-executors عن طريق أخذ الحد الأدنى من قيد الذاكرة وقيد وحدة المعالجة المركزية.

num-executors = Min (إجمالي الذاكرات الأساسية الظاهرية / # من الذاكرات الأساسية لكل منفذ، ذاكرة YARN المتوفرة / ذاكرة المنفذ) لا يؤدي تعيين عدد أكبر من منفذي num بالضرورة إلى زيادة الأداء. يجب أن تفكر في أن إضافة المزيد من المنفذين سيضيف حملا إضافيا لكل منفذ إضافي، مما قد يؤدي إلى تدهور الأداء. يتم ربط Num-executors بموارد نظام المجموعة.

مثال على الحساب

لنفترض أن لديك حاليا مجموعة مكونة من 8 عقد D4v2 تقوم بتشغيل تطبيقين بما في ذلك التطبيق الذي ستقوم بتشغيله.

الخطوة 1: تحديد عدد التطبيقات التي يتم تشغيلها على نظام مجموعتك - أنت تعلم أن لديك تطبيقين على نظام المجموعة الخاص بك، بما في ذلك التطبيق الذي ستقوم بتشغيله.

الخطوة 2: تعيين ذاكرة المنفذ - على سبيل المثال، نحدد أن 6 غيغابايت من ذاكرة المنفذ ستكون كافية لمهمة الإدخال/الإخراج المكثفة.

executor-memory = 6GB

الخطوة 3: تعيين الذاكرات الأساسية للمنفذ - نظرا لأن هذه مهمة مكثفة للإداء/الإخراج، يمكننا تعيين عدد الذاكرات الأساسية لكل منفذ إلى أربعة. قد يؤدي تعيين الذاكرات الأساسية لكل منفذ إلى أكبر من أربعة إلى حدوث مشاكل في جمع البيانات المهملة.

executor-cores = 4

الخطوة 4: تحديد مقدار ذاكرة YARN في نظام المجموعة - ننتقل إلى Ambari لمعرفة أن كل D4v2 يحتوي على 25 غيغابايت من ذاكرة YARN. نظرا لوجود 8 عقد، يتم ضرب ذاكرة YARN المتوفرة في 8.

إجمالي ذاكرة YARN = العقد * ذاكرة YARN* لكل عقدة إجمالي ذاكرة YARN = 8 عقد * 25 غيغابايت = 200 غيغابايت

الخطوة 5: حساب num-executors - يتم تحديد معلمة num-executors عن طريق أخذ الحد الأدنى من قيد الذاكرة وقيد وحدة المعالجة المركزية مقسوما على # من التطبيقات التي تعمل على Spark.

حساب قيد الذاكرة - يتم حساب قيد الذاكرة على أنه إجمالي ذاكرة YARN مقسوما على الذاكرة لكل منفذ.

قيد الذاكرة = (إجمالي ذاكرة YARN / ذاكرة المنفذ) / # من قيد الذاكرة للتطبيقات = (200 غيغابايت / 6 غيغابايت) / 2 قيد الذاكرة = 16 (مقرب) حساب قيد وحدة المعالجة المركزية - يتم حساب قيد وحدة المعالجة المركزية على أنه إجمالي الذاكرات الأساسية للغزل مقسوما على عدد الذاكرات الأساسية لكل منفذ.

نواة YARN = العقد في نظام المجموعة * # من الذاكرات الأساسية لكل عقدة * 2 ذاكرة أساسية YARN = 8 عقد * 8 ذاكرات أساسية لكل D14 * 2 = 128 قيد وحدة المعالجة المركزية = (إجمالي نوى YARN / # من الذاكرات الأساسية لكل منفذ) / # من قيد وحدة المعالجة المركزية للتطبيقات = (128 / 4) / 2 قيد وحدة المعالجة المركزية = 16

تعيين num-executors

num-executors = Min (قيد الذاكرة، قيد وحدة المعالجة المركزية) num-executors = Min (16, 16) num-executors = 16