Aracılığıyla paylaş


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

  1. 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));
      }
    }
    
  2. dosyasını derleyin PrintArgs.java ve dosyasını PrintArgs.classoluşturur:

    javac PrintArgs.java
    
  3. (İsteğe bağlı) Derlenmiş programı çalıştırın:

    java PrintArgs Hello World!
    
    # [Hello, World!]
    
  4. ve PrintArgs.class dosyalarıyla PrintArgs.java aynı klasörde adlı META-INFbir klasör oluşturun.

  5. 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
    
  6. Klasörün kökünden databricks_jar_test adlı PrintArgs.jarbir JAR oluşturun:

    jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
    
  7. (İ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.jaralırsanız, dosyanın sonuna yeni bir satır eklediğinizden MANIFEST.MF emin olun ve JAR oluşturmayı ve çalıştırmayı yeniden deneyin.

  8. Bir birime yükleyin PrintArgs.jar . Bkz . Unity Kataloğu birimine dosya yükleme.

Scala JAR oluşturma

  1. 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"
      )
    
  2. klasöründen databricks_jar_test klasör yapısını src/main/scala/exampleoluşturun.

  3. 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(", "))
      }
    }
    
  4. Programı derleyin:

    sbt compile
    
  5. (İsteğe bağlı) Derlenmiş programı çalıştırın:

    sbt "run Hello World\!"
    
    # Hello, World!
    
  6. 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")
    
  7. Klasörün kökündendatabricks_jar_test, klasörün altında target bir JAR oluşturan komutunu çalıştırınassembly:

    sbt assembly
    
  8. (İ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!
    
  9. 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

  1. Azure Databricks giriş sayfanıza gidin ve aşağıdakilerden birini yapın:
    • Kenar çubuğunda İş İş Akışları SimgesiAkışları'na ve öğesine tıklayın.İş Oluştur Düğmesi
    • Kenar çubuğunda Yeni'ye tıklayın Yeni Simge ve menüden İş'i seçin.
  2. Görevler sekmesinde görüntülenen görev iletişim kutusunda, İşiniz için ad ekle... yerine iş adınızı (örneğinJAR example) yazın.
  3. Görev adı için görev için java veya scala_jar_task Scala gibi java_jar_task bir ad girin.
  4. Tür için JAR'ı seçin.
  5. Main sınıfı için, bu örnekte Java veya example.PrintArgs Scala için girinPrintArgs.
  6. Küme için uyumlu bir küme seçin. Bkz. Java ve Scala kitaplık desteği.
  7. Bağımlı kitaplıklar için + Ekle'ye tıklayın.
  8. Bağımlı kitaplık ekle iletişim kutusunda, Birimler seçili durumdayken, önceki adımda Birimler Dosya Yolu'na JAR ' yi (PrintArgs.jar veya PrintArgs-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.
  9. Ekle'yi tıklatın.
  10. Parametreler için, bu örnek için girin["Hello", "World!"].
  11. 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 Şimdi Çalıştır Düğmesi . Ç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 truedö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 SparkContextkullanması gerekir. Azure Databricks tarafından başlatıldığından SparkContext, çağıran new SparkContext() programlar başarısız olur. almak SparkContextiç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 SparkContextkullanı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) veya sc.stop() programınızın Main 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 sonra jobBody()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 sbtSpark 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 . Azure Databricks İşleri oluşturma ve çalıştırma.