JAR használata Azure Databricks-feladatban
A Java-archívum vagy a [JAR](https://en.wikipedia.org/wiki/JAR_(file_format) fájlformátum a népszerű ZIP-fájlformátumon alapul, és számos Java- vagy Scala-fájl összesítésére szolgál. A JAR-feladat használatával biztosíthatja a Java- vagy Scala-kód gyors és megbízható telepítését az Azure Databricks-feladatokban. Ez a cikk egy jar és egy, a JAR-ban csomagolt alkalmazást futtató feladat létrehozására mutat be példát. Ebben a példában a következőt fogja:
- Hozzon létre egy példaalkalmazást meghatározó JAR-projektet.
- Csomagolja be a példafájlokat egy JAR-ba.
- Hozzon létre egy feladatot a JAR futtatásához.
- Futtassa a feladatot, és tekintse meg az eredményeket.
Előkészületek
A példa elvégzéséhez a következőkre van szüksége:
- Java JARs esetén a Java Development Kit (JDK).
- Scala JARs esetén a JDK és az sbt.
1. lépés: Helyi könyvtár létrehozása a példához
Hozzon létre egy helyi könyvtárat a példakód tárolásához, és hozzon létre összetevőket, például databricks_jar_test
.
2. lépés: A JAR létrehozása
A JAR létrehozásához kövesse az alábbi utasításokat a Java vagy a Scala használatához.
Java JAR létrehozása
databricks_jar_test
A mappából hozzon létre egy fájltPrintArgs.java
a következő tartalommal:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
PrintArgs.java
A fájlt létrehozó fájl fordításaPrintArgs.class
:javac PrintArgs.java
(Nem kötelező) Futtassa a lefordított programot:
java PrintArgs Hello World! # [Hello, World!]
Ugyanabban a mappában, mint a
PrintArgs.java
PrintArgs.class
fájlok, hozzon létre egy mappát.META-INF
META-INF
A mappában hozzon létre egy fájltMANIFEST.MF
az alábbi tartalommal. Mindenképpen adjon hozzá egy új vonalat a fájl végén:Main-Class: PrintArgs
A mappa gyökeréből
databricks_jar_test
hozzon létre egy JAR-t a következő névenPrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(Nem kötelező) A teszteléshez futtassa a JAR-t a
databricks_jar_test
mappa gyökeréből:java -jar PrintArgs.jar Hello World! # [Hello, World!]
Feljegyzés
Ha a hibaüzenet
no main manifest attribute, in PrintArgs.jar
jelenik meg, adjon hozzá egy új vonalat aMANIFEST.MF
fájl végéhez, majd próbálja meg újból létrehozni és futtatni a JAR-t.Feltöltés
PrintArgs.jar
kötetre. Lásd: Fájlok feltöltése Unity-katalóguskötetbe.
Scala JAR létrehozása
databricks_jar_test
A mappából hozzon létre egy üres fájltbuild.sbt
a következő tartalommal:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
databricks_jar_test
A mappából hozza létre a mappastruktúrátsrc/main/scala/example
.example
A mappában hozzon létre egy fájltPrintArgs.scala
a következő tartalommal:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
A program fordítása:
sbt compile
(Nem kötelező) Futtassa a lefordított programot:
sbt "run Hello World\!" # Hello, World!
databricks_jar_test/project
A mappában hozzon létre egy fájltassembly.sbt
a következő tartalommal:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
A mappa gyökeréből
databricks_jar_test
futtassa aassembly
parancsot, amely létrehoz egy JAR-t atarget
mappa alatt:sbt assembly
(Nem kötelező) A teszteléshez futtassa a JAR-t a
databricks_jar_test
mappa gyökeréből:java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World! # Hello, World!
Feltöltés
PrintArgs-assembly-0.1.0-SNAPSHOT.jar
kötetre. Lásd: Fájlok feltöltése Unity-katalóguskötetbe.
3. lépés. Azure Databricks-feladat létrehozása a JAR futtatásához
- Nyissa meg az Azure Databricks kezdőlapját, és tegye az alábbiak egyikét:
- Az oldalsávon kattintson a Munkafolyamatok elemre, majd a gombra.
- Az oldalsávon kattintson az Új gombra, és válassza a Feladat lehetőséget a menüből.
- A Feladatok lapon megjelenő feladat párbeszédpanelen cserélje le a Feladat neve hozzáadása... elemet például
JAR example
a feladat nevére. - A Tevékenységnév mezőben adja meg a tevékenység nevét, például
java_jar_task
Java vagyscala_jar_task
Scala esetén. - A Típus beállításnál válassza a JAR lehetőséget.
- A főosztály esetében ebben a példában adja meg
PrintArgs
a Java vagyexample.PrintArgs
a Scala kifejezést. - Fürt esetén válasszon ki egy kompatibilis fürtöt. Lásd a Java és a Scala kódtár támogatását.
- Függő kódtárak esetén kattintson a + Hozzáadás gombra.
- A Függő kódtár hozzáadása párbeszédpanelen a Kötetek beállítással adja meg azt a helyet, ahová az előző lépésben feltöltötte a JAR-t (
PrintArgs.jar
vagyPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) a Kötetek fájlelérési útvonalába, vagy szűrjön vagy tallózással keresse meg a JAR-t. Válassza ki. - Kattintson a Hozzáadás gombra.
- A paraméterek esetében ebben a példában adja meg a következőt
["Hello", "World!"]
: - Kattintson a Hozzáadás gombra.
4. lépés: A feladat futtatása és a feladat futtatásának részleteinek megtekintése
Kattintson ide a munkafolyamat futtatásához. A futtatás részleteinek megtekintéséhez kattintson a Futtatás nézetre az Aktivált futtatás előugró ablakban, vagy kattintson a feladatfuttatási nézetben a Futtatás indítása oszlopban található hivatkozásra.
Amikor a futtatás befejeződik, a kimenet megjelenik a Kimenet panelen, beleértve a feladatnak átadott argumentumokat is.
A JAR-feladatok kimeneti méretkorlátjai
A feladat kimenetére, például az stdout számára kibocsátott naplókimenetre 20 MB-os méretkorlát vonatkozik. Ha a teljes kimenet nagyobb méretű, a futtatás megszakad, és sikertelenként van megjelölve.
Ennek a korlátnak a elkerülése érdekében megakadályozhatja, hogy az stdout visszakerüljön az illesztőprogramból az Azure Databricksbe, ha a Spark-konfigurációt a spark.databricks.driver.disableScalaOutput
következőre true
állítja. Alapértelmezés szerint a jelölő értéke .false
A jelölő vezérli a Scala JAR-feladatok és Scala-jegyzetfüzetek cellakimenetét. Ha a jelző engedélyezve van, a Spark nem ad vissza feladatvégrehajtási eredményeket az ügyfélnek. A jelölő nincs hatással a fürt naplófájljaiban írt adatokra. A Databricks azt javasolja, hogy ezt a jelzőt csak JAR-feladatok feladatfürtjeinél állítsa be, mert letiltja a jegyzetfüzet eredményeit.
Javaslat: A megosztott SparkContext
Mivel az Azure Databricks egy felügyelt szolgáltatás, szükség lehet néhány kódmódosításra annak biztosításához, hogy az Apache Spark-feladatok megfelelően fussanak. A JAR-feladatprogramoknak a megosztott SparkContext
API-t kell használniuk a SparkContext
lekéréshez. Mivel az Azure Databricks inicializálja a meghívást, a SparkContext
meghívni new SparkContext()
kívánt programok sikertelenek lesznek. A lekéréshez SparkContext
csak az Azure Databricks által létrehozott megosztott SparkContext
elemeket használja:
val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()
A megosztott SparkContext
metódusok használata során több módszert is el kell kerülnie.
- Ne hívjon.
SparkContext.stop()
- Ne hívjon vagy
System.exit(0)
sc.stop()
a program végénMain
. Ez meghatározatlan viselkedést okozhat.
Javaslat: Blokkok használata try-finally
a feladatok törléséhez
Vegyünk egy JAR-t, amely két részből áll:
jobBody()
amely a feladat fő részét tartalmazza.jobCleanup()
után kell végrehajtanijobBody()
, függetlenül attól, hogy ez a függvény sikeres volt-e, vagy kivételt adott vissza.
Például táblákat hoz létre, jobBody()
és jobCleanup()
elveti ezeket a táblákat.
A törlési módszer meghívásának biztonságos módja egy blokk elhelyezése try-finally
a kódban:
try {
jobBody()
} finally {
jobCleanup()
}
Ne próbálja meg törölni a kódot sys.addShutdownHook(jobCleanup)
vagy a következő kódot:
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
Mivel a Spark-tárolók élettartamának kezelése az Azure Databricksben történik, a leállítási horgok nem futnak megbízhatóan.
JAR-feladatparaméterek konfigurálása
Paramétereket ad át JAR-feladatoknak egy JSON-sztringtömbdel. Tekintse meg a spark_jar_task
Feladat API Új feladat létrehozása műveletének (POST /jobs/create
) átadott kérelem törzsében található objektumot. Ezeknek a paramétereknek a eléréséhez vizsgálja meg a String
függvénynek main
átadott tömböt.
Erőforrástár-függőségek kezelése
A Spark-illesztőprogram bizonyos könyvtárfüggőségekkel rendelkezik, amelyeket nem lehet felülírni. Ha a feladat ütköző kódtárakat ad hozzá, a Spark-illesztőprogram-kódtár függőségei elsőbbséget élveznek.
Az illesztőprogram-kódtár függőségeinek teljes listájának lekéréséhez futtassa a következő parancsot egy olyan fürthöz csatolt jegyzetfüzetben, amely ugyanazzal a Spark-verzióval van konfigurálva (vagy a vizsgálandó illesztőprogrammal rendelkező fürtben):
%sh
ls /databricks/jars
Ha kódtárfüggőségeket határoz meg a JAR-ekhez, a Databricks azt javasolja, hogy a Sparkot és a Hadoopot függőségként provided
sorolja fel. A Mavenben adja hozzá a Sparkot és a Hadoopot a megadott függőségekként:
<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>
Adja sbt
hozzá a Sparkot és a Hadoopot a megadott függőségekként:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"
Tipp.
Adja meg a függőségek megfelelő Scala-verzióját a futó verzió alapján.
Következő lépések
Az Azure Databricks-feladatok létrehozásáról és futtatásáról további információt a munkafolyamatok ütemezése és vezénylése című témakörben talál.