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
Dari
databricks_jar_test
folder , buat file bernamaPrintArgs.java
dengan konten berikut:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
Kompilasi
PrintArgs.java
file, yang membuat filePrintArgs.class
:javac PrintArgs.java
(Opsional) Jalankan program yang dikompilasi:
java PrintArgs Hello World! # [Hello, World!]
Di folder yang sama dengan
PrintArgs.java
file danPrintArgs.class
, buat folder bernamaMETA-INF
.META-INF
Di folder , buat file bernamaMANIFEST.MF
dengan konten berikut. Pastikan untuk menambahkan baris baru di akhir file ini:Main-Class: PrintArgs
Dari akar
databricks_jar_test
folder, buat JAR bernamaPrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(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 akhirMANIFEST.MF
file, lalu coba buat dan jalankan JAR lagi.Unggah
PrintArgs.jar
ke volume. Lihat Mengunggah file ke volume Katalog Unity.
Membuat JAR Scala
Dari
databricks_jar_test
folder , buat file kosong bernamabuild.sbt
dengan konten berikut:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
Dari
databricks_jar_test
folder , buat struktursrc/main/scala/example
folder .example
Di folder , buat file bernamaPrintArgs.scala
dengan konten berikut:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
Kompilasi program:
sbt compile
(Opsional) Jalankan program yang dikompilasi:
sbt "run Hello World\!" # Hello, World!
databricks_jar_test/project
Di folder , buat file bernamaassembly.sbt
dengan konten berikut:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
Dari akar
databricks_jar_test
folder, jalankanassembly
perintah , yang menghasilkan JAR ditarget
bawah folder :sbt assembly
(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!
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
- Buka halaman arahan Azure Databricks Anda dan lakukan salah satu hal berikut ini:
- Di bilah samping, klik Alur Kerja dan klik .
- Di bar samping, klik Baru dan pilih Pekerjaan dari menu.
- Dalam kotak dialog tugas yang muncul pada tab Tugas, ganti Tambahkan nama untuk pekerjaan Anda... dengan nama pekerjaan Anda, misalnya
JAR example
. - Untuk Nama tugas, masukkan nama untuk tugas, misalnya
java_jar_task
untuk Java, atauscala_jar_task
untuk Scala. - Untuk Jenis, pilih JAR.
- Untuk Kelas utama, untuk contoh ini, masukkan
PrintArgs
untuk Java, atauexample.PrintArgs
untuk Scala. - Untuk Kluster, pilih kluster yang kompatibel. Lihat Dukungan pustaka Java dan Scala.
- Untuk Pustaka dependen, klik + Tambahkan.
- Dalam dialog Tambahkan pustaka dependen, dengan Volume dipilih, masukkan lokasi tempat Anda mengunggah JAR (
PrintArgs.jar
atauPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) di langkah sebelumnya ke Jalur File Volume, atau filter atau telusuri untuk menemukan JAR. Pilih. - Klik Tambahkan.
- Untuk Parameter, untuk contoh ini, masukkan
["Hello", "World!"]
. - Klik Tambahkan.
Langkah 4: Jalankan pekerjaan dan lihat detail eksekusi pekerjaan
Klik 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)
atausc.stop()
di akhir programMain
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 setelahjobBody()
, 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 Menjadwalkan dan mengatur alur kerja.