Azure Databricks işinde JAR kullanma
Java arşivi veya [JAR](https://en.wikipedia.org/wiki/JAR_(file_format) dosya biçimi popüler ZIP dosya biçimini temel alır ve birçok Java veya Scala dosyasını tek bir dosyaya ayırmak için kullanılır. JAR görevini kullanarak Azure Databricks işlerinizde Java veya Scala kodunun hızlı ve güvenilir bir şekilde yüklenmesini sağlayabilirsiniz. Bu makalede JAR oluşturma örneği ve JAR'da paketlenmiş uygulamayı çalıştıran bir iş sağlanır. Bu örnekte şunları yapacaksınız:
- Örnek bir uygulama tanımlayan JAR projesini oluşturun.
- Örnek dosyaları BIR JAR içinde paketle.
- JAR'ı çalıştırmak için bir iş oluşturun.
- İşi çalıştırın ve sonuçları görüntüleyin.
Başlamadan önce
Bu örneği tamamlamak için aşağıdakilere ihtiyacınız vardır:
- Java JAR'leri için Java Geliştirme Seti (JDK).
- Scala JAR'leri için JDK ve sbt.
1. Adım: Örnek için yerel dizin oluşturma
Örnek kodu ve oluşturulan yapıtları (örneğin, databricks_jar_test
) tutmak için yerel bir dizin oluşturun.
2. Adım: JAR oluşturma
JAR oluşturmak için Java veya Scala'yı kullanmak için aşağıdaki yönergeleri tamamlayın.
Java JAR oluşturma
klasöründen
databricks_jar_test
aşağıdaki içeriklere sahip adlıPrintArgs.java
bir dosya oluşturun:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
dosyasını derleyin
PrintArgs.java
ve dosyasınıPrintArgs.class
oluşturur:javac PrintArgs.java
(İsteğe bağlı) Derlenmiş programı çalıştırın:
java PrintArgs Hello World! # [Hello, World!]
ve
PrintArgs.class
dosyalarıylaPrintArgs.java
aynı klasörde adlıMETA-INF
bir klasör oluşturun.META-INF
klasöründe, aşağıdaki içeriklere sahip adlıMANIFEST.MF
bir dosya oluşturun. Bu dosyanın sonuna yeni bir satır eklediğinizden emin olun:Main-Class: PrintArgs
Klasörün kökünden
databricks_jar_test
adlıPrintArgs.jar
bir JAR oluşturun:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(İsteğe bağlı) Test etmek için klasörün kökünden
databricks_jar_test
JAR'ı çalıştırın:java -jar PrintArgs.jar Hello World! # [Hello, World!]
Not
hatasını
no main manifest attribute, in PrintArgs.jar
alırsanız, dosyanın sonuna yeni bir satır eklediğinizdenMANIFEST.MF
emin olun ve JAR oluşturmayı ve çalıştırmayı yeniden deneyin.Bir birime yükleyin
PrintArgs.jar
. Bkz . Unity Kataloğu birimine dosya yükleme.
Scala JAR oluşturma
klasöründen
databricks_jar_test
aşağıdaki içeriklere sahip adlıbuild.sbt
boş bir dosya oluşturun:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
klasöründen
databricks_jar_test
klasör yapısınısrc/main/scala/example
oluşturun.example
klasöründe, aşağıdaki içeriklere sahip adlıPrintArgs.scala
bir dosya oluşturun:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
Programı derleyin:
sbt compile
(İsteğe bağlı) Derlenmiş programı çalıştırın:
sbt "run Hello World\!" # Hello, World!
databricks_jar_test/project
klasöründe, aşağıdaki içeriklere sahip adlıassembly.sbt
bir dosya oluşturun:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
Klasörün kökünden
databricks_jar_test
, klasörün altındatarget
bir JAR oluşturan komutunu çalıştırınassembly
:sbt assembly
(İsteğe bağlı) Test etmek için klasörün kökünden
databricks_jar_test
JAR'ı çalıştırın:java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World! # Hello, World!
Bir birime yükleyin
PrintArgs-assembly-0.1.0-SNAPSHOT.jar
. Bkz . Unity Kataloğu birimine dosya yükleme.
Adım 3. JAR'yi çalıştırmak için Azure Databricks işi oluşturma
- Azure Databricks giriş sayfanıza gidin ve aşağıdakilerden birini yapın:
- Kenar çubuğunda İş Akışları'na ve öğesine tıklayın.
- Kenar çubuğunda Yeni'ye tıklayın ve menüden İş'i seçin.
- Görevler sekmesinde görüntülenen görev iletişim kutusunda, İşiniz için ad ekle... yerine iş adınızı (örneğin
JAR example
) yazın. - Görev adı için görev için java veya
scala_jar_task
Scala gibijava_jar_task
bir ad girin. - Tür için JAR'ı seçin.
- Main sınıfı için, bu örnekte Java veya
example.PrintArgs
Scala için girinPrintArgs
. - Küme için uyumlu bir küme seçin. Bkz. Java ve Scala kitaplık desteği.
- Bağımlı kitaplıklar için + Ekle'ye tıklayın.
- Bağımlı kitaplık ekle iletişim kutusunda, Birimler seçili durumdayken, önceki adımda Birimler Dosya Yolu'na JAR ' yi (
PrintArgs.jar
veyaPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) yüklediğiniz konumu girin veya JAR dosyasını bulmak için filtreleyin veya göz atın. Bu öğeyi seçin. - Ekle'yi tıklatın.
- Parametreler için, bu örnek için girin
["Hello", "World!"]
. - Ekle'yi tıklatın.
4. Adım: İşi çalıştırma ve iş çalıştırma ayrıntılarını görüntüleme
İş akışını çalıştırmak için tıklayın . Çalıştırmanın ayrıntılarını görüntülemek için, Tetiklenen çalıştırma açılır penceresinde Çalıştırmayı görüntüle'ye tıklayın veya iş çalıştırmaları görünümünde çalıştırmanın Başlangıç zamanı sütunundaki bağlantıya tıklayın.
Çalıştırma tamamlandığında çıkış, göreve geçirilen bağımsız değişkenler de dahil olmak üzere Çıkış panelinde görüntülenir.
JAR işleri için çıkış boyutu sınırları
stdout'a yayılan günlük çıkışı gibi iş çıktısı 20 MB boyut sınırına tabidir. Toplam çıkışın boyutu daha büyükse, çalıştırma iptal edilir ve başarısız olarak işaretlenir.
Bu sınırla karşılaşmamak için Spark yapılandırmasını olarak ayarlayarak spark.databricks.driver.disableScalaOutput
stdout'un sürücüden Azure Databricks'e true
döndürülmesini engelleyebilirsiniz. Varsayılan olarak, bayrak değeri şeklindedir false
. Bayrak, Scala JAR işleri ve Scala not defterleri için hücre çıkışını denetler. Bayrak etkinleştirilirse Spark, istemciye iş yürütme sonuçları döndürmez. Bayrağı, kümenin günlük dosyalarına yazılan verileri etkilemez. Databricks bu bayrağın yalnızca JAR işleri için iş kümeleri için ayarlanmasını önerir çünkü not defteri sonuçlarını devre dışı bırakır.
Öneri: Paylaşılanı kullanma SparkContext
Azure Databricks yönetilen bir hizmet olduğundan Apache Spark işlerinizin doğru çalıştığından emin olmak için bazı kod değişiklikleri gerekebilir. JAR işi programlarının, almak için paylaşılan SparkContext
API'yi SparkContext
kullanması gerekir. Azure Databricks tarafından başlatıldığından SparkContext
, çağıran new SparkContext()
programlar başarısız olur. almak SparkContext
için yalnızca Azure Databricks tarafından oluşturulan paylaşılan SparkContext
öğesini kullanın:
val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()
Paylaşılan SparkContext
kullanırken kaçınmanız gereken birkaç yöntem de vardır.
- çağrısı
SparkContext.stop()
yapma. - Programınızı aramayın
System.exit(0)
veyasc.stop()
programınızınMain
sonunda aramayın. Bu tanımsız davranışa neden olabilir.
Öneri: İş temizleme için blokları kullanma try-finally
İki bölümden oluşan bir JAR düşünün:
jobBody()
işin ana bölümünü içerir.jobCleanup()
bu işlevin başarılı olup olmadığı veya bir özel durum döndürdükten sonrajobBody()
yürütülmesi gerekir.
Örneğin, jobBody()
tablolar oluşturur ve jobCleanup()
bu tabloları bırakır.
Temizleme yönteminin çağrılmasını sağlamanın güvenli yolu koda bir try-finally
blok yerleştirmektir:
try {
jobBody()
} finally {
jobCleanup()
}
veya aşağıdaki kodu kullanarak sys.addShutdownHook(jobCleanup)
temizlemeyi denememelisiniz:
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
Spark kapsayıcılarının kullanım ömrü Azure Databricks'te yönetildiği için kapatma kancaları güvenilir bir şekilde çalıştırılmaz.
JAR işi parametrelerini yapılandırma
JSON dize dizisiyle JAR işlerine parametre geçirirsiniz. spark_jar_task
İşler API'sindeki Yeni iş oluşturma işlemine (POST /jobs/create
) geçirilen istek gövdesindeki nesneye bakın. Bu parametrelere erişmek için işlevinize main
geçirilen diziyi String
inceleyin.
Kitaplık bağımlılıklarını yönetme
Spark sürücüsünün geçersiz kılınamayan bazı kitaplık bağımlılıkları vardır. İşiniz çakışan kitaplıklar eklerse Spark sürücü kitaplığı bağımlılıkları önceliklidir.
Sürücü kitaplığı bağımlılıklarının tam listesini almak için, aynı Spark sürümüyle yapılandırılmış bir kümeye (veya incelemek istediğiniz sürücüye sahip kümeye) bağlı bir not defterinde aşağıdaki komutu çalıştırın:
%sh
ls /databricks/jars
JAR'ler için kitaplık bağımlılıkları tanımladığınızda Databricks, Spark ve Hadoop'un bağımlılık olarak provided
listelenmesi önerilir. Maven'da Spark ve Hadoop'ı sağlanan bağımlılıklar olarak ekleyin:
<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>
içinde sbt
Spark ve Hadoop'ı sağlanan bağımlılıklar olarak ekleyin:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"
İpucu
Çalıştırdığınız sürüme göre bağımlılıklarınız için doğru Scala sürümünü belirtin.
Sonraki adımlar
Azure Databricks işleri oluşturma ve çalıştırma hakkında daha fazla bilgi edinmek için bkz . İş akışlarını zamanlama ve düzenleme.