Oracle Cloud Infrastructure Data Flow-Anwendungen lokal entwickeln und in der Cloud bereitstellen

Oracle Cloud Infrastructure Data Flow ist ein vollständig verwalteter Apache Spark-Cloud-Service. Mit diesem Service können Sie Spark-Anwendungen in beliebiger Größe und mit minimalem Administrations- oder Einrichtungsaufwand ausführen. Data Flow ist ideal für die Planung zuverlässiger Batchverarbeitungsjobs mit langer Ausführungszeit geeignet.

Sie können Spark-Anwendungen entwickeln, ohne mit der Cloud verbunden zu sein. Sie können sie auf Ihrem Laptop schnell entwickeln, testen und iterieren. Wenn sie bereit sind, können Sie sie in Data Flow bereitstellen, ohne sie neu konfigurieren, Codeänderungen vornehmen oder Deployment-Profile anwenden zu müssen.

Geben Sie mit Spark 3.5.0 oder 3.2.1 mehrere Änderungen gegenüber früheren Versionen an:
  • Der größte Teil des Quellcodes und der Librarys zur Ausführung von Data Flow sind ausgeblendet. Sie müssen die Data Flow-SDK-Versionen nicht mehr abgleichen, und es gibt keine Drittanbieterabhängigkeitskonflikte mehr mit Data Flow.
  • Die SDKs sind mit Spark kompatibel. Daher müssen Sie keine in Konflikt stehenden Drittanbieterabhängigkeiten mehr verschieben, sodass Sie Ihre Anwendung für schnellere, weniger komplizierte, kleinere und flexiblere Builds von Ihren Librarys trennen können.
  • Die neue pom.xml-Vorlagendatei lädt eine nahezu identische Kopie von Data Flow auf Ihren lokalen Rechner herunter und erstellt sie. Sie können den Debugger auf Ihrem lokalen Rechner ausführen, um Probleme zu erkennen und zu beheben, bevor Sie die Anwendung in Data Flow ausführen. Sie können genau dieselbe Library-Version kompilieren und ausführen, die Data Flow ausführt. Oracle kann schnell entscheiden, ob Ihr Problem mit Data Flow oder Ihrem Anwendungscode zusammenhängt.

Bevor Sie beginnen

Bevor Sie mit der Entwicklung von Anwendungen beginnen, müssen Sie Folgendes einrichten und arbeiten:

  1. Eine Oracle Cloud-Anmeldung mit aktivierter API-Schlüsselfunktion. Laden Sie Ihren Benutzer unter Identität /Benutzer, und bestätigen Sie, dass Sie API-Schlüssel erstellen können.

    Registerkarte "Benutzerinformationen", bei der die Option "API-Schlüssel" auf "Ja" gesetzt ist.

  2. Ein API-Schlüssel, der für Ihre lokale Umgebung registriert und bereitgestellt wurde. Weitere Informationen finden Sie unter API-Schlüssel registrieren.
  3. Eine funktionierende lokale Installation von Apache Spark 2.4.4, 3.0.2, 3.2.1 oder 3.5.0. Sie können dies bestätigen, indem Sie spark-shell in der CLI ausführen.
  4. Apache Maven muss installiert sein. In den Anweisungen und Beispielen wird Maven verwendet, um die erforderlichen Abhängigkeiten herunterzuladen.
Sicherheit

Prüfen Sie vor dem Start die Sicherheit in Data Flow. Es verwendet ein Delegationstoken, mit dem es Cloud-Vorgänge in Ihrem Namen ausführen kann. Sämtliche Vorgänge, die Sie mit Ihrem Account in der Oracle Cloud Infrastructure-Konsole ausführen können, kann Ihr Spark-Job mit Data Flow ausführen. Wenn die Ausführung im lokalen Modus erfolgt, müssen Sie einen API-Schlüssel verwenden, mit dem Ihre lokale Anwendung authentifizierte Anforderungen an verschiedene Oracle Cloud Infrastructure-Services stellen kann.

Ablauf der Autorisierung des Delegationstokens und des API-Schlüssels in Data Flow und dem lokalen Job für den Objektspeicher und andere Services.

Verwenden Sie ganz einfach einen API-Schlüssel, der für denselben Benutzer wie bei der Anmeldung bei der Oracle Cloud Infrastructure-Konsole generiert wurde. Das heißt, dass Ihre Anwendungen dieselben Berechtigungen haben, unabhängig davon, ob Sie sie lokal oder in Data Flow ausführen.

1. Konzepte der lokalen Entwicklung

Unabhängig von Ihrer Entwicklungsumgebung müssen Sie bei der lokalen Entwicklung von Anwendungen drei Aspekte berücksichtigen:
  1. Passen Sie Ihre lokale Spark-Installation mit Oracle Cloud Infrastructure-Library-Dateien an, damit sie der Laufzeitumgebung von Data Flow ähnelt.
  2. Stellen Sie fest, wo Ihr Code ausgeführt wird.
  3. Konfigurieren Sie den Oracle Cloud Infrastructure-HDFS-Client entsprechend.
Spark-Umgebung anpassen

Damit Sie nahtlos zwischen Ihrem Rechner und Data Flow verschieben können, müssen Sie bestimmte Versionen von Spark, Scala und Python in Ihrem lokalen Setup verwenden. Fügen Sie die JAR-Datei für den Oracle Cloud Infrastructure-HDFS-Connector hinzu. Fügen Sie außerdem zehn Abhängigkeits-Librarys zu Ihrer Spark-Installation hinzu, die installiert werden, wenn Ihre Anwendung in Data Flow ausgeführt wird. In den nachfolgenden Schritten wird erläutert, wie Sie diese zehn Abhängigkeits-Librarys herunterladen und installieren.

Schritt 1: Lokale Dateiversionen
Spark, Scala und Python müssen in einem Set der folgenden Versionen vorhanden sein:
Lokale Dateiversionen
Spark-Version Scala-Version Python-Version
3,5 2,12 3,11
3.2.1 2.12.15 3.8
3.0.2 2.12.10 3.6.8
2.4.4 2.11.12 3.6.8
Weitere Informationen zu unterstützten Versionen finden Sie im Abschnitt Vorbereitungen für Data Flow in der Dokumentation zum Data Flow-Service.
Schritt 2: Abhängigkeitsdateien herunterladen
Mit diesen Befehlen können Sie die erforderlichen zusätzlichen JAR-Dateien herunterladen. Führen Sie sie in einem temporären Verzeichnis aus:
CONNECTOR=com.oracle.oci.sdk:oci-hdfs-connector:3.3.4.1.4.2
mkdir -p deps
touch emptyfile
mvn install:install-file -DgroupId=org.projectlombok -DartifactId=lombok -Dversion=1.18.26 -Dpackaging=jar -Dfile=emptyfile
mvn org.apache.maven.plugins:maven-dependency-plugin:2.7:get -Dartifact=$CONNECTOR -Ddest=deps
mvn org.apache.maven.plugins:maven-dependency-plugin:2.7:get -Dartifact=$CONNECTOR -Ddest=deps -Dtransitive=true -Dpackaging=pom
mvn org.apache.maven.plugins:maven-dependency-plugin:2.7:copy-dependencies -f deps/*.pom -DoutputDirectory=.
Schritt 3: Spark Home suchen
Führen Sie in einem Befehlszeilenfenster folgenden Befehl aus:
echo 'sc.getConf.get("spark.home")' | spark-shell
Ihr Spark-Home wird auf dem Bildschirm ausgegeben. Beispiel:
scala> sc.getConf.get("spark.home")
            res0: String = /usr/local/lib/python3.11/site-packages/pyspark
In diesem Beispiel lautet das Spark-Home, in das die Abhängigkeitsdateien kopiert werden sollen, wie folgt:
/usr/local/lib/python3.11/site-packages/pyspark/jars
Kopieren Sie die Abhängigkeitsdateien in Ihr Spark-Home.
Schritt 4: Fehlende Abhängigkeitsdateien hinzufügen
Nach Schritt 1 enthält das Verzeichnis deps viele JAR-Dateien, von denen die meisten bereits in der Spark-Installation verfügbar sind. Sie müssen nur eine Teilmenge dieser JAR-Dateien in die Spark-Umgebung kopieren:
bcpkix-jdk15to18-1.74.jar 
bcprov-jdk15to18-1.74.jar 
guava-32.0.1-jre.jar 
jersey-media-json-jackson-2.35.jar 
oci-hdfs-connector-3.3.4.1.4.2.jar 
oci-java-sdk-addons-apache-configurator-jersey-3.34.0.jar 
oci-java-sdk-common-*.jar 
oci-java-sdk-objectstorage-extensions-3.34.0.jar 
jersey-apache-connector-2.35.jar 
oci-java-sdk-addons-apache-configurator-jersey-3.34.0.jar 
jersey-media-json-jackson-2.35.jar 
oci-java-sdk-objectstorage-generated-3.34.0.jar 
oci-java-sdk-circuitbreaker-3.34.0.jar 
resilience4j-circuitbreaker-1.7.1.jar 
resilience4j-core-1.7.1.jar 
vavr-match-0.10.2.jar 
vavr-0.10.2.jar
Kopieren Sie sie aus dem Verzeichnis deps in das Unterverzeichnis jars, das Sie in Schritt 2 gefunden haben.
Schritt 5: Deployment der JAR-Datei testen
Um sicherzustellen, dass Sie die JAR-Dateien korrekt bereitgestellt haben, öffnen Sie eine Spark-Shell, und geben Sie den folgenden Befehl ein:
import com.oracle.bmc.hdfs.BmcFilesystem
Wenn dieser Befehl keinen Fehler verursacht, haben Sie die JAR-Dateien an der richtigen Stelle abgelegt:

JAR-Dateien korrekt bereitgestellt Screenshot, auf dem beim Ausführen des Importbefehls kein Fehler angezeigt wird.

Wenn ein Fehler auftritt, haben Sie die Dateien an der falschen Stelle abgelegt. In diesem Beispiel ist ein Fehler aufgetreten:

JAR-Dateien falsch bereitgestellt Screenshot, auf dem beim Importbefehl ein Fehler aufgetreten ist: object hdfs ist kein Mitglied des Pakets com.oracle.bmc

Erkennen, wo Sie gerade ausgeführt werden
Sie haben zwei Möglichkeiten zu entscheiden, ob die Ausführung in Data Flow erfolgt oder nicht.
  • Sie können den spark.master-Wert im SparkConf-Objekt verwenden, das bei der Ausführung in Data Flow auf k8s://https://kubernetes.default.svc:443 gesetzt ist.
  • Die Umgebungsvariable HOME ist auf /home/dataflow gesetzt, wenn die Anwendung in Data Flow ausgeführt wird.
Hinweis

In PySpark-Anwendungen ist ein neu erstelltes SparkConf-Objekt leer. Damit die richtigen Werte angezeigt werden, verwenden Sie die getConf-Methode für die Ausführung von SparkContext.

Startumgebungspark.master-Einstellung
Data Flow
spark.master: k8s://https://kubernetes.default.svc:443
$HOME: /home/dataflow
Lokaler Spark-Submit

spark.master: local[*]

$HOME: Variable
Eclipse

Nicht festgelegt

$HOME: Variable
Wichtig

Wenn Sie in Data Flow ausführen, ändern Sie den Wert von spark.master nicht. Andernfalls werden bei der Ausführung des Jobs nicht alle Ressourcen verwendet, die Sie durch Provisioning bereitgestellt haben.
Oracle Cloud Infrastructure-HDFS-Connector konfigurieren

Wenn Ihre Anwendung in Data Flow ausgeführt wird, wird der Oracle Cloud Infrastructure-HDFS-Connector automatisch konfiguriert. Bei einer lokalen Ausführung müssen Sie ihn selbst konfigurieren, indem Sie die Konfigurationseigenschaften für den HDFS-Connector festlegen.

Sie müssen zumindest Ihr SparkConf-Objekt aktualisieren, um Werte für fs.oci.client.auth.fingerprint, fs.oci.client.auth.pemfilepath, fs.oci.client.auth.tenantId, fs.oci.client.auth.userId und fs.oci.client.hostname festzulegen.

Wenn Ihr API-Schlüssel eine Passphrase aufweist, müssen Sie fs.oci.client.auth.passphrase festlegen.

Diese Variablen können nach der Erstellung der Session festgelegt werden. Verwenden Sie innerhalb Ihrer Programmierumgebung die jeweiligen SDKs, damit die API-Schlüsselkonfiguration ordnungsgemäß geladen wird.

Dieses Beispiel zeigt, wie der HDFS-Connector in Java konfiguriert wird. Ersetzen Sie die Pfad- oder Profilargumente in ConfigFileAuthenticationDetailsProvider entsprechend:
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
import com.oracle.bmc.ConfigFileReader;

//If your key is encrypted call setPassPhrase:
ConfigFileAuthenticationDetailsProvider authenticationDetailsProvider = new ConfigFileAuthenticationDetailsProvider(ConfigFileReader.DEFAULT_FILE_PATH, "<DEFAULT>"); 
configuration.put("fs.oci.client.auth.tenantId", authenticationDetailsProvider.getTenantId());
configuration.put("fs.oci.client.auth.userId", authenticationDetailsProvider.getUserId());
configuration.put("fs.oci.client.auth.fingerprint", authenticationDetailsProvider.getFingerprint());

String guessedPath = new File(configurationFilePath).getParent() + File.separator + "oci_api_key.pem";
configuration.put("fs.oci.client.auth.pemfilepath", guessedPath);

// Set the storage endpoint:
String region = authenticationDetailsProvider.getRegion().getRegionId();
String hostName = MessageFormat.format("https://objectstorage.{0}.oraclecloud.com", new Object[] { region });
configuration.put("fs.oci.client.hostname", hostName);
Dieses Beispiel zeigt, wie der HDFS-Connector in Python konfiguriert wird. Ersetzen Sie die Pfad- oder Profilargumente in oci.config.from_file entsprechend:
import os 
from pyspark  import SparkConf, SparkContext
from pyspark.sql  import SparkSession
# Check to see if we're in Data Flow or not.
if os.environ.get("HOME") == "/home/dataflow":
    spark_session = SparkSession.builder.appName("app").getOrCreate()
else:
    conf = SparkConf()
    oci_config = oci.config.from_file(oci.config.DEFAULT_LOCATION, "<DEFAULT>")
    conf.set("fs.oci.client.auth.tenantId", oci_config["tenancy"])
    conf.set("fs.oci.client.auth.userId", oci_config["user"])
    conf.set("fs.oci.client.auth.fingerprint", oci_config["fingerprint"])
    conf.set("fs.oci.client.auth.pemfilepath", oci_config["key_file"])
    conf.set(
        "fs.oci.client.hostname",
        "https://objectstorage.{0}.oraclecloud.com".format(oci_config["region"]),
    )

    spark_builder = SparkSession.builder.appName("app")
    spark_builder.config(conf=conf)
    spark_session = spark_builder.getOrCreate()

spark_context = spark_session.sparkContext

In SparkSQL wird die Konfiguration anders verwaltet. Diese Einstellungen werden mit dem --hiveconf-Switch übergeben. Um Spark-SQL-Abfragen auszuführen, verwenden Sie ein ähnliches Wrapper-Skript wie im Beispiel. Wenn Sie Ihr Skript in Data Flow ausführen, werden diese Einstellungen automatisch für Sie vorgenommen.

#!/bin/sh

CONFIG=$HOME/.oci/config
USER=$(egrep ' user' $CONFIG | cut -f2 -d=)
FINGERPRINT=$(egrep ' fingerprint' $CONFIG | cut -f2 -d=)
KEYFILE=$(egrep ' key_file' $CONFIG | cut -f2 -d=)
TENANCY=$(egrep ' tenancy' $CONFIG | cut -f2 -d=)
REGION=$(egrep ' region' $CONFIG | cut -f2 -d=)
REMOTEHOST="https://objectstorage.$REGION.oraclecloud.com"

spark-sql \
	--hiveconf fs.oci.client.auth.tenantId=$TENANCY \
	--hiveconf fs.oci.client.auth.userId=$USER \
	--hiveconf fs.oci.client.auth.fingerprint=$FINGERPRINT \
	--hiveconf fs.oci.client.auth.pemfilepath=$KEYFILE \
	--hiveconf fs.oci.client.hostname=$REMOTEHOST \
	-f script.sql

In den oben dargestellten Beispielen wird nur die Art und Weise geändert, wie Sie Ihren Spark-Kontext erstellen. Sie müssen keine weiteren Änderungen in Ihrer Spark-Anwendung vornehmen, das heißt, Sie können die anderen Aspekte Ihrer Spark-Anwendung wie üblich entwickeln. Wenn Sie die Spark-Anwendung in Data Flow bereitstellen, müssen Sie keinen Code und keine Konfiguration ändern.

2. "Fat JARs" für Java-Anwendungen erstellen

Bei Java- und Scala-Anwendungen müssen in der Regel mehr Abhängigkeiten in eine JAR-Datei aufgenommen werden, die als "Fat JAR" bezeichnet wird.

Wenn Sie Maven nutzen, können Sie hierfür das Shade-Plug-in verwenden. Die folgenden Beispiele stammen aus Maven-Dateien (pom.xml). Sie können sie als Ausgangspunkt für Ihr Projekt verwenden. Wenn Sie Ihre Anwendung erstellen, werden die Abhängigkeiten automatisch heruntergeladen und in Ihre Laufzeitumgebung eingefügt.

Hinweis

Wenn Sie Spark 3.5.0 oder 3.2.1 verwenden, gilt dieses Kapitel nicht. Befolgen Sie stattdessen den Anweisungen im Kapitel 2. Java-Abhängigkeiten für Apache Spark-Anwendungen in Data Flow verwalten.
POM.xml-Beispiel für Spark 3.0.2

Dieser Teil der pom.xml enthält die korrekten Versionen der Spark- und Oracle Cloud Infrastructure-Library für Data Flow (Spark 3.0.2). Er ist auf Java 8 ausgerichtet und schattiert gemeinsame in Konflikt stehende Klassendateien.

<properties>
            <oci-java-sdk-version>1.25.2</oci-java-sdk-version>
            </properties>
            
            <dependencies>
            <dependency>
            <groupId>com.oracle.oci.sdk</groupId>
            <artifactId>oci-hdfs-connector</artifactId>
            <version>3.2.1.3</version>
            <scope>provided</scope>
            </dependency>
            <dependency>
            <groupId>com.oracle.oci.sdk</groupId>
            <artifactId>oci-java-sdk-core</artifactId>
            <version>${oci-java-sdk-version}</version>
            </dependency>
            <dependency>
            <groupId>com.oracle.oci.sdk</groupId>
            <artifactId>oci-java-sdk-objectstorage</artifactId>
            <version>${oci-java-sdk-version}</version>
            </dependency>
            
            <!-- spark -->
            <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>3.0.2</version>
            <scope>provided</scope>
            </dependency>
            <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>3.0.2</version>
            <scope>provided</scope>
            </dependency>
            </dependencies>
            <build>
            <plugins>
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
            <source>1.8</source>
            <target>1.8</target>
            </configuration>
            </plugin>
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.0</version>
            </plugin>
            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
            <execution>
            <phase>package</phase>
            <goals>
            <goal>shade</goal>
            </goals>
            </execution>
            </executions>
            <configuration>
            <transformers>
            <transformer
            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>example.Example</mainClass>
            </transformer>
            </transformers>
            <filters>
            <filter>
            <artifact>*:*</artifact>
            <excludes>
            <exclude>META-INF/*.SF</exclude>
            <exclude>META-INF/*.DSA</exclude>
            <exclude>META-INF/*.RSA</exclude>
            </excludes>
            </filter>
            </filters>
            <relocations>
            <relocation>
            <pattern>com.oracle.bmc</pattern>
            <shadedPattern>shaded.com.oracle.bmc</shadedPattern>
            <includes>
            <include>com.oracle.bmc.**</include>
            </includes>
            <excludes>
            <exclude>com.oracle.bmc.hdfs.**</exclude>
            </excludes>
            </relocation>
            </relocations>
            <artifactSet>
            <excludes>
            <exclude>org.bouncycastle:bcpkix-jdk15on</exclude>
            <exclude>org.bouncycastle:bcprov-jdk15on</exclude>
            <!-- Including jsr305 in the shaded jar causes a SecurityException 
            due to signer mismatch for class "javax.annotation.Nonnull" -->
            <exclude>com.google.code.findbugs:jsr305</exclude>
            </excludes>
            </artifactSet>
            </configuration>
            </plugin>
            </plugins>
            </build>
POM.xml-Beispiel für Spark 2.4.4

Dieser Teil der pom.xml-Datei enthält die korrekten Versionen der Spark- und Oracle Cloud Infrastructure-Library für Data Flow ( Spark 2.4.4). Er ist auf Java 8 ausgerichtet und schattiert gemeinsame in Konflikt stehende Klassendateien.

<properties>
            <oci-java-sdk-version>1.15.4</oci-java-sdk-version>
</properties>
            
<dependencies>
      <dependency>
            <groupId>com.oracle.oci.sdk</groupId>
            <artifactId>oci-hdfs-connector</artifactId>
            <version>2.7.7.3</version>
            <scope>provided</scope>
      </dependency>
      <dependency>
            <groupId>com.oracle.oci.sdk</groupId>
            <artifactId>oci-java-sdk-core</artifactId>
            <version>${oci-java-sdk-version}</version>
      </dependency>
      <dependency>
            <groupId>com.oracle.oci.sdk</groupId>
            <artifactId>oci-java-sdk-objectstorage</artifactId>
            <version>${oci-java-sdk-version}</version>
      </dependency>
            
      <!-- spark -->
      <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_2.12</artifactId>
            <version>2.4.4</version>
            <scope>provided</scope>
      </dependency>
      <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.12</artifactId>
            <version>2.4.4</version>
            <scope>provided</scope>
      </dependency>
</dependencies>
<build>
      <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                <source>1.8</source>
                <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    </execution>
                </executions>
                <configuration>
                    <transformers>
                        <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>example.Example</mainClass>
                        </transformer>
                    </transformers>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                    <relocations>
                        <relocation>
                            <pattern>com.oracle.bmc</pattern>
                            <shadedPattern>shaded.com.oracle.bmc</shadedPattern>
                            <includes>
                                <include>com.oracle.bmc.**</include>
                            </includes>
                            <excludes>
                                <exclude>com.oracle.bmc.hdfs.**</exclude>
                            </excludes>
                        </relocation>
                    </relocations>
                    <artifactSet>
                        <excludes>
                            <exclude>org.bouncycastle:bcpkix-jdk15on</exclude>
                            <exclude>org.bouncycastle:bcprov-jdk15on</exclude>
                            <!-- Including jsr305 in the shaded jar causes a SecurityException 
                            due to signer mismatch for class "javax.annotation.Nonnull" -->
                            <exclude>com.google.code.findbugs:jsr305</exclude>
                        </excludes>
                    </artifactSet>
                </configuration>
            </plugin>
      </plugins>
</build>

3. Anwendung lokal testen

Vor dem Deployment Ihrer Anwendung können Sie sie lokal testen, um sicherzustellen, dass sie funktioniert. Sie können drei Methoden verwenden. Wählen Sie die Methode aus, die für Sie am besten geeignet ist. In diesen Beispielen wird davon ausgegangen, dass der Name für Ihr Anwendungsartefakt application.jar (für Java) oder application.py (für Python) lautet.

Mit Spark 3.5.0 und 3.2.1 gibt es einige Verbesserungen gegenüber früheren Versionen:
  • Data Flow blendet die meisten Quellcodes und Librarys aus, die für die Ausführung verwendet werden. Daher müssen Data Flow-SDK-Versionen nicht mehr übereinstimmen, und es dürfen keine Konflikte zwischen Drittanbieterabhängigkeiten und Data Flow auftreten.
  • Spark wurde upgegradet, sodass die OCI-SDKs jetzt damit kompatibel sind. Dies bedeutet, dass widersprüchliche Drittanbieterabhängigkeiten nicht verschoben werden müssen, sodass die Anwendungs- und Bibliotheksbibliotheken für schnellere, weniger komplizierte, kleinere und flexiblere Builds getrennt werden können.
  • Die neue Vorlage pom.xml-Datei lädt herunter und erstellt eine fast identische Kopie von Data Flow auf dem lokalen Rechner eines Entwicklers. Das heißt:
    • Entwickler können den Schritt-Debugger auf ihrem lokalen Rechner ausführen, um Probleme vor der Ausführung in Data Flow schnell zu erkennen und zu lösen.
    • Entwickler können genau dieselbe Library-Version kompilieren und ausführen, die Data Flow ausführt. So kann das Data Flow-Team schnell entscheiden, ob ein Problem mit Data Flow oder dem Anwendungscode vorliegt.

Methode 1: In Ihrer IDE ausführen

Wenn Sie in einer IDE wie Eclipse entwickelt haben, müssen Sie nur auf Ausführen klicken und die entsprechende Hauptklasse auswählen. Klicken Sie in Eclipse auf die Schaltfläche "Run".

Bei der Ausführung ist es normal, dass Spark Warnmeldungen in der Konsole generiert, die Sie darüber informieren, dass Spark aufgerufen wird. Spark-Konsole mit Fehlermeldungen, die beim Aufrufen von Spark angezeigt werden, wenn Sie auf "Ausführen" klicken.

Methode 2: PySpark über die Befehlszeile ausführen

Führen Sie in einem Befehlsfenster folgenden Befehl aus:
python3 application.py
Eine ähnliche Ausgabe wie im folgenden Beispiel wird angezeigt:
$ python3 example.py
Warning: Ignoring non-Spark config property: fs.oci.client.hostname
Warning: Ignoring non-Spark config property: fs.oci.client.auth.fingerprint
Warning: Ignoring non-Spark config property: fs.oci.client.auth.tenantId
Warning: Ignoring non-Spark config property: fs.oci.client.auth.pemfilepath
Warning: Ignoring non-Spark config property: fs.oci.client.auth.userId
20/08/01 06:52:00 WARN Utils: Your hostname resolves to a loopback address: 127.0.0.1; using 192.168.1.41 instead (on interface en0)
20/08/01 06:52:00 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
20/08/01 06:52:01 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Warnungen zu Nicht-Spark-Konfigurationseigenschaften sind normal, wenn Sie den Oracle Cloud Infrastructure-HDFS-Treiber basierend auf Ihrem Konfigurationsprofil konfigurieren.

Methode 3: Spark-Submit verwenden

Das Utility spark-submit ist in der Spark-Distribution enthalten. Verwenden Sie diese Methode in bestimmten Situationen, beispielsweise wenn für eine PySpark-Anwendung zusätzliche JAR-Dateien erforderlich sind.

Verwenden Sie den folgenden Beispielbefehl, um eine Java-Anwendung mit spark-submit auszuführen:
spark-submit --class example.Example example.jar
Tipp

Da Sie den Namen der Hauptklasse in Data Flow angeben müssen, können Sie mit diesem Code ganz einfach sicherstellen, dass Sie den richtigen Klassennamen verwenden. Beachten Sie, dass bei Klassennamen die Groß-/Kleinschreibung berücksichtigt werden muss.
In diesem Beispiel verwenden Sie spark-submit, um eine PySpark-Anwendung auszuführen, für die Oracle JDBC-JAR-Dateien erforderlich sind:
spark-submit \
	--jars java/oraclepki-18.3.jar,java/ojdbc8-18.3.jar,java/osdt_cert-18.3.jar,java/ucp-18.3.jar,java/osdt_core-18.3.jar \
	example.py

4. Anwendung bereitstellen

Nach der Entwicklung Ihrer Anwendung können Sie sie in Data Flow ausführen.
  1. Kopieren Sie das Anwendungsartefakt (jar-Datei, Python-Skript oder SQL-Skript) in Oracle Cloud Infrastructure Object Storage.
  2. Wenn Ihre Java-Anwendung Abhängigkeiten aufweist, die von Data Flow nicht bereitgestellt werden, kopieren Sie die Assembly-jar-Datei.
  3. Erstellen Sie eine Datenflussanwendung, die dieses Artefakt in Oracle Cloud Infrastructure Object Storage referenziert.

Nach Schritt 3 können Sie die Anwendung beliebig oft ausführen. Weitere Informationen finden Sie im Tutorial Erste Schritte mit Oracle Cloud Infrastructure Data Flow, in dem Sie Schritt für Schritt durch diesen Prozess geführt werden.

Wie geht es weiter?

Jetzt wissen Sie, wie Sie Ihre Anwendungen lokal entwickeln und in Data Flow bereitstellen können.