استخدام JAR في مهمة Azure Databricks

يستند أرشيف Java أو [JAR](https://en.wikipedia.org/wiki/JAR_(file_format) تنسيق الملف إلى تنسيق ملف ZIP الشائع ويستخدم لتجميع العديد من ملفات Java أو Scala في ملف واحد. باستخدام مهمة JAR، يمكنك التأكد من التثبيت السريع والموثوق للتعليمات البرمجية Java أو Scala في وظائف Azure Databricks. توفر هذه المقالة مثالا على إنشاء JAR ووظيفة تقوم بتشغيل التطبيق المحزم في JAR. في هذا المثال، سوف:

  • إنشاء مشروع JAR لتعريف تطبيق مثال.
  • تجميع ملفات المثال في JAR.
  • إنشاء وظيفة لتشغيل JAR.
  • قم بتشغيل المهمة وعرض النتائج.

قبل البدء

تحتاج إلى ما يلي لإكمال هذا المثال:

  • بالنسبة إلى Java JARs، حزمة تطوير Java (JDK).
  • بالنسبة إلى Scala JARs، JDK وsbt.

الخطوة 1: إنشاء دليل محلي للمثال

إنشاء دليل محلي للاحتفاظ بمثال التعليمات البرمجية والبيانات الاصطناعية التي تم إنشاؤها، على سبيل المثال، databricks_jar_test.

الخطوة 2: إنشاء JAR

أكمل الإرشادات التالية لاستخدام Java أو Scala لإنشاء JAR.

إنشاء Java JAR

  1. من databricks_jar_test المجلد، أنشئ ملفا باسم PrintArgs.java بالمحتويات التالية:

    import java.util.Arrays;
    
    public class PrintArgs {
      public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
      }
    }
    
  2. تحويل الملف برمجيا PrintArgs.java ، الذي يقوم بإنشاء الملف PrintArgs.class:

    javac PrintArgs.java
    
  3. (اختياري) تشغيل البرنامج المحول برمجيا:

    java PrintArgs Hello World!
    
    # [Hello, World!]
    
  4. في نفس المجلد مثل الملفات PrintArgs.java و PrintArgs.class ، أنشئ مجلدا باسم META-INF.

  5. في META-INF المجلد، قم بإنشاء ملف باسم MANIFEST.MF بالمحتويات التالية. تأكد من إضافة سطر جديد في نهاية هذا الملف:

    Main-Class: PrintArgs
    
  6. من جذر databricks_jar_test المجلد، قم بإنشاء JAR باسم PrintArgs.jar:

    jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
    
  7. (اختياري) لاختباره، من جذر databricks_jar_test المجلد، قم بتشغيل JAR:

    java -jar PrintArgs.jar Hello World!
    
    # [Hello, World!]
    

    إشعار

    إذا تلقيت الخطأ no main manifest attribute, in PrintArgs.jar، فتأكد من إضافة سطر جديد إلى نهاية MANIFEST.MF الملف، ثم حاول إنشاء JAR وتشغيله مرة أخرى.

  8. تحميل PrintArgs.jar إلى وحدة تخزين. راجع تحميل الملفات إلى وحدة تخزين كتالوج Unity.

إنشاء Scala JAR

  1. databricks_jar_test من المجلد، أنشئ ملفا فارغا باسم build.sbt بالمحتويات التالية:

    ThisBuild / scalaVersion := "2.12.14"
    ThisBuild / organization := "com.example"
    
    lazy val PrintArgs = (project in file("."))
      .settings(
        name := "PrintArgs"
      )
    
  2. databricks_jar_test من المجلد، قم بإنشاء بنية src/main/scala/exampleالمجلد .

  3. في example المجلد، أنشئ ملفا باسم PrintArgs.scala بالمحتويات التالية:

    package example
    
    object PrintArgs {
      def main(args: Array[String]): Unit = {
        println(args.mkString(", "))
      }
    }
    
  4. تحويل البرنامج برمجيا:

    sbt compile
    
  5. (اختياري) تشغيل البرنامج المحول برمجيا:

    sbt "run Hello World\!"
    
    # Hello, World!
    
  6. في databricks_jar_test/project المجلد، أنشئ ملفا باسم assembly.sbt بالمحتويات التالية:

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
    
  7. من جذر databricks_jar_test المجلد، قم بتشغيل assembly الأمر الذي ينشئ JAR ضمن target المجلد:

    sbt assembly
    
  8. (اختياري) لاختباره، من جذر databricks_jar_test المجلد، قم بتشغيل JAR:

    java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World!
    
    # Hello, World!
    
  9. تحميل PrintArgs-assembly-0.1.0-SNAPSHOT.jar إلى وحدة تخزين. راجع تحميل الملفات إلى وحدة تخزين كتالوج Unity.

