Sdílet prostřednictvím


Použití JAR v úloze Azure Databricks

Archiv Jazyka Java nebo [JAR](https://en.wikipedia.org/wiki/JAR_(file_format) formát souboru je založený na oblíbeném formátu souboru ZIP a používá se k agregaci mnoha souborů Java nebo Scala do jednoho. Pomocí úlohy JAR můžete zajistit rychlou a spolehlivou instalaci kódu Java nebo Scala v úlohách Azure Databricks. Tento článek obsahuje příklad vytvoření souboru JAR a úlohy, která spouští aplikaci zabalenou v souboru JAR. V tomto příkladu:

  • Vytvořte projekt JAR definující ukázkovou aplikaci.
  • Sbalte ukázkové soubory do souboru JAR.
  • Vytvořte úlohu pro spuštění souboru JAR.
  • Spusťte úlohu a zobrazte výsledky.

Než začnete

K dokončení tohoto příkladu potřebujete následující:

  • V javě JAR je sada Java Development Kit (JDK).
  • Pro Scala JARs, sada JDK a sbt.

Krok 1: Vytvoření místního adresáře pro příklad

Vytvořte místní adresář pro uložení ukázkového kódu a vygenerovaných artefaktů, databricks_jar_testnapříklad .

Krok 2: Vytvoření JAR

Podle následujících pokynů vytvořte soubor JAR pomocí Javy nebo Scaly.

Vytvoření java JAR

  1. databricks_jar_test Ze složky vytvořte soubor s názvem PrintArgs.java s následujícím obsahem:

    import java.util.Arrays;
    
    public class PrintArgs {
      public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
      }
    }
    
  2. PrintArgs.java Zkompilujte soubor, který vytvoří souborPrintArgs.class:

    javac PrintArgs.java
    
  3. (Volitelné) Spusťte kompilovaný program:

    java PrintArgs Hello World!
    
    # [Hello, World!]
    
  4. Ve stejné složce jako PrintArgs.java soubory a PrintArgs.class soubory vytvořte složku s názvem META-INF.

  5. META-INF Ve složce vytvořte soubor s názvem MANIFEST.MF s následujícím obsahem. Nezapomeňte na konec tohoto souboru přidat nový řádek:

    Main-Class: PrintArgs
    
  6. V kořenovém adresáři databricks_jar_test složky vytvořte soubor JAR s názvem PrintArgs.jar:

    jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
    
  7. (Volitelné) Pokud ho chcete otestovat, spusťte z kořenové složky databricks_jar_test soubor JAR:

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

    Poznámka:

    Pokud se zobrazí chyba no main manifest attribute, in PrintArgs.jar, nezapomeňte na konec MANIFEST.MF souboru přidat nový řádek a pak zkuste soubor JAR vytvořit a spustit znovu.

  8. Nahrajte PrintArgs.jar na svazek. Viz Nahrání souborů do svazku katalogu Unity.

Vytvoření scala JAR

  1. databricks_jar_test Ze složky vytvořte prázdný soubor s názvem build.sbt s následujícím obsahem:

    ThisBuild / scalaVersion := "2.12.14"
    ThisBuild / organization := "com.example"
    
    lazy val PrintArgs = (project in file("."))
      .settings(
        name := "PrintArgs"
      )
    
  2. databricks_jar_test Ze složky vytvořte strukturu src/main/scala/examplesložek .

  3. example Ve složce vytvořte soubor s názvem PrintArgs.scala s následujícím obsahem:

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

    sbt compile
    
  5. (Volitelné) Spusťte kompilovaný program:

    sbt "run Hello World\!"
    
    # Hello, World!
    
  6. databricks_jar_test/project Ve složce vytvořte soubor s názvem assembly.sbt s následujícím obsahem:

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
    
  7. V kořenovém adresáři databricks_jar_test složky spusťte assembly příkaz, který ve složce vygeneruje soubor JAR target :

    sbt assembly
    
  8. (Volitelné) Pokud ho chcete otestovat, spusťte z kořenové složky databricks_jar_test soubor JAR:

    java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World!
    
    # Hello, World!
    
  9. Nahrajte PrintArgs-assembly-0.1.0-SNAPSHOT.jar na svazek. Viz Nahrání souborů do svazku katalogu Unity.

Krok 3. Vytvoření úlohy Azure Databricks pro spuštění JAR

  1. Přejděte na cílovou stránku Azure Databricks a udělejte jednu z těchto věcí:
    • Na bočním panelu klikněte na Ikona Pracovních postupůPracovní postupy a klikněte na .Tlačítko Vytvořit úlohu
    • Na bočním panelu klikněte na Nová ikona Nový a v nabídce vyberte Úloha.
  2. V dialogovém okně úkolu, které se zobrazí na kartě Úkoly , nahraďte přidat název vaší úlohy... názvem vaší úlohy, například JAR example.
  3. Jako název úkolu zadejte název úkolu, například java_jar_task Java nebo scala_jar_task Scala.
  4. Jako typ vyberte SOUBOR JAR.
  5. V případě třídy Main v tomto příkladu zadejte PrintArgs pro Javu nebo example.PrintArgs pro Scala.
  6. V případě clusteru vyberte kompatibilní cluster. Viz podpora knihoven Java a Scala.
  7. U závislých knihoven klikněte na + Přidat.
  8. V dialogovém okně Přidat závislá knihovna s vybranými svazky zadejte umístění, kam jste soubor JAR (PrintArgs.jarnebo PrintArgs-assembly-0.1.0-SNAPSHOT.jar) nahráli v předchozím kroku do cesty k souboru Svazky, nebo pomocí filtru nebo procházením vyhledejte soubor JAR. Vyberte ji.
  9. Klikněte na tlačítko Přidat.
  10. Pro parametry v tomto příkladu zadejte ["Hello", "World!"].
  11. Klikněte na tlačítko Přidat.

Krok 4: Spuštění úlohy a zobrazení podrobností o spuštění úlohy

Kliknutím Tlačítko Spustit nyní spustíte pracovní postup. Chcete-li zobrazit podrobnosti o spuštění, klepněte na tlačítko Zobrazit spuštění v automaticky otevíraném okně Aktivované spuštění nebo klepněte na odkaz ve sloupci Čas spuštění pro spuštění v zobrazení spuštění úlohy.

Po dokončení spuštění se výstup zobrazí na panelu Výstup , včetně argumentů předaných úkolu.

Omezení velikosti výstupu pro úlohy JAR

Výstup úlohy, jako je výstup protokolu vygenerovaný do výstupu stdout, podléhá limitu velikosti 20 MB. Pokud má celkový výstup větší velikost, spuštění se zruší a označí jako neúspěšné.

Abyste se vyhnuli tomuto limitu, můžete zabránit vrácení stdoutu z ovladače do Azure Databricks nastavením konfigurace Sparku spark.databricks.driver.disableScalaOutput na true. Ve výchozím nastavení je falsehodnota příznaku . Příznak řídí výstup buňky pro úlohy Scala JAR a poznámkové bloky Scala. Pokud je příznak povolený, Spark nevrací výsledky provádění úloh klientovi. Příznak nemá vliv na data zapsaná v souborech protokolu clusteru. Databricks doporučuje nastavit tento příznak jenom pro clustery úloh JAR, protože zakáže výsledky poznámkových bloků.

Doporučení: Použití sdíleného SparkContext

Vzhledem k tomu, že Azure Databricks je spravovaná služba, můžou být některé změny kódu nezbytné, aby se úlohy Apache Sparku spouštěly správně. Programy úloh JAR musí k získání rozhraní SparkContextAPI používat sdílené SparkContext rozhraní API . Vzhledem k tomu, že Azure Databricks inicializuje SparkContext, programy, které volají new SparkContext() , selžou. K získání této možnosti SparkContextpoužijte pouze sdílenou službu SparkContext Azure Databricks:

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

Existuje také několik metod, kterým byste se měli vyhnout při použití sdíleného SparkContext.

  • Nevolejte SparkContext.stop().
  • Nevolejte System.exit(0) ani sc.stop() na konci programu Main . To může způsobit nedefinované chování.

Doporučení: Použití try-finally bloků pro vyčištění úlohy

Zvažte soubor JAR, který se skládá ze dvou částí:

  • jobBody() která obsahuje hlavní část úlohy.
  • jobCleanup() který musí být proveden po jobBody(), zda tato funkce byla úspěšná nebo vrátila výjimku.

Například jobBody() vytvoří tabulky a jobCleanup() tyto tabulky zahodí.

Bezpečným způsobem, jak zajistit, aby byla volána metoda vyčištění, je vložit try-finally blok do kódu:

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

Neměli byste se pokoušet vyčistit pomocí sys.addShutdownHook(jobCleanup) následujícího kódu:

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

Vzhledem ke způsobu, jakým se kontejnery Sparku spravují v Azure Databricks, nejsou háky vypnutí spolehlivě spuštěné.

Konfigurace parametrů úlohy JAR

Parametry předáte úlohě JAR s polem řetězců JSON. Prohlédněte si spark_jar_task objekt v textu požadavku předaný operaci Vytvořit novou úlohu (POST /jobs/create) v rozhraní API úloh. Pokud chcete získat přístup k těmto parametrům, zkontrolujte String pole předané do vaší main funkce.

Správa závislostí knihovny

Ovladač Sparku má určité závislosti knihovny, které nelze přepsat. Pokud vaše úloha přidává konfliktní knihovny, mají přednost závislosti knihovny ovladačů Sparku.

Úplný seznam závislostí knihovny ovladačů získáte spuštěním následujícího příkazu v poznámkovém bloku připojeném ke clusteru, který má nakonfigurovanou stejnou verzi Sparku (nebo cluster s ovladačem, který chcete prozkoumat):

%sh
ls /databricks/jars

Když definujete závislosti knihoven pro jars, Databricks doporučuje vypisovat Spark a Hadoop jako provided závislosti. V Mavenu přidejte Spark a Hadoop jako poskytnuté závislosti:

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

Přidejte Spark sbta Hadoop jako poskytnuté závislosti:

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

Tip

Zadejte správnou verzi Scala pro závislosti na verzi, kterou používáte.

Další kroky

Další informace o vytváření a spouštění úloh Azure Databricks najdete v tématu Plánování a orchestrace pracovních postupů.