استخدام 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
من
databricks_jar_test
المجلد، أنشئ ملفا باسمPrintArgs.java
بالمحتويات التالية:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
تحويل الملف برمجيا
PrintArgs.java
، الذي يقوم بإنشاء الملفPrintArgs.class
:javac PrintArgs.java
(اختياري) تشغيل البرنامج المحول برمجيا:
java PrintArgs Hello World! # [Hello, World!]
في نفس المجلد مثل الملفات
PrintArgs.java
وPrintArgs.class
، أنشئ مجلدا باسمMETA-INF
.في
META-INF
المجلد، قم بإنشاء ملف باسمMANIFEST.MF
بالمحتويات التالية. تأكد من إضافة سطر جديد في نهاية هذا الملف:Main-Class: PrintArgs
من جذر
databricks_jar_test
المجلد، قم بإنشاء JAR باسمPrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(اختياري) لاختباره، من جذر
databricks_jar_test
المجلد، قم بتشغيل JAR:java -jar PrintArgs.jar Hello World! # [Hello, World!]
إشعار
إذا تلقيت الخطأ
no main manifest attribute, in PrintArgs.jar
، فتأكد من إضافة سطر جديد إلى نهايةMANIFEST.MF
الملف، ثم حاول إنشاء JAR وتشغيله مرة أخرى.تحميل
PrintArgs.jar
إلى وحدة تخزين. راجع تحميل الملفات إلى وحدة تخزين كتالوج Unity.
إنشاء Scala JAR
databricks_jar_test
من المجلد، أنشئ ملفا فارغا باسمbuild.sbt
بالمحتويات التالية:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
databricks_jar_test
من المجلد، قم بإنشاء بنيةsrc/main/scala/example
المجلد .في
example
المجلد، أنشئ ملفا باسمPrintArgs.scala
بالمحتويات التالية:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
تحويل البرنامج برمجيا:
sbt compile
(اختياري) تشغيل البرنامج المحول برمجيا:
sbt "run Hello World\!" # Hello, World!
في
databricks_jar_test/project
المجلد، أنشئ ملفا باسمassembly.sbt
بالمحتويات التالية:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
من جذر
databricks_jar_test
المجلد، قم بتشغيلassembly
الأمر الذي ينشئ JAR ضمنtarget
المجلد:sbt assembly
(اختياري) لاختباره، من جذر
databricks_jar_test
المجلد، قم بتشغيل JAR:java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World! # Hello, World!
تحميل
PrintArgs-assembly-0.1.0-SNAPSHOT.jar
إلى وحدة تخزين. راجع تحميل الملفات إلى وحدة تخزين كتالوج Unity.
الخطوة 3. إنشاء وظيفة Azure Databricks لتشغيل JAR
- انتقل إلى الصفحة المقصودة ل Azure Databricks وقم بأحد الإجراءات التالية:
- في الشريط الجانبي، انقر فوق مهام سير العمل وانقر فوق .
- في الشريط الجانبي، انقر فوق جديد وحدد مهمة من القائمة.
- في مربع حوار المهمة الذي يظهر في علامة التبويب المهام ، استبدل إضافة اسم لمهمتك... باسم وظيفتك، على سبيل المثال
JAR example
. - بالنسبة إلى اسم المهمة، أدخل اسما للمهمة، على سبيل المثال
java_jar_task
ل Java، أوscala_jar_task
ل Scala. - بالنسبة إلى النوع، حدد JAR.
- بالنسبة للفئة الرئيسية، لهذا المثال، أدخل
PrintArgs
ل Java، أوexample.PrintArgs
ل Scala. - بالنسبة لنظام المجموعة، حدد مجموعة متوافقة. راجع دعم مكتبة Java وSc scala.
- بالنسبة للمكتبات التابعة، انقر فوق + إضافة.
- في مربع الحوار إضافة مكتبة تابعة، مع تحديد وحدات التخزين، أدخل الموقع حيث قمت بتحميل JAR (
PrintArgs.jar
أوPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) في الخطوة السابقة إلى مسار ملف وحدات التخزين، أو قم بتصفية أو استعراض للعثور على JAR. حددها. - انقر فوق إضافة.
- بالنسبة للمعلمات، في هذا المثال، أدخل
["Hello", "World!"]
. - انقر فوق إضافة.
الخطوة 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 وتشغيلها، راجع جدولة مهام سير العمل وتنسيقها.