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

  1. databricks_jar_test A mappából hozzon létre egy fájlt PrintArgs.java a következő tartalommal:

    import java.util.Arrays;
    
    public class PrintArgs {
      public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
      }
    }
    
  2. PrintArgs.java A fájlt létrehozó fájl fordításaPrintArgs.class:

    javac PrintArgs.java
    
  3. (Nem kötelező) Futtassa a lefordított programot:

    java PrintArgs Hello World!
    
    # [Hello, World!]
    
  4. Ugyanabban a mappában, mint a PrintArgs.javaPrintArgs.class fájlok, hozzon létre egy mappát.META-INF

  5. META-INF A mappában hozzon létre egy fájlt MANIFEST.MF az alábbi tartalommal. Mindenképpen adjon hozzá egy új vonalat a fájl végén:

    Main-Class: PrintArgs
    
  6. A mappa gyökeréből databricks_jar_test hozzon létre egy JAR-t a következő néven PrintArgs.jar:

    jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
    
  7. (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.jarjelenik meg, adjon hozzá egy új vonalat a MANIFEST.MF fájl végéhez, majd próbálja meg újból létrehozni és futtatni a JAR-t.

  8. Feltöltés PrintArgs.jar kötetre. Lásd: Fájlok feltöltése Unity-katalóguskötetbe.

Scala JAR létrehozása

  1. databricks_jar_test A mappából hozzon létre egy üres fájlt build.sbt a következő tartalommal:

    ThisBuild / scalaVersion := "2.12.14"
    ThisBuild / organization := "com.example"
    
    lazy val PrintArgs = (project in file("."))
      .settings(
        name := "PrintArgs"
      )
    
  2. databricks_jar_test A mappából hozza létre a mappastruktúrátsrc/main/scala/example.

  3. example A mappában hozzon létre egy fájlt PrintArgs.scala a következő tartalommal:

    package example
    
    object PrintArgs {
      def main(args: Array[String]): Unit = {
        println(args.mkString(", "))
      }
    }
    
  4. A program fordítása:

    sbt compile
    
  5. (Nem kötelező) Futtassa a lefordított programot:

    sbt "run Hello World\!"
    
    # Hello, World!
    
  6. databricks_jar_test/project A mappában hozzon létre egy fájlt assembly.sbt a következő tartalommal:

    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
    
  7. A mappa gyökeréből databricks_jar_test futtassa a assembly parancsot, amely létrehoz egy JAR-t a target mappa alatt:

    sbt assembly
    
  8. (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!
    
  9. 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

  1. Nyissa meg az Azure Databricks kezdőlapját, és tegye az alábbiak egyikét:
    • Az oldalsávon kattintson Feladatok ikona Munkafolyamatok elemre, majd a Feladat létrehozása gombgombra.
    • Az oldalsávon kattintson az Új gombraÚj ikon, és válassza a Feladat lehetőséget a menüből.
  2. A Feladatok lapon megjelenő feladat párbeszédpanelen cserélje le a Feladat neve hozzáadása... elemet például JAR examplea feladat nevére.
  3. A Tevékenységnév mezőben adja meg a tevékenység nevét, például java_jar_task Java vagy scala_jar_task Scala esetén.
  4. A Típus beállításnál válassza a JAR lehetőséget.
  5. A főosztály esetében ebben a példában adja meg PrintArgs a Java vagy example.PrintArgs a Scala kifejezést.
  6. 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.
  7. Függő kódtárak esetén kattintson a + Hozzáadás gombra.
  8. 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.jarvagy PrintArgs-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.
  9. Kattintson a Hozzáadás gombra.
  10. A paraméterek esetében ebben a példában adja meg a következőt["Hello", "World!"]:
  11. 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 Futtatás gomb 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 SparkContextlekéréshez. Mivel az Azure Databricks inicializálja a meghívást, a SparkContextmeghívni new SparkContext() kívánt programok sikertelenek lesznek. A lekéréshez SparkContextcsak az Azure Databricks által létrehozott megosztott SparkContext elemeket használja:

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

A megosztott SparkContextmetó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én Main . 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égrehajtani jobBody(), 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 sbthozzá 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

További információ az Azure Databricks-feladatok létrehozásáról és futtatásáról: Azure Databricks-feladatok létrehozása és futtatása.