تحسين معالجة البيانات لـ Apache Spark

تتناول هذه المقالة كيفية تحسين تكوين مجموعة Apache Spark للحصول على أفضل أداء على Azure HDInsight.

نظرة عامة

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

عامل آخر يسبب الصلات البطيئة وهو قد يكون نوع الصلة. بصورة افتراضية، يستخدم Spark نوع الصلة SortMerge. هذا النوع من الصلة هو الأنسب لمجموعات البيانات الكبيرة. ولكنها مكلفة من الناحية الحسابية بخلاف ذلك لأنه يجب عليها أولا فرز الجانبين الأيمن والأيسر من البيانات قبل دمجهما.

الصلة Broadcast هي الأنسب لأصغر مجموعات البيانات، أو حيث يكون أحد جانبي الصلة أصغر بكثير من الجانب الآخر. هذا النوع من الصلة يبث جانباً واحداً إلى جميع المنفذين، وذلك يتطلب المزيد من الذاكرة للبث بشكل عام.

يمكنك تغيير نوع صلة الربط في التكوين الخاص بك عن طريق إعداد ⁧spark.sql.autoBroadcastJoinThreshold⁩، أو يمكنك تعيين تلميح صلة ربط باستخدام واجهة API لإطار البيانات (⁧dataframe.join(broadcast(df2))⁩).

// Option 1
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", 1*1024*1024*1024)

// Option 2
val df1 = spark.table("FactTableA")
val df2 = spark.table("dimMP")
df1.join(broadcast(df2), Seq("PK")).
    createOrReplaceTempView("V_JOIN")

sql("SELECT col1, col2 FROM V_JOIN")

إذا كنت تستخدم جداول المستودع، فحينئذٍ يكون لديك نوع صلة ثالثة، وهي الصلة Merge. سوف تتخطى مجموعة البيانات التي قسمت وفرزت مسبقًا بشكل صحيح مرحلة الفرز المكلفة من صلة الربط ⁧SortMerge⁩.

ترتيب الصلات مهم، ولا سيما في الاستفسارات الأكثر تعقيداً. ابدأ بالصلات الأكثر انتقائية. أيضاً، عندما يكون ذلك ممكناً، فانقل الصلات التي تزيد من عدد الصفوف بعد التجميعات.

لإدارة التوازي للصلات الديكارتية، يمكنك إضافة بنيات متداخلة، ووضع نوافذ، وربما تخطي خطوة واحدة أو أكثر في "وظيفة Spark".

تحسين تنفيذ الوظيفة

  • التخزين في ذاكرة التخزين المؤقت حسب الضرورة، على سبيل المثال، إذا كنت تستخدم البيانات مرتين، فحينئذٍ قم بتخزينها في ذاكرة التخزين المؤقت.
  • قم ببث المتغيرات إلى جميع المنفذين. لا يتم تسلسل المتغيرات إلا مرة واحدة، ما يؤدي إلى عمليات بحث أسرع.
  • استخدم تجمع مؤشر الترابط على برنامج التشغيل، ما يؤدي إلى عملية أسرع للعديد من المهام.

راقب مهامك الجارية بانتظام بحثاً عن مشكلات الأداء. إذا كنت بحاجة إلى مزيد من المعلومات حول بعض المشكلات، ففكر في إحدى أدوات تحديد ملفات تعريف الأداء التالية:

  • تراقبأداة Intel PAL استخدام وحدة المعالجة المركزية والتخزين واستخدام النطاق الترددي للشبكة.
  • ملفات تعريفOracle Java 8 Mission Control ملفات تعريف شرارة ورمز تنفيذي.

مفتاح أداء الاستعلام Spark 2.x هو محرك Tungsten، الذي يعتمد على توليد مرحلة كاملة من التعليمات البرمجية. في بعض الحالات، قد يتم تعطيل إنشاء التعليمات البرمجية للمرحلة الكاملة. على سبيل المثال، إذا كنت تستخدم نوعاً غير قابل للتغيير (string) في تعبير التجميع، يظهر SortAggregate بدلاً من HashAggregate. على سبيل المثال، للحصول على أداء أفضل، جرب ما يلي، ثم قم بإعادة تمكين إنشاء التعليمات البرمجية:

MAX(AMOUNT) -> MAX(cast(AMOUNT as DOUBLE))

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