الخطوة 3. إنشاء وظيفة Azure Databricks لتشغيل JAR

  1. انتقل إلى الصفحة المقصودة ل Azure Databricks وقم بأحد الإجراءات التالية:
    • في الشريط الجانبي، انقر فوق أيقونة مهام سير العمل مهام سير العمل وانقر فوق الزر .
    • في الشريط الجانبي، انقر فوق أيقونة جديدة جديد وحدد مهمة من القائمة.
  2. في مربع حوار المهمة الذي يظهر في علامة التبويب المهام ، استبدل إضافة اسم لمهمتك... باسم وظيفتك، على سبيل المثال JAR example.
  3. بالنسبة إلى اسم المهمة، أدخل اسما للمهمة، على سبيل المثال java_jar_task ل Java، أو scala_jar_task ل Scala.
  4. بالنسبة إلى النوع، حدد JAR.
  5. بالنسبة للفئة الرئيسية، لهذا المثال، أدخل PrintArgs ل Java، أو example.PrintArgs ل Scala.
  6. بالنسبة لنظام المجموعة، حدد مجموعة متوافقة. راجع دعم مكتبة Java وSc scala.
  7. بالنسبة للمكتبات التابعة، انقر فوق + إضافة.
  8. في مربع الحوار إضافة مكتبة تابعة، مع تحديد وحدات التخزين، أدخل الموقع حيث قمت بتحميل JAR (PrintArgs.jar أو PrintArgs-assembly-0.1.0-SNAPSHOT.jar) في الخطوة السابقة إلى مسار ملف وحدات التخزين، أو قم بتصفية أو استعراض للعثور على JAR. حددها.
  9. انقر فوق إضافة.
  10. بالنسبة للمعلمات، في هذا المثال، أدخل ["Hello", "World!"].
  11. انقر فوق إضافة.

الخطوة 4: تشغيل المهمة وعرض تفاصيل تشغيل الوظيفة

انقر الزر لتشغيل سير العمل. لعرض تفاصيل التشغيل، انقر فوق عرض التشغيل في النافذة المنبثقة تشغيل المشغل أو انقر فوق الارتباط في عمود وقت البدء للتشغيل في طريقة عرض تشغيل المهمة.

عند اكتمال التشغيل، يتم عرض الإخراج في لوحة الإخراج ، بما في ذلك الوسيطات التي تم تمريرها إلى المهمة.

حدود حجم الإخراج لمهام JAR

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

لتجنب مواجهة هذا الحد، يمكنك منع إرجاع stdout من برنامج التشغيل إلى Azure Databricks عن طريق تعيين spark.databricks.driver.disableScalaOutput تكوين Spark إلى true. بشكل افتراضي، قيمة العلامة هي false. تتحكم العلامة في إخراج الخلية لمهام Scala JAR ودفاتر ملاحظات Scala. إذا تم تمكين العلامة، لا يقوم Spark بإرجاع نتائج تنفيذ المهمة إلى العميل. لا تؤثر العلامة على البيانات المكتوبة في ملفات سجل نظام المجموعة. توصي Databricks بتعيين هذه العلامة فقط لمجموعات الوظائف لمهام JAR لأنها تعطل نتائج دفتر الملاحظات.

