Menggunakan JAR dalam pekerjaan Azure Databricks

Arsip Java atau [JAR](https://en.wikipedia.org/wiki/JAR_(file_format) format file didasarkan pada format file ZIP populer dan digunakan untuk menggabungkan banyak file Java atau Scala menjadi satu. Dengan menggunakan tugas JAR, Anda dapat memastikan penginstalan kode Java atau Scala yang cepat dan andal dalam pekerjaan Azure Databricks Anda. Artikel ini menyediakan contoh pembuatan JAR dan pekerjaan yang menjalankan aplikasi yang dikemas dalam JAR. Dalam contoh ini, Anda akan:

  • Buat proyek JAR yang menentukan aplikasi contoh.
  • Bundelkan file contoh ke dalam JAR.
  • Buat pekerjaan untuk menjalankan JAR.
  • Jalankan pekerjaan dan lihat hasilnya.

Sebelum Anda memulai

Anda memerlukan hal berikut untuk menyelesaikan contoh ini:

  • Untuk Java JAR, Java Development Kit (JDK).
  • Untuk Scala JAR, JDK dan sbt.

Langkah 1: Buat direktori lokal untuk contoh

Buat direktori lokal untuk menyimpan contoh kode dan artefak yang dihasilkan, misalnya, databricks_jar_test.

Langkah 2: Buat JAR

Selesaikan instruksi berikut untuk menggunakan Java atau Scala untuk membuat JAR.

Membuat JAR Java

  1. Dari databricks_jar_test folder , buat file bernama PrintArgs.java dengan konten berikut:

    import java.util.Arrays;
    
    public class PrintArgs {
      public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
      }
    }
    
  2. Kompilasi PrintArgs.java file, yang membuat file PrintArgs.class:

    javac PrintArgs.java
    
  3. (Opsional) Jalankan program yang dikompilasi:

    java PrintArgs Hello World!
    
    # [Hello, World!]
    
  4. Di folder yang sama dengan PrintArgs.java file dan PrintArgs.class , buat folder bernama META-INF.

  5. META-INF Di folder , buat file bernama MANIFEST.MF dengan konten berikut. Pastikan untuk menambahkan baris baru di akhir file ini:

    Main-Class: PrintArgs
    
  6. Dari akar databricks_jar_test folder, buat JAR bernama PrintArgs.jar:

    jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
    
  7. (Opsional) Untuk mengujinya, dari akar databricks_jar_test folder, jalankan JAR:

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

    Catatan

    Jika Anda mendapatkan kesalahan no main manifest attribute, in PrintArgs.jar, pastikan untuk menambahkan baris baru ke akhir MANIFEST.MF file, lalu coba buat dan jalankan JAR lagi.

  8. Unggah PrintArgs.jar ke volume. Lihat Mengunggah file ke volume Katalog Unity.

Membuat JAR Scala

  1. Dari databricks_jar_test folder , buat file kosong bernama build.sbt dengan konten berikut:

    ThisBuild / scalaVersion := "2.12.14"
    ThisBuild / organization := "com.example"
    
    lazy val PrintArgs = (project in file("."))
      .settings(
        name := "PrintArgs"
      )
    
  2. Dari databricks_jar_test folder , buat struktur src/main/scala/examplefolder .

  3. example Di folder , buat file bernama PrintArgs.scala dengan konten berikut:

    package example
    
    object PrintArgs {
      def main(args: Array[String]): Unit = {
        println(args.mkString(", "))
      }
    }
    
  4. Kompilasi program:

    sbt compile
    
  5. (Opsional) Jalankan program yang dikompilasi:

    sbt "run Hello World\!"
    
    # Hello, World!
    
  6. databricks_jar_test/project Di folder , buat file bernama assembly.sbt dengan konten berikut:

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
    
  7. Dari akar databricks_jar_test folder, jalankan assembly perintah , yang menghasilkan JAR di target bawah folder :

    sbt assembly
    
  8. (Opsional) Untuk mengujinya, dari akar databricks_jar_test folder, jalankan JAR:

    java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World!
    
    # Hello, World!
    
  9. Unggah PrintArgs-assembly-0.1.0-SNAPSHOT.jar ke volume. Lihat Mengunggah file ke volume Katalog Unity.

Langkah 3. Membuat pekerjaan Azure Databricks untuk menjalankan JAR

  1. Buka halaman arahan Azure Databricks Anda dan lakukan salah satu hal berikut ini:
    • Di bilah samping, klik Ikon Alur KerjaAlur Kerja dan klik .Tombol Buat Pekerjaan
    • Di bar samping, klik Ikon BaruBaru dan pilih Pekerjaan dari menu.
  2. Dalam kotak dialog tugas yang muncul pada tab Tugas, ganti Tambahkan nama untuk pekerjaan Anda... dengan nama pekerjaan Anda, misalnya JAR example .
  3. Untuk Nama tugas, masukkan nama untuk tugas, misalnya java_jar_task untuk Java, atau scala_jar_task untuk Scala.
  4. Untuk Jenis, pilih JAR.
  5. Untuk Kelas utama, untuk contoh ini, masukkan PrintArgs untuk Java, atau example.PrintArgs untuk Scala.
  6. Untuk Kluster, pilih kluster yang kompatibel. Lihat Dukungan pustaka Java dan Scala.
  7. Untuk Pustaka dependen, klik + Tambahkan.
  8. Dalam dialog Tambahkan pustaka dependen, dengan Volume dipilih, masukkan lokasi tempat Anda mengunggah JAR (PrintArgs.jar atau PrintArgs-assembly-0.1.0-SNAPSHOT.jar) di langkah sebelumnya ke Jalur File Volume, atau filter atau telusuri untuk menemukan JAR. Pilih.
  9. Klik Tambahkan.
  10. Untuk Parameter, untuk contoh ini, masukkan ["Hello", "World!"].
  11. Klik Tambahkan.

Langkah 4: Jalankan pekerjaan dan lihat detail eksekusi pekerjaan

Klik Tombol Jalankan Sekarang untuk menjalankan alur kerja. Untuk melihat detail eksekusi, klik Tampilkan eksekusi di pop-up eksekusi yang dipicu atau klik tautan di kolom Waktu mulai untuk eksekusi dalam tampilan eksekusi pekerjaan.

Ketika eksekusi selesai, output ditampilkan di panel Output , termasuk argumen yang diteruskan ke tugas.

Batas ukuran output untuk pekerjaan JAR

Output pekerjaan, seperti output log yang dipancarkan ke stdout, tunduk pada batas ukuran 20MB. Jika total output memiliki ukuran yang lebih besar, eksekusi dibatalkan dan ditandai sebagai gagal.

Untuk menghindari menghadapi batas ini, Anda dapat mencegah stdout dikembalikan dari driver ke Azure Databricks dengan mengatur konfigurasi Spark spark.databricks.driver.disableScalaOutput ke true. Secara default, nilai bendera adalah false. Bendera mengontrol output sel untuk pekerjaan Scala JAR dan notebook Scala. Jika bendera diaktifkan, Spark tidak mengembalikan hasil eksekusi pekerjaan kepada klien. Bendera tidak memengaruhi data yang ditulis dalam file log kluster. Databricks merekomendasikan pengaturan bendera ini hanya untuk kluster pekerjaan untuk pekerjaan JAR karena menonaktifkan hasil notebook.

Rekomendasi: Gunakan berbagi SparkContext

Karena Azure Databricks adalah layanan terkelola, beberapa perubahan kode mungkin diperlukan untuk memastikan bahwa pekerjaan Apache Spark Anda berjalan dengan benar. Program pekerjaan JAR harus menggunakan API SparkContext bersama untuk mendapatkan SparkContext. Karena Azure Databricks menginisialisasi SparkContext, program yang dipanggil new SparkContext() akan gagal. Untuk mendapatkan SparkContext, hanya gunakan SparkContext bersama yang dibuat oleh Azure Databricks:

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

Ada juga beberapa metode yang harus Anda hindari saat menggunakan SparkContext bersama.

  • Jangan memanggil SparkContext.stop().
  • Jangan memanggil System.exit(0) atau sc.stop() di akhir program Main Anda. Hal ini dapat menyebabkan perilaku yang tidak terdefinisi.

Rekomendasi: Gunakan try-finally blok untuk pembersihan pekerjaan

Pertimbangkan JAR yang terdiri dari dua bagian:

  • jobBody() yang berisi bagian utama dari pekerjaan.
  • jobCleanup() yang harus dijalankan setelah jobBody(), apakah fungsi tersebut berhasil atau mengembalikan pengecualian.

Misalnya, jobBody() membuat tabel dan jobCleanup() menghilangkan tabel tersebut.

Cara aman untuk memastikan bahwa metode pembersihan dipanggil adalah dengan try-finally menempatkan blok dalam kode:

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

Anda tidak boleh mencoba membersihkan menggunakan sys.addShutdownHook(jobCleanup) atau kode berikut:

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

Karena cara masa pakai kontainer Spark dikelola di Azure Databricks, kait pematian tidak berjalan dengan andal.

Mengonfigurasi parameter pekerjaan JAR

Anda meneruskan parameter ke pekerjaan JAR dengan array string JSON. Lihat objek spark_jar_task dalam isi permintaan yang diteruskan ke operasi Buat pekerjaan baru (POST /jobs/create) di API Pekerjaan. Untuk mengakses parameter ini, periksa array String yang diteruskan ke fungsi main Anda.

Mengelola dependensi pustaka

Driver Spark memiliki dependensi pustaka tertentu yang tidak dapat diganti. Jika pekerjaan Anda menambahkan pustaka yang bertentangan, dependensi pustaka driver Spark lebih diutamakan.

Untuk mendapatkan daftar lengkap dependensi pustaka driver, jalankan perintah berikut dalam buku catatan yang dilampirkan ke kluster yang dikonfigurasi dengan versi Spark yang sama (atau kluster dengan driver yang ingin Anda periksa):

%sh
ls /databricks/jars

Saat Anda menentukan dependensi pustaka untuk JAR, Databricks merekomendasikan untuk mencantumkan Spark dan Hadoop sebagai provided dependensi. Di Maven, tambahkan Spark dan Hadoop sebagai dependensi yang disediakan:

<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>

Di sbt, tambahkan Spark dan Hadoop sebagai dependensi yang disediakan:

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

Tip

Tentukan versi Scala yang benar untuk dependensi Anda berdasarkan versi yang Anda jalankan.

Langkah berikutnya

Untuk mempelajari selengkapnya tentang membuat dan menjalankan pekerjaan Azure Databricks, lihat Membuat dan menjalankan Pekerjaan Azure Databricks.