Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Archiwum Java lub format pliku JAR jest oparty na popularnym formacie pliku ZIP i służy do agregowania wielu plików Java lub Scala w jeden. Za pomocą zadania JAR można zapewnić szybką i niezawodną instalację kodu Java lub Scala w zadaniach lakeflow. Ten artykuł zawiera przykład tworzenia pliku JAR i zadania, które uruchamia aplikację spakowana w pliku JAR. W tym przykładzie wykonasz następujące elementy:
- Utwórz projekt JAR definiujący przykładową aplikację.
- Dołącz przykładowe pliki do pliku JAR.
- Utwórz zadanie uruchamiania pliku JAR.
- Uruchom zadanie i wyświetl wyniki.
Przed rozpoczęciem
Aby ukończyć ten przykład, potrzebne są następujące elementy:
- Dla JAR-ów Java wymagany jest zestaw Java Development Kit (JDK).
- W przypadku zestawów JAR Scala zestaw JDK i sbt.
Krok 1. Tworzenie katalogu lokalnego na potrzeby przykładu
Utwórz katalog lokalny do przechowywania przykładowego kodu i wygenerowanych artefaktów, na przykład databricks_jar_test
.
Krok 2. Tworzenie pliku JAR
Wykonaj poniższe instrukcje, aby utworzyć plik JAR przy użyciu języka Java lub Języka Scala.
Tworzenie pliku JAR w języku Java
W folderze
databricks_jar_test
utwórz plik o nazwiePrintArgs.java
o następującej zawartości:import java.util.Arrays; public class PrintArgs { public static void main(String[] args) { System.out.println(Arrays.toString(args)); } }
Skompiluj
PrintArgs.java
plik, który tworzy plikPrintArgs.class
:javac PrintArgs.java
(Opcjonalnie) Uruchom skompilowany program:
java PrintArgs Hello World! # [Hello, World!]
W tym samym folderze, co pliki
PrintArgs.java
iPrintArgs.class
, utwórz folder o nazwieMETA-INF
.W folderze
META-INF
utwórz plik o nazwieMANIFEST.MF
o następującej zawartości. Pamiętaj, aby dodać nowy wiersz na końcu tego pliku:Main-Class: PrintArgs
W katalogu głównym
databricks_jar_test
folderu utwórz plik JAR o nazwiePrintArgs.jar
:jar cvfm PrintArgs.jar META-INF/MANIFEST.MF *.class
(Opcjonalnie) Aby go przetestować, w katalogu głównym
databricks_jar_test
folderu uruchom plik JAR:java -jar PrintArgs.jar Hello World! # [Hello, World!]
Uwaga
Jeśli zostanie wyświetlony błąd
no main manifest attribute, in PrintArgs.jar
, pamiętaj o dodaniu nowego wiersza na końcu plikuMANIFEST.MF
, a następnie spróbuj ponownie utworzyć plik JAR i uruchomić go ponownie.Załaduj
PrintArgs.jar
na wolumin. Zobacz Przesyłanie plików do woluminu katalogu Unity.
Utwórz plik JAR Scala
W folderze
databricks_jar_test
utwórz pusty plik o nazwiebuild.sbt
o następującej zawartości:ThisBuild / scalaVersion := "2.12.14" ThisBuild / organization := "com.example" lazy val PrintArgs = (project in file(".")) .settings( name := "PrintArgs" )
W folderze
databricks_jar_test
utwórz strukturęsrc/main/scala/example
folderów.W folderze
example
utwórz plik o nazwiePrintArgs.scala
o następującej zawartości:package example object PrintArgs { def main(args: Array[String]): Unit = { println(args.mkString(", ")) } }
Skompiluj program:
sbt compile
(Opcjonalnie) Uruchom skompilowany program:
sbt "run Hello World\!" # Hello, World!
W folderze
databricks_jar_test/project
utwórz plik o nazwieassembly.sbt
o następującej zawartości:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.0.0")
Z katalogu głównego folderu
databricks_jar_test
uruchom polecenieassembly
, które generuje plik JAR w folderzetarget
.sbt assembly
(Opcjonalnie) Aby go przetestować, w katalogu głównym
databricks_jar_test
folderu uruchom plik JAR:java -jar target/scala-2.12/PrintArgs-assembly-0.1.0-SNAPSHOT.jar Hello World! # Hello, World!
Załaduj
PrintArgs-assembly-0.1.0-SNAPSHOT.jar
na wolumin. Zobacz Przesyłanie plików do woluminu katalogu Unity.
Krok 3. Utwórz zadanie do uruchomienia pliku JAR
- Przejdź do strony docelowej usługi Azure Databricks i wykonaj jedną z następujących czynności:
- Na pasku bocznym kliknij
Jobs & Pipelines, a następnie kliknij Utwórz i Zadanie.
- Na pasku bocznym kliknij pozycję
Nowy i wybierz pozycję Zadanie z menu.
- Na pasku bocznym kliknij
- W oknie dialogowym zadania wyświetlonym na karcie Zadania zastąp ciąg Dodaj nazwę zadania... nazwą zadania, na przykład
JAR example
. - W polu Nazwa zadania wprowadź nazwę zadania, na przykład
java_jar_task
dla języka Java lubscala_jar_task
scala. - Dla Typewybierz opcję JAR.
- Dla Klasa główna w tym przykładzie, wprowadź
PrintArgs
dla Javy lubexample.PrintArgs
dla Scali. - W obszarze Clusterwybierz zgodny klaster. Zobacz Obsługa bibliotek Java i Scala.
- Dla Bibliotek zależnych kliknij + Dodaj.
- W oknie dialogowym Dodaj bibliotekę zależną, z wybranymi Woluminy, wprowadź lokalizację, w której przekazano plik JAR (
PrintArgs.jar
lubPrintArgs-assembly-0.1.0-SNAPSHOT.jar
) w poprzednim kroku do Ścieżka do pliku woluminów; lub filtruj, lub przeszukaj, aby zlokalizować plik JAR. Wybierz to. - Kliknij przycisk Dodaj.
- W przypadku parametrów , w tym przykładzie wprowadź
["Hello", "World!"]
. - Kliknij przycisk Dodaj.
Krok 4. Uruchamianie zadania i wyświetlanie szczegółów przebiegu zadania
Kliknij , aby uruchomić przepływ pracy. Aby wyświetlić szczegóły przebiegu, kliknij Widok przebiegu w oknie podręcznym Wyzwolony przebieg lub kliknij link w kolumnie Godzina rozpoczęcia dla przebiegu w widoku Uruchomienia zadania.
Po zakończeniu przebiegu wyniki zostaną wyświetlone w panelu Output, w tym argumenty przekazane do zadania.
Limity rozmiaru danych wyjściowych dla zadań JAR
Dane wyjściowe zadania, takie jak dziennik wyjściowy wysyłany do stdout, podlegają limitowi rozmiaru 20 MB. Jeśli łączny rozmiar danych wyjściowych jest większy, przebieg zostanie anulowany i oznaczony jako niepowodzenie.
Aby uniknąć napotkania tego limitu, możesz zapobiec zwracaniu elementu stdout ze sterownika do usługi Azure Databricks, ustawiając konfigurację platformy Spark spark.databricks.driver.disableScalaOutput
na wartość true
. Domyślnie wartość flagi to false
. Flaga steruje danymi wyjściowymi komórek dla zadań JAR języka Scala i notesów Scala. Jeśli flaga jest włączona, platforma Spark nie zwraca wyników wykonywania zadań do klienta. Flaga nie ma wpływu na dane zapisywane w plikach dziennika klastra. Usługa Databricks zaleca ustawienie tej flagi tylko dla klastrów zadaniowych dla zadań JAR, ponieważ wyłącza wyniki notatek.
Zalecenie: użyj udostępnionego elementu SparkContext
Ponieważ usługa Azure Databricks jest usługą zarządzaną, niektóre zmiany kodu mogą być konieczne, aby upewnić się, że zadania platformy Apache Spark działają poprawnie. Programy zadań JAR muszą używać udostępnionego interfejsu API SparkContext
, aby uzyskać SparkContext
. Ponieważ Azure Databricks inicjuje SparkContext
, programy, które wywołują new SparkContext()
, nie powiodą się. Aby uzyskać SparkContext
, użyj tylko udostępnionego SparkContext
utworzonego przez Azure Databricks:
val goodSparkContext = SparkContext.getOrCreate()
val goodSparkSession = SparkSession.builder().getOrCreate()
Istnieje również kilka metod, których należy unikać podczas korzystania z udostępnionego elementu SparkContext
.
- Nie wywołuj
SparkContext.stop()
. - Nie należy wywoływać
System.exit(0)
anisc.stop()
na końcuMain
programu. Może to spowodować niezdefiniowane zachowanie.
Zalecenie: Użyj bloków try-finally
do czyszczenia zadań
Rozważ plik JAR składający się z dwóch części:
-
jobBody()
który zawiera główną część zadania. -
jobCleanup()
które należy wykonać pojobBody()
, niezależnie od tego, czy funkcja zakończyła się sukcesem, czy zwróciła wyjątek.
Na przykład jobBody()
tworzy tabele i jobCleanup()
pomija te tabele.
Bezpiecznym sposobem zapewnienia, że wywoływana jest metoda czyszczenia, jest umieszczenie bloku try-finally
w kodzie.
try {
jobBody()
} finally {
jobCleanup()
}
Nie należy próbować czyścić przy użyciu sys.addShutdownHook(jobCleanup)
ani poniższego kodu:
val cleanupThread = new Thread { override def run = jobCleanup() }
Runtime.getRuntime.addShutdownHook(cleanupThread)
Ze względu na sposób, w jaki okres istnienia kontenerów platformy Spark jest zarządzany w usłudze Azure Databricks, haki zamykania nie są uruchamiane niezawodnie.
Konfigurowanie parametrów zadania JAR
Parametry są przekazywane do zadań JAR za pomocą tablicy ciągów znaków JSON.
spark_jar_task
Zobacz obiekt w treści żądania przekazany do operacji Tworzenie nowego zadania (POST /jobs/create
) w interfejsie API zadań. Aby uzyskać dostęp do tych parametrów, sprawdź tablicę String
przekazaną do twojej funkcji main
.
Zarządzanie zależnościami biblioteki
Sterownik platformy Spark ma pewne zależności biblioteki, których nie można zastąpić. Jeśli zadanie dodaje biblioteki powodujące konflikt, pierwszeństwo mają zależności biblioteki sterowników platformy Spark.
Aby uzyskać pełną listę zależności biblioteki sterowników, uruchom następujące polecenie w notesie dołączonym do klastra skonfigurowanego przy użyciu tej samej wersji platformy Spark (lub klastra ze sterownikiem, który chcesz zbadać):
%sh
ls /databricks/jars
Podczas definiowania zależności bibliotek dla JAR, usługa Databricks zaleca wymienienie Spark i Hadoop jako provided
zależności. W narzędziu Maven dodaj platformę Spark i platformę Hadoop zgodnie z podanymi zależnościami:
<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>
W sbt
dodaj Spark i Hadoop jako podane zależności.
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0" % "provided"
libraryDependencies += "org.apache.hadoop" %% "hadoop-core" % "1.2.1" % "provided"
Napiwek
Określ poprawną wersję języka Scala dla zależności na podstawie używanej wersji.
Następne kroki
Aby dowiedzieć się więcej na temat tworzenia i uruchamiania zadań, zobacz Zadania Lakeflow.