التوصية: استخدام المشتركة SparkContext

نظرا لأن Azure Databricks هي خدمة مدارة، فقد تكون بعض تغييرات التعليمات البرمجية ضرورية لضمان تشغيل مهام Apache Spark بشكل صحيح. يجب أن تستخدم برامج مهام JAR واجهة برمجة التطبيقات المشتركة SparkContext للحصول على SparkContext. نظرا لأن Azure Databricks يقوم بتهيئة SparkContext، فإن البرامج التي تستدعي new SparkContext() ستفشل. للحصول على SparkContext، استخدم فقط المشتركة SparkContext التي تم إنشاؤها بواسطة Azure Databricks:

val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()

هناك أيضا العديد من الطرق التي يجب تجنبها عند استخدام المشتركة SparkContext.

  • لا تقم باستدعاء SparkContext.stop().
  • لا تتصل System.exit(0) أو sc.stop() في نهاية البرنامج.Main يمكن أن يؤدي هذا إلى سلوك غير معرف.

التوصية: استخدام try-finally كتل لتنظيف الوظيفة

ضع في اعتبارك JAR الذي يتكون من جزأين:

  • jobBody() الذي يحتوي على الجزء الرئيسي من الوظيفة.
  • jobCleanup() الذي يجب تنفيذه بعد jobBody()، سواء نجحت هذه الدالة أو أرجعت استثناء.

على سبيل المثال، jobBody() ينشئ الجداول ويسقط jobCleanup() هذه الجداول.

الطريقة الآمنة للتأكد من استدعاء أسلوب التنظيف هي وضع كتلة try-finally في التعليمات البرمجية:

try {
  jobBody()
} finally {
  jobCleanup()
}

يجب عدم محاولة التنظيف باستخدام sys.addShutdownHook(jobCleanup) أو التعليمات البرمجية التالية:

val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)

نظرا للطريقة التي تدار بها مدة بقاء حاويات Spark في Azure Databricks، لا يتم تشغيل خطافات إيقاف التشغيل بشكل موثوق.

تكوين معلمات مهمة JAR

يمكنك تمرير المعلمات إلى مهام JAR باستخدام صفيف سلسلة JSON. spark_jar_task راجع الكائن في نص الطلب الذي تم تمريره إلى إنشاء عملية مهمة جديدة (POST /jobs/create) في واجهة برمجة تطبيقات الوظائف. للوصول إلى هذه المعلمات، افحص الصفيف الذي String تم تمريره إلى الدالة الخاصة بك main .

إدارة تبعيات المكتبة

يحتوي برنامج تشغيل Spark على تبعيات مكتبة معينة لا يمكن تجاوزها. إذا كانت مهمتك تضيف مكتبات متعارضة، فإن تبعيات مكتبة برنامج تشغيل Spark لها الأسبقية.

للحصول على القائمة الكاملة لتبعيات مكتبة برامج التشغيل، قم بتشغيل الأمر التالي في دفتر ملاحظات مرفق بمجموعة تم تكوينها بنفس إصدار Spark (أو نظام المجموعة مع برنامج التشغيل الذي تريد فحصه):

%sh
ls /databricks/jars

عند تعريف تبعيات المكتبة ل JARs، توصي Databricks بإدراج Spark و Hadoop كتبعيات provided . في Maven، أضف Spark و Hadoop كما هو الحال مع التبعيات المتوفرة:

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-core_2.11</artifactId>
  <version>2.3.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.apache.hadoop</groupId>
  <artifactId>hadoop-core</artifactId>
  <version>1.2.1</version>
  <scope>provided</scope>
</dependency>

في sbt، أضف Spark و Hadoop كما هو الحال مع التبعيات المتوفرة:

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"

تلميح

حدد إصدار Scala الصحيح للتبعيات الخاصة بك استنادا إلى الإصدار الذي تقوم بتشغيله.

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

لمعرفة المزيد حول إنشاء وظائف Azure Databricks وتشغيلها، راجع جدولة مهام سير العمل وتنسيقها.