Een JAR gebruiken in een Azure Databricks-taak
Het Java-archief of JAR- bestandsindeling is gebaseerd op de populaire ZIP-bestandsindeling en wordt gebruikt voor het samenvoegen van veel Java- of Scala-bestanden in één. Met behulp van de JAR-taak kunt u snelle en betrouwbare installatie van Java- of Scala-code in uw Azure Databricks-taken garanderen. Dit artikel bevat een voorbeeld van het maken van een JAR en een taak waarmee de toepassing wordt uitgevoerd die is verpakt in de JAR. In dit voorbeeld gaat u het volgende doen:
- Maak het JAR-project waarin een voorbeeldtoepassing wordt gedefinieerd.
- Bundel de voorbeeldbestanden in een JAR.
- Maak een taak om het JAR-bestand uit te voeren.
- Voer de taak uit en bekijk de resultaten.
Voordat u begint
U hebt het volgende nodig om dit voorbeeld te voltooien:
- Voor Java JAR's, de Java Development Kit (JDK).
- Voor Scala-JA's, de JDK en sbt.
Stap 1: Een lokale map maken voor het voorbeeld
Maak een lokale map voor het opslaan van de voorbeeldcode en gegenereerde artefacten, databricks_jar_test
bijvoorbeeld.
Stap 2: het JAR-bestand maken
Volg de volgende instructies om Java of Scala te gebruiken om het JAR-bestand te maken.
Een Java JAR maken
Maak vanuit de
databricks_jar_test
map een bestand met de naamPrintArgs.java
met de volgende inhoud:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
Compileer het
PrintArgs.java
bestand, waarmee het bestandPrintArgs.class
wordt gemaakt:javac PrintArgs.java
(Optioneel) Voer het gecompileerde programma uit:
java PrintArgs Hello World! # [Hello, World!]
Maak in dezelfde map als de en
PrintArgs.java
bestanden een map met dePrintArgs.class
naamMETA-INF
.Maak in de
META-INF
map een bestand met de naamMANIFEST.MF
met de volgende inhoud. Zorg ervoor dat u een nieuwe regel toevoegt aan het einde van dit bestand:Main-Class: PrintArgs
Maak vanuit de hoofdmap van de map een JAR met de
databricks_jar_test
naamPrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(Optioneel) Als u dit wilt testen, voert u vanuit de hoofdmap van de
databricks_jar_test
map het JAR-bestand uit:java -jar PrintArgs.jar Hello World! # [Hello, World!]
Notitie
Als de fout
no main manifest attribute, in PrintArgs.jar
wordt weergegeven, voegt u een nieuwe regel toe aan het einde van hetMANIFEST.MF
-bestand en probeert u het JAR-bestand opnieuw te maken en uit te voeren.Uploaden
PrintArgs.jar
naar een volume. Zie Bestanden uploaden naar een Unity Catalog-volume.
Een Scala JAR maken
Maak vanuit de
databricks_jar_test
map een leeg bestand met de naambuild.sbt
met de volgende inhoud:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
Maak vanuit de
databricks_jar_test
map de mapstructuursrc/main/scala/example
.Maak in de
example
map een bestand met de naamPrintArgs.scala
met de volgende inhoud:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
Compileer het programma:
sbt compile
(Optioneel) Voer het gecompileerde programma uit:
sbt "run Hello World\!" # Hello, World!
Maak in de
databricks_jar_test/project
map een bestand met de naamassembly.sbt
met de volgende inhoud:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
Voer vanuit de hoofdmap van de
databricks_jar_test
map deassembly
opdracht uit, waarmee een JAR wordt gegenereerd onder detarget
map:sbt assembly
(Optioneel) Als u dit wilt testen, voert u vanuit de hoofdmap van de
databricks_jar_test
map het JAR-bestand uit:java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World! # Hello, World!
Uploaden
PrintArgs-assembly-0.1.0-SNAPSHOT.jar
naar een volume. Zie Bestanden uploaden naar een Unity Catalog-volume.
Stap 3. Een Azure Databricks-taak maken om het JAR-bestand uit te voeren
- Ga naar de landingspagina van Azure Databricks en voer een van de volgende handelingen uit:
- Klik in de zijbalk op
Werkstromen en klik op
.
- Klik in de zijbalk op
Nieuw en selecteer Taak in het menu.
- Klik in de zijbalk op
- Vervang in het taakdialoogvenster dat wordt weergegeven op het tabblad Taken een naam voor uw taak toevoegen...
-
Voer voor taaknaam een naam in voor de taak, bijvoorbeeld
java_jar_task
voor Java ofscala_jar_task
scala. - Selecteer JAR-voor type.
-
Voer voor Main-klasse voor dit voorbeeld in
PrintArgs
voor Java ofexample.PrintArgs
voor Scala. - Selecteer voor Clustereen compatibel cluster. Zie ondersteuning voor Java- en Scala-bibliotheken.
- Klik op + Toevoegen voor afhankelijke bibliotheken.
- Voer in het dialoogvenster Afhankelijke bibliotheek toevoegen, met Volumes geselecteerd, de locatie in waar u de JAR (
PrintArgs.jar
ofPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) in de vorige stap hebt geüpload naar bestandspad voor volumes, of filter of blader om het JAR-bestand te vinden. Selecteer het. - Klik op Toevoegen.
- Voer voor Parametersvoor dit voorbeeld
["Hello", "World!"]
in. - Klik op Toevoegen.
Stap 4: Voer de taak uit en bekijk de details van de taakuitvoering
Klik hier om de werkstroom uit te voeren. Als u details voor de uitvoeringwilt weergeven, klikt u in het pop-upvenster Geactiveerde uitvoering op Uitvoering weergeven of klikt u op de link in de kolom Begintijd voor de uitvoering in de taakuitvoeringen weergave.
Wanneer de uitvoering is voltooid, wordt de uitvoer weergegeven in het deelvenster Uitvoer , inclusief de argumenten die aan de taak zijn doorgegeven.
Uitvoergroottelimieten voor JAR-taken
Taakuitvoer, zoals logboekuitvoer die naar stdout wordt verzonden, is onderworpen aan een maximale grootte van 20 MB. Als de totale uitvoer een grotere grootte heeft, wordt de uitvoering geannuleerd en gemarkeerd als mislukt.
Om te voorkomen dat deze limiet wordt bereikt, kunt u voorkomen dat stdout wordt geretourneerd van het stuurprogramma naar Azure Databricks door de spark.databricks.driver.disableScalaOutput
Spark-configuratie in te stellen op true
. Standaard is false
de vlagwaarde . De vlag bepaalt de celuitvoer voor Scala JAR-taken en Scala-notebooks. Als de vlag is ingeschakeld, retourneert Spark geen taakuitvoeringsresultaten naar de client. De vlag heeft geen invloed op de gegevens die zijn geschreven in de logboekbestanden van het cluster. Databricks raadt aan deze vlag alleen in te stellen voor taakclusters voor JAR-taken, omdat hiermee notebookresultaten worden uitgeschakeld.
Aanbeveling: Het gedeelde gebruiken SparkContext
Omdat Azure Databricks een beheerde service is, zijn er mogelijk enkele codewijzigingen nodig om ervoor te zorgen dat uw Apache Spark-taken correct worden uitgevoerd. JAR-taakprogramma's moeten gebruik maken van de gedeelde SparkContext
-API om de SparkContext
te verkrijgen. Omdat Azure Databricks de SparkContext
initialiseert, mislukken programma's die worden aangeroepen new SparkContext()
. Om de SparkContext
te verkrijgen, gebruik alleen de gedeelde SparkContext
die door Azure Databricks is gemaakt:
val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()
Er zijn ook verschillende methoden die u moet vermijden wanneer u de gedeelde methode gebruikt SparkContext
.
- Bel niet
SparkContext.stop()
. - Bel of
System.exit(0)
aan het einde van uwsc.stop()
programma nietMain
. Dit kan niet-gedefinieerd gedrag veroorzaken.
Aanbeveling: Blokken gebruiken try-finally
voor het opschonen van taken
Overweeg een JAR die uit twee delen bestaat:
-
jobBody()
dat het belangrijkste deel van de taak bevat. -
jobCleanup()
die moet worden uitgevoerd najobBody()
, of die functie is geslaagd of een uitzondering heeft geretourneerd.
jobBody()
bijvoorbeeld tabellen maakt en jobCleanup()
deze tabellen verwijdert.
De veilige manier om ervoor te zorgen dat de opschoonmethode wordt aangeroepen, is door een try-finally
blok in de code te plaatsen:
try {
jobBody()
} finally {
jobCleanup()
}
Probeer niet op te schonen met behulp van sys.addShutdownHook(jobCleanup)
of de volgende code:
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
Vanwege de manier waarop de levensduur van Spark-containers wordt beheerd in Azure Databricks, worden de afsluithaken niet betrouwbaar uitgevoerd.
JAR-taakparameters configureren
U geeft parameters door aan JAR-taken met een JSON-tekenreeksmatrix. Zie het spark_jar_task
object in de aanvraagbody die is doorgegeven aan de taakbewerking Maken (POST /jobs/create
) in de Taken-API. Voor toegang tot deze parameters controleert u de String
matrix die is doorgegeven aan uw main
-functie.
Bibliotheekafhankelijkheden beheren
Het Spark-stuurprogramma heeft bepaalde bibliotheekafhankelijkheden die niet kunnen worden overschreven. Als uw taak conflicterende bibliotheken toevoegt, hebben de afhankelijkheden van de Spark-stuurprogrammabibliotheek voorrang.
Als u de volledige lijst met de afhankelijkheden van de stuurprogrammabibliotheek wilt ophalen, voert u de volgende opdracht uit in een notebook dat is gekoppeld aan een cluster dat is geconfigureerd met dezelfde Spark-versie (of het cluster met het stuurprogramma dat u wilt onderzoeken):
%sh
ls /databricks/jars
Wanneer u bibliotheekafhankelijkheden voor JAR's definieert, raadt Databricks aan Spark en Hadoop als afhankelijkheden weer provided
te geven. Voeg in Maven Spark en Hadoop toe als opgegeven afhankelijkheden:
<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>
Voeg sbt
Spark en Hadoop toe als opgegeven afhankelijkheden:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"
Tip
Geef de juiste Scala-versie op voor uw afhankelijkheden op basis van de versie die u uitvoert.
Volgende stappen
Zie Overzicht van indeling op Databricksvoor meer informatie over het maken en uitvoeren van Azure Databricks-taken.