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_test
například .
Krok 2: Vytvoření JAR
Podle následujících pokynů vytvořte soubor JAR pomocí Javy nebo Scaly.
Vytvoření java JAR
databricks_jar_test
Ze složky vytvořte soubor s názvemPrintArgs.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)); } }
PrintArgs.java
Zkompilujte soubor, který vytvoří souborPrintArgs.class
:javac PrintArgs.java
(Volitelné) Spusťte kompilovaný program:
java PrintArgs Hello World! # [Hello, World!]
Ve stejné složce jako
PrintArgs.java
soubory aPrintArgs.class
soubory vytvořte složku s názvemMETA-INF
.META-INF
Ve složce vytvořte soubor s názvemMANIFEST.MF
s následujícím obsahem. Nezapomeňte na konec tohoto souboru přidat nový řádek:Main-Class: PrintArgs
V kořenovém adresáři
databricks_jar_test
složky vytvořte soubor JAR s názvemPrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(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 konecMANIFEST.MF
souboru přidat nový řádek a pak zkuste soubor JAR vytvořit a spustit znovu.Nahrajte
PrintArgs.jar
na svazek. Viz Nahrání souborů do svazku katalogu Unity.
Vytvoření scala JAR
databricks_jar_test
Ze složky vytvořte prázdný soubor s názvembuild.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" )
databricks_jar_test
Ze složky vytvořte strukturusrc/main/scala/example
složek .example
Ve složce vytvořte soubor s názvemPrintArgs.scala
s následujícím obsahem:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
Zkompilujte program:
sbt compile
(Volitelné) Spusťte kompilovaný program:
sbt "run Hello World\!" # Hello, World!
databricks_jar_test/project
Ve složce vytvořte soubor s názvemassembly.sbt
s následujícím obsahem:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
V kořenovém adresáři
databricks_jar_test
složky spusťteassembly
příkaz, který ve složce vygeneruje soubor JARtarget
:sbt assembly
(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!
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
- 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 Pracovní postupy a klikněte na .
- Na bočním panelu klikněte na Nový a v nabídce vyberte Úloha.
- 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
. - Jako název úkolu zadejte název úkolu, například
java_jar_task
Java neboscala_jar_task
Scala. - Jako typ vyberte SOUBOR JAR.
- V případě třídy Main v tomto příkladu zadejte
PrintArgs
pro Javu neboexample.PrintArgs
pro Scala. - V případě clusteru vyberte kompatibilní cluster. Viz podpora knihoven Java a Scala.
- U závislých knihoven klikněte na + Přidat.
- V dialogovém okně Přidat závislá knihovna s vybranými svazky zadejte umístění, kam jste soubor JAR (
PrintArgs.jar
neboPrintArgs-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. - Klikněte na tlačítko Přidat.
- Pro parametry v tomto příkladu zadejte
["Hello", "World!"]
. - Klikněte na tlačítko Přidat.
Krok 4: Spuštění úlohy a zobrazení podrobností o spuštění úlohy
Kliknutím 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 false
hodnota 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í SparkContext
API 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 SparkContext
použ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)
anisc.stop()
na konci programuMain
. 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 pojobBody()
, 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 sbt
a 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ů.