Använda en JAR i ett Azure Databricks-jobb
Java-arkivet eller JAR- filformatet baseras på det populära ZIP-filformatet och används för att aggregera många Java- eller Scala-filer till en. Med hjälp av JAR-uppgiften kan du säkerställa snabb och tillförlitlig installation av Java- eller Scala-kod i dina Azure Databricks-jobb. Den här artikeln innehåller ett exempel på hur du skapar en JAR-fil och ett jobb som kör programmet som paketeras i JAR-filen. I det här exemplet kommer du att:
- Skapa JAR-projektet som definierar ett exempelprogram.
- Paketera exempelfilerna i en JAR-fil.
- Skapa ett jobb för att köra JAR-filen.
- Kör jobbet och visa resultatet.
Innan du börjar
Du behöver följande för att slutföra det här exemplet:
- Java Development Kit (JDK) för Java JARs.
- För Scala JARs, JDK och sbt.
Steg 1: Skapa en lokal katalog för exemplet
Skapa en lokal katalog för att lagra exempelkoden och genererade artefakter, till exempel databricks_jar_test
.
Steg 2: Skapa JAR-filen
Följ anvisningarna nedan om du vill använda Java eller Scala för att skapa JAR-filen.
Skapa en Java JAR
Från mappen
databricks_jar_test
skapar du en fil med namnetPrintArgs.java
med följande innehåll:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
Kompilera
PrintArgs.java
filen, som skapar filenPrintArgs.class
:javac PrintArgs.java
(Valfritt) Kör det kompilerade programmet:
java PrintArgs Hello World! # [Hello, World!]
Skapa en mapp med namnet
PrintArgs.java
i samma mapp somPrintArgs.class
filerna ochMETA-INF
.I mappen
META-INF
skapar du en fil med namnetMANIFEST.MF
med följande innehåll. Se till att lägga till en ny rad i slutet av den här filen:Main-Class: PrintArgs
Från roten i
databricks_jar_test
mappen skapar du en JAR med namnetPrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(Valfritt) Om du vill testa den kör du JAR från roten i
databricks_jar_test
mappen:java -jar PrintArgs.jar Hello World! # [Hello, World!]
Kommentar
Om du får felet
no main manifest attribute, in PrintArgs.jar
måste du lägga till en ny rad i slutet av filenMANIFEST.MF
och sedan försöka skapa och köra JAR-filen igen.Ladda upp
PrintArgs.jar
till en volym. Se Ladda upp filer till en Unity Catalog-volym.
Skapa en Scala JAR
Från mappen
databricks_jar_test
skapar du en tom fil med namnetbuild.sbt
med följande innehåll:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
Skapa mappstrukturen
databricks_jar_test
frånsrc/main/scala/example
mappen .I mappen
example
skapar du en fil med namnetPrintArgs.scala
med följande innehåll:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
Kompilera programmet:
sbt compile
(Valfritt) Kör det kompilerade programmet:
sbt "run Hello World\!" # Hello, World!
I mappen
databricks_jar_test/project
skapar du en fil med namnetassembly.sbt
med följande innehåll:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
Kör kommandot från mappens
databricks_jar_test
assembly
rot, som genererar en JAR under mappentarget
:sbt assembly
(Valfritt) Om du vill testa den kör du JAR från roten i
databricks_jar_test
mappen:java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World! # Hello, World!
Ladda upp
PrintArgs-assembly-0.1.0-SNAPSHOT.jar
till en volym. Se Ladda upp filer till en Unity Catalog-volym.
Steg 3. Skapa ett Azure Databricks-jobb för att köra JAR
- Gå till din Azure Databricks-landningssida och gör något av följande:
- I sidofältet klickar du på
Arbetsflöden och klickar på
.
- I sidofältet klickar du på
Ny och väljer Jobb på menyn.
- I sidofältet klickar du på
- I den aktivitetsdialogruta som visas på fliken Uppgifter ersätter du Lägg till ett namn för jobbet... med ditt jobbnamn, till exempel
JAR example
. - Som Uppgiftsnamn anger du ett namn för aktiviteten, till exempel
java_jar_task
för Java ellerscala_jar_task
för Scala. - För Typväljer du JAR-.
- För Main-klassen anger du
PrintArgs
i det här exemplet för Java ellerexample.PrintArgs
Scala. - För Klusterväljer du ett kompatibelt kluster. Se Stöd för Java- och Scala-bibliotek.
- För Beroende bibliotek klickar du på + Lägg till.
- I dialogrutan Lägg till beroende bibliotek, med Volymer markerat, anger du platsen där du laddade upp JAR-filen (
PrintArgs.jar
ellerPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) i föregående steg i Volymer filstig, eller filtrerar eller bläddrar för att hitta JAR-filen. Välj den. - Klicka på Lägg till.
- För Parametraranger du i det här exemplet
["Hello", "World!"]
. - Klicka på Lägg till.
Steg 4: Kör jobbet och visa jobbkörningsinformationen
Klicka för att köra arbetsflödet. Om du vill visa information om körning, klicka på Visa körning i popup-fönstret Utlösta körningar eller klicka på länken i kolumnen Starttid för körningen i jobbkörningar.
När körningen är klar visas utdata i panelen Utdata , inklusive argumenten som skickas till uppgiften.
Storleksgränser för utdata för JAR-jobb
Jobbutdata, till exempel loggutdata som skickas till stdout, omfattas av en storleksgräns på 20 MB. Om totalutdata har en större storlek avbryts körningen och markeras som misslyckad.
För att undvika att stöta på den här gränsen kan du förhindra att stdout returneras från drivrutinen till Azure Databricks genom att ange spark.databricks.driver.disableScalaOutput
Spark-konfigurationen till true
. Som standard är false
flaggvärdet . Flaggan styr cellutdata för Scala JAR-jobb och Scala-notebook-filer. Om flaggan är aktiverad returnerar Spark inte jobbkörningsresultat till klienten. Flaggan påverkar inte de data som skrivs i klustrets loggfiler. Databricks rekommenderar att du endast anger den här flaggan för jobbkluster för JAR-jobb eftersom den inaktiverar notebook-resultat.
Rekommendation: Använd den delade SparkContext
Eftersom Azure Databricks är en hanterad tjänst kan vissa kodändringar vara nödvändiga för att säkerställa att dina Apache Spark-jobb körs korrekt. JAR-jobprogram måste använda det delade SparkContext
API:et för att hämta SparkContext
. Eftersom Azure Databricks initierar SparkContext
kommer program som anropar new SparkContext()
att misslyckas. Om du vill hämta SparkContext
använder du endast den delade SparkContext
som skapats av Azure Databricks:
val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()
Det finns också flera metoder som du bör undvika när du använder den delade SparkContext
.
- Anropa
SparkContext.stop()
inte . - Anropa
System.exit(0)
inte ellersc.stop()
i slutet av programmetMain
. Detta kan orsaka odefinierat beteende.
Rekommendation: Använd try-finally
block för jobbrensning
Tänk dig en JAR som består av två delar:
-
jobBody()
som innehåller huvuddelen av jobbet. -
jobCleanup()
som måste köras efterjobBody()
, oavsett om funktionen lyckades eller returnerade ett undantag.
Till exempel skapar jobBody()
tabeller och jobCleanup()
släpper dessa tabeller.
Det säkra sättet att se till att rensningsmetoden anropas är att placera ett try-finally
block i koden:
try {
jobBody()
} finally {
jobCleanup()
}
Du bör inte försöka rensa med hjälp av sys.addShutdownHook(jobCleanup)
eller följande kod:
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
På grund av hur Livslängden för Spark-containrar hanteras i Azure Databricks körs inte avstängningskrokerna på ett tillförlitligt sätt.
Konfigurera JAR-jobbparametrar
Du skickar parametrar till JAR-jobb med en JSON-strängmatris. Se objektet spark_jar_task
i begärandetexten som skickades till åtgärden Skapa ett nytt jobb (POST /jobs/create
) i JOBB-API:et. Om du vill komma åt dessa parametrar kontrollerar du den String
matris som skickas till din main
-funktion.
Hantera biblioteksberoenden
Spark-drivrutinen har vissa biblioteksberoenden som inte kan åsidosättas. Om ditt jobb lägger till bibliotek som är i konflikt har Beroenden för Spark-drivrutinsbiblioteket företräde.
Om du vill hämta den fullständiga listan över beroenden för drivrutinsbiblioteket kör du följande kommando i en notebook-fil som är kopplad till ett kluster som konfigurerats med samma Spark-version (eller klustret med den drivrutin som du vill undersöka):
%sh
ls /databricks/jars
När du definierar biblioteksberoenden för JAR:er rekommenderar Databricks att du listar Spark och Hadoop som provided
beroenden. I Maven lägger du till Spark och Hadoop som tillhandahållna beroenden:
<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 sbt
lägger du till Spark och Hadoop som tillhandahållna beroenden:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"
Dricks
Ange rätt Scala-version för dina beroenden baserat på vilken version du kör.
Nästa steg
Mer information om hur du skapar och kör Azure Databricks-jobb finns i Översikt över orkestrering på Databricks.