Erste Schritte mit Oracle Cloud Infrastructure Data Flow

Dieses Tutorial bietet Ihnen eine Einführung in Oracle Cloud Infrastructure Data Flow. Dabei handelt es sich um einen Service, mit dem Sie jede Apache Spark-Anwendung in beliebigem Umfang ohne bereitzustellende oder zu verwaltende Infrastruktur ausführen können.

Wenn Sie Spark bereits verwendet haben, werden Sie mehr aus diesem Tutorial herausholen. Allerdings sind keine Vorkenntnisse zu Spark erforderlich. Alle Spark-Anwendungen und -Daten wurden für Sie bereitgestellt. In diesem Tutorial wird gezeigt, wie Spark-Anwendungen mit Data Flow ganz einfach, wiederholt und sicher ausgeführt und problemlos im gesamten Unternehmen gemeinsam genutzt werden können.

In diesem Tutorial werden folgende Themen behandelt:
  1. Wie Sie Java für die Ausführung von ETL in einer Data Flow Anwendung verwenden.
  2. Wie Sie SparkSQL in einer SQL-Anwendung verwenden.
  3. Wie Sie eine Python-Anwendung erstellen und ausführen, um eine einfache Aufgabe für maschinelles Lernen auszuführen.

Sie können dieses Tutorial auch mit spark-submit über CLI oder mit spark-submit und Java-SDK ausführen.

Vorteile von Data Flow
Im Folgenden werden die Vorteile einer Verwendung von Data Flow gegenüber der Nutzung Ihres eigenen Spark-Clusters oder anderer Spark-Services erläutert.
  • Der Service ist serverlos, d.h. Sie benötigen für das Provisioning, Patching, Upgrade oder die Wartung von Spark-Cluster keine Experten. Sie können sich also ausschließlich auf Ihren Spark-Code konzentrieren.
  • Die Vorgänge und Optimierungen sind unkompliziert. Der Zugriff auf die Spark-UI ist ein Select-away und unterliegt den IAM-Autorisierungs-Policys. Wenn ein Benutzer meldet, dass ein Job zu viel Zeit in Anspruch nimmt, kann jede Person mit Zugriffsberechtigung für die Ausführung die Spark-UI öffnen und der Ursache auf den Grund gehen. Der Zugriff auf den Spark-Historienserver ist ebenso einfach für bereits ausgeführte Jobs.
  • Data Flow eignet sich hervorragend für die Batchverarbeitung. Die Anwendungsausgabe wird automatisch erfasst und über REST-APIs zur Verfügung gestellt. Müssen Sie einen vierstündigen Spark-SQL-Job ausführen und die Ergebnisse in das Pipeline-Managementsystem laden? In Data Flow ist dies mit nur zwei REST-APIs möglich.
  • Data Flow bietet konsolidierte Steuerung. Mit Data Flow erhalten Sie eine konsolidierte Ansicht aller Spark-Anwendungen mit Informationen darüber, wer sie ausführt und wie viel Speicherplatz sie in Anspruch nehmen. Möchten Sie wissen, welche Anwendungen die meisten Daten schreiben und von wem sie ausgeführt werden? Sortieren Sie einfach nach der Spalte "Geschriebene Daten". Nimmt die Ausführung eines Jobs zu viel Zeit in Anspruch? Jeder Benutzer mit den entsprechenden IAM-Berechtigungen kann den Job anzeigen und stoppen.
Beispiel für eine Liste mit Ausführungen. Hier sehen Sie eine Tabelle mit neun Spalten und drei Zeilen. Die Spalten sind: Name, Sprache, Status, Eigentümer, Erstellt, Dauer, oCPU gesamt, Gelesene Daten, Geschriebene Daten. Alle Zellen in allen drei Zeilen sind aufgefüllt. Die Namen lauten "Tutorial Example 1", Tutorial Example 2" und "Tutorial Example 3". Die jeweiligen Sprachen sind Java, Python bzw. SQL. Alle drei weisen den Status "Erfolgreich" auf.

Bevor Sie beginnen

Um dieses Tutorial erfolgreich ausführen zu können, müssen Sie Ihren Mandanten eingerichtet haben und auf Data Flow zugreifen können.

Mandanten einrichten

Vor der Ausführung von Data Flow müssen Sie Berechtigungen erteilen, die ein effektives Logerfassungs- und Ausführungsmanagement ermöglichen. Weitere Informationen finden Sie im Abschnitt Administration einrichten der Dokumentation zum Data Flow-Service, und befolgen Sie die dort angegebenen Anweisungen.

Auf Data Flow zugreifen
  1. Wählen Sie in der Konsole das Navigationsmenü aus, um die Liste der verfügbaren Services anzuzeigen.
  2. Wählen Sie Analysen und KI aus.
  3. Wählen Sie unter "Big Data" die Option Data Flow aus.
  4. Wählen Sie Anwendungen aus.

1. ETL mit Java

Eine Übung zum Erstellen einer Java-Anwendung in Data Flow

Die hier beschriebenen Schritte beziehen sich auf die Verwendung der Konsolen-UI. Sie können diese Übung mit spark-submit über CLI oder spark-submit mit Java-SDK abschließen.

Überblick

Der häufigste erste Schritt in Datenverarbeitungsanwendungen besteht darin, Daten aus einer Quelle in ein Format umzuwandeln, das für das Reporting und andere Arten der Analyse geeignet ist. In einer Datenbank werden eine Flat File in die Datenbank geladen und Indizes erstellt. In Spark besteht der erste Schritt darin, Daten zu reinigen und aus einem Textformat in das Parquet-Format zu konvertieren. Parquet ist ein optimiertes Binärformat, das effiziente Lesezugriffe unterstützt und sich somit ideal für Reporting und Analysen eignet. In dieser Übung konvertieren Sie die Quelldaten in das Parquet-Format und führen dann einige interessante Vorgänge damit durch. Das Dataset ist das Dataset Berlin Airbnb Data, das von der Kaggle-Website heruntergeladen wurde, gemäß den Bedingungen der Lizenz Creative Commons CC0 1.0 Universal (CC0 1.0) "Public Domain Dedication".

Hier ist ein Feld mit der Bezeichnung "CSV Data, Easy to Read, Slow" (CSV-Daten, einfach zu lesen, langsam) dargestellt. Ein Pfeil verläuft zu einem Feld auf der rechten Seite mit der Bezeichnung "Parquet, Harder to Read, Fast" (Parquet, schwieriger zu lesen, schnell). Von dort verlaufen zwei Pfeile zu einem Feld mit der Bezeichnung "SQL Queries" (SQL-Abfragen) und zu einem Feld mit der Bezeichnung "Machine Learning" (Maschinelles Lernen).

Die Daten werden im CSV-Format bereitgestellt, und der erste Schritt besteht darin, diese Daten in das Parquet-Format zu konvertieren und zur weiteren Verarbeitung im Objektspeicher zu speichern. Eine Spark-Anwendung mit dem Namen oow-lab-2019-java-etl-1.0-SNAPSHOT.jar wird zur Konvertierung bereitgestellt. Das Ziel ist es, eine Datenflussanwendung zu erstellen, die diese Spark-Anwendung ausgeführt wird, und sie mit den richtigen Parametern auszuführen. Da Sie sich zum ersten Mal mit der Arbeit vertraut machen, werden Sie in dieser Übung Schritt für Schritt geführt, und es werden die erforderlichen Parameter bereitgestellt. Später müssen Sie die Parameter selbst angeben. Daher müssen Sie wissen, was Sie eingeben und warum.

Java-Anwendung erstellen

Erstellen Sie eine Data Flow-Java-Anwendung über die Konsole oder mit Spark-Submit über die Befehlszeile oder mit SDK.

Java-Anwendung in der Konsole erstellen

Erstellen Sie eine Java-Anwendung in Data Flow in der Konsole.

Datenflussanwendung erstellen.

  1. Navigieren Sie in der Konsole zum Data Flow-Service, indem Sie das Hamburger-Menü oben links einblenden und zum Ende scrollen.
  2. Markieren Sie Datenfluss, und wählen Sie "Anwendungen" aus. Wählen Sie ein Compartment aus, in dem die Data Flow-Anwendungen erstellt werden sollen. Wählen Sie schließlich Anwendung erstellen aus. SelectCreate Anwendung
  3. Wählen Sie Java-Anwendung aus, und Geben Sie einen Namen für das Programm ein, beispielsweise Tutorial Example 1. Die Seite "Anwendung" wird mit dem Pullout-Menü "Anwendung erstellen" auf der rechten Seite angezeigt. Oben befindet sich der Abschnitt "Allgemeine Informationen" mit einem Textfeld namens "Name" und dem Textfeld "Beschreibung". Dann ist ein Abschnitt namens Ressourcenkonfiguration, in dem zwei Textfelder sichtbar sind. Unten befinden sich drei Schaltflächen: "Erstellen", "Als Stack speichern" und "Abbrechen".
  4. Scrollen Sie nach unten zu Ressourcenkonfiguration. Behalten Sie für alle diese Werte die jeweiligen Standardwerte bei. Die Seite "Anwendung", die mit dem Pullout-Menü "Anwendung erstellen" auf der rechten Seite angezeigt wird. Der Abschnitt "Ressourcenkonfiguration" wird angezeigt. Oben befindet sich eine Dropdown-Liste mit der Bezeichnung "Spark-Version". "Spark 3.0.2" ist ausgewählt, "Spark 2.4.4" und "Spark 3.2.1" sind jedoch auch aufgeführt. Darunter, aber teilweise ausgeblendet durch die Liste der Spark-Versionen, befindet sich ein Textfeld mit dem Namen "Pool auswählen". Anschließend wird ein Textfeld mit dem Namen "Treiberform" angezeigt. VM.Standard.E4. Flexfeld ist ausgewählt. Unterhalb und teilweise zugeschnitten ist ein Abschnitt zum Anpassen der Anzahl der OCPUs. Unten befinden sich drei Schaltflächen: "Erstellen", "Als Stack speichern" und "Abbrechen".
  5. Scrollen Sie nach unten zur Anwendungskonfiguration. Konfigurieren Sie die Anwendung wie folgt:
    1. URL der Datei: Dies ist der Speicherort der JAR-Datei in Object Storage. Der Speicherort für diese Anwendung lautet:
      oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow-lab-2019-java-etl-1.0-SNAPSHOT.jar
    2. Name der Hauptklasse: Java-Anwendungen benötigen einen Namen der Hauptklasse, der von der Anwendung abhängig ist. Geben Sie für diese Übung Folgendes ein:
      convert.Convert
    3. Argumente: Die Spark-Anwendung erwartet zwei Befehlszeilenparameter, einen für die Eingabe und einen für die Ausgabe. Geben Sie im Feld Argumente Folgendes ein:
      ${input} ${output}
      Sie werden zur Eingabe von Standardwerten aufgefordert, und Sie sollten diese jetzt eingeben.
    Die Seite "Anwendung", die mit dem Pullout-Menü "Anwendung erstellen" über dem rechten Abschnitt side.The "Anwendungskonfiguration" angezeigt wird, wird angezeigt. Oben befindet sich der Abschnitt "Datei auswählen". Ein Kontrollkästchen mit der Bezeichnung Geben Sie die Datei-URL manuell ein. Als Nächstes wird ein Textfeld mit der Bezeichnung "URL der Datei" angezeigt. Es ist mit dem Pfad zur JAR-Datei aufgefüllt. Darunter befindet sich ein Textfeld mit der Bezeichnung "Hauptklassenname". Es ist mit "convert.Convert" aufgefüllt. Darunter befindet sich ein Textfeld mit der Bezeichnung "Argumente". Es ist mit "${input} ${output}" aufgefüllt.
  6. Die Eingabe- und Ausgabeargumente lauten:
    1. Eingabe:
      oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/kaggle_berlin_airbnb_listings_summary.csv
    2. Ausgabe:
      oci://<yourbucket>@<namespace>/optimized_listings

    Prüfen Sie die Anwendungskonfiguration, um zu bestätigen, dass sie etwa wie folgt aussieht: Die Seite "Anwendung", die mit dem Pullout-Menü "Anwendung erstellen" auf der rechten Seite angezeigt wird. Der Abschnitt "Anwendungskonfiguration" wird angezeigt. Hier ist ein Textfeld mit der Bezeichnung "Argumente" dargestellt. Es ist mit "${input} ${output}" aufgefüllt. Darunter befinden sich Textfelder für Parameter. Auf der linken Seite befinden sich zwei ausgegraute Textfelder, die mit "input" bzw. "output" aufgefüllt sind. Neben jedem dieser Textfelder befindet sich ein Textfeld mit der Bezeichnung "Standardwert", das mit dem jeweiligen Verzeichnis aufgefüllt ist. Im Folgenden finden Sie einen Abschnitt mit dem Namen "Archiv-URI".

    Hinweis

    Sie müssen den Ausgabepfad anpassen, damit er auf einen Bucket im Mandanten verweist.
  7. Wählen Sie anschließend Erstellen aus. Nachdem die Anwendung erstellt wurde, wird sie in der Anwendungsliste angezeigt. Die Seite "Anwendungen". In der Liste der Anwendungen wird eine Anwendung aufgeführt. Sie besteht aus sieben Spalten: Name, Sprache, Spark-Version, Anwendungstyp, Eigentümer, Erstellt und Aktualisiert. Unter "Name" steht "Tutorial Example 1". Unter "Sprache" wurde "Java" festgelegt. Spark-Version ist auf 3.2.1 gesetzt. Der Anwendungstyp ist auf "Batch" gesetzt. Die anderen Felder werden nach dem Ersteller des jeweiligen Antrags, dem Erstellungsdatum und dem Zeitpunkt der letzten Aktualisierung (in diesem Fall identisch mit dem Erstellungsdatum und -zeit) aufgefüllt.

Herzlichen Glückwunsch. Sie haben Ihre erste Data Flow-Anwendung erstellt. Jetzt können Sie sie ausführen.

Java-Anwendung mit Spark-Submit und CLI erstellen

Erstellen Sie eine Java-Anwendung mit spark-submit und CLI.

  1. Richten Sie Ihren Mandanten ein.
  2. Wenn Sie keinen Bucket in Object Storage haben, in dem Sie die Eingabe und die Ergebnisse speichern können, müssen Sie einen Bucket erstellen und eine geeignete Ordnerstruktur erstellen. In diesem Beispiel lautet die Ordnerstruktur /output/tutorial1.
  3. Führen Sie diesen Code aus:
    oci --profile <profile-name> --auth security_token data-flow run submit \
    --compartment-id <compartment-id> \
    --display-name Tutorial_1_ETL_Java \
    --execute '
        --class convert.Convert 
        --files oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/kaggle_berlin_airbnb_listings_summary.csv 
        oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow-lab-2019-java-etl-1.0-SNAPSHOT.jar \
        kaggle_berlin_airbnb_listings_summary.csv oci://<bucket-name>@<namespace-name>/output/tutorial1'
    Wenn Sie dieses Tutorial zuvor ausgeführt haben, löschen Sie den Inhalt des Ausgabeverzeichnisses oci://<bucket-name>@<namespace-name>/output/tutorial1, um zu verhindern, dass das Tutorial nicht erfolgreich verläuft.
    Hinweis

    Um die Compartment-ID zu suchen, wählen Sie im Navigationsmenü die Option Identität aus, und wählen Sie Compartments aus. Die für Sie verfügbaren Compartments, einschließlich der jeweiligen OCID, werden aufgelistet.
Java-Anwendung mit Spark-Submit und SDK erstellen

Schließen Sie die Übung ab, um eine Java-Anwendung in Data Flow mit Funkenübermittlung und Java-SDK zu erstellen.

Mit diesen Dateien können Sie diese Übung ausführen. Sie sind in den folgenden öffentlichen Object Storage-URIs verfügbar:

  • Eingabedateien im CSV-Format:
    oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/kaggle_berlin_airbnb_listings_summary.csv
  • JAR-Datei:
    oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow-lab-2019-java-etl-1.0-SNAPSHOT.jar
  1. Erstellen Sie einen Bucket in Object Storage, in dem Sie die Eingabe und Ergebnisse speichern können.
  2. Führen Sie diesen Code aus:
    public class Tutorial1 {
     
      String compartmentId = "<your-compartment_id>"; // Might need to change comapartment id
     
      public static void main(String[] ars) throws IOException {
        System.out.println("ETL with JAVA Tutorial");
        new Tutorial1().crateRun();
      }
     
      public void crateRun() throws IOException {
     
        // Authentication Using BOAT config from ~/.oci/config file
        final ConfigFileReader.ConfigFile configFile = ConfigFileReader.parseDefault();
     
        final AuthenticationDetailsProvider provider =
            new ConfigFileAuthenticationDetailsProvider(configFile);
     
        // Creating a Data Flow Client
        DataFlowClient client = new DataFlowClient(provider);
        client.setRegion(Region.US_PHOENIX_1);
        client.setEndpoint("http://<IP_address>:443");   // Might need to change endpoint
     
        // creation of execute String
        String executeString = "--class convert.Convert "
            + "--files oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/kaggle_berlin_airbnb_listings_summary.csv "
            + "oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow-lab-2019-java-etl-1.0-SNAPSHOT.jar "
            + "kaggle_berlin_airbnb_listings_summary.csv oci://<bucket_name>@<tenancy_name>/output/tutorial1";
     
        // Create Run details and create run.
        CreateRunDetails runDetails = CreateRunDetails.builder()
            .compartmentId(compartmentId).displayName("Tutorial_1_ETL_with_JAVA").execute(executeString)
            .build();
     
        CreateRunRequest runRequest = CreateRunRequest.builder().createRunDetails(runDetails).build();
        CreateRunResponse response = client.createRun(runRequest);
        GetRunRequest grq = GetRunRequest.builder().opcRequestId(response.getOpcRequestId()).runId(response.getRun().getId()).build();
        GetRunResponse gr = client.getRun(grq);
     
        System.out.println("Run Created!");
     
      }
    }
Datenflussanwendung ausführen

Nachdem die Java-Anwendung erstellt wurde, kann sie nun ausgeführt werden.

  1. Wenn Sie die Schritte genau ausgeführt haben, müssen Sie nur die Anwendung in der Liste markieren, das Menü "Aktionen" auswählen und Ausführen auswählen.
  2. Sie haben die Möglichkeit, Parameter vor dem Ausführen der Anwendung anzupassen. Im vorliegenden Fall haben Sie die genauen Werte bereits eingegeben. Sie können die Ausführung dann starten, indem Sie auf Ausführen klicken. Die Pullout-Seite "Java-Anwendung ausführen", die die rechte Seite der Seite "Anwendungen" abdeckt. Oben befindet sich eine Dropdown-Liste mit der Bezeichnung "Treiberausprägung". "VM.Standard2.1 (15 GB, 1 OCPU)" ist ausgewählt. Darunter befindet sich eine Dropdown-Liste mit der Bezeichnung "Executor-Ausprägung". "VM.Standard2.1 (15GB, 1 OCPU)" ist ausgewählt. Darunter befindet sich ein Textfeld mit der Bezeichnung "Anzahl Executors" mit dem Wert 1. Darunter befindet sich ein Textfeld mit der Bezeichnung "Argumente". Es ist ausgegraut und enthält "${input} ${output}". Darunter befinden sich zwei Textfelder nebeneinander für Parameter. Das erste Textfeld hat die Bezeichnung "Name" und ist ausgegraut, enthält jedoch den Text "Eingabe". Das andere Textfeld hat die Bezeichnung "Standardwert" und enthält das Eingabeverzeichnis, kann jedoch bearbeitet werden. Rechts wird eine Bildlaufleiste angezeigt, die ganz nach oben geschoben ist. Unten im Fenster befinden sich die Schaltflächen "Ausführen" und "Abbrechen". Als Nächstes wird auf "Ausführen" geklickt.
  3. Während die Anwendung ausgeführt wird, können Sie optional die Spark-UI  laden, um den Fortschritt zu überwachen. Wählen Sie im Menü "Aktionen" für die betreffende Ausführung Spark-UI aus. Die Seite "Anwendungen", in der "Tutorial Example 1" als einzige Anwendung in der Liste aufgeführt ist. Das Dreipunktmenü am Ende der Zeile in der Liste wurde angeklickt und zeigt die Optionen "Details anzeigen", "Bearbeiten", "Ausführen", "Tags hinzufügen", "Tags anzeigen" und "Löschen" an. Als Nächstes wird auf die Spark-UI geklickt.

  4. Sie werden automatisch zur Apache Spark-UI umgeleitet. Dies ist nützlich für das Debugging und die Performanceoptimierung.Die Spark-UI enthält eine Grafik, auf der angezeigt wird, wann bestimmte Executors hinzugefügt oder entfernt wurden. Außerdem werden Jobs mit ihrer Ausführungszeit angezeigt sowie mit Informationen, ob sie erfolgreich oder nicht erfolgreich waren. Sie sind farbcodiert. Darunter befindet sich eine Tabelle mit sechs Spalten, in der aktive Jobs aufgeführt werden. Die Spalten sind: Job-ID, Beschreibung, Weitergeleitet, Dauer, Phasen: Erfolgreich/Gesamt und Aufgaben (für alle Phasen): Erfolgreich/Gesamt.
  5. Nach etwa einer Minute wird bei der Ausführung der erfolgreiche Abschluss mit dem Status Succeeded angezeigt: Die Seite "Ausführungen", auf der zwei Ausführungen angezeigt werden: "Tutorial Example 1" und "Tutorial Example 2". Die Tabelle der Ausführungen enthält neun Spalten. Diese Spalten sind: Name, Sprache, Status, Eigentümer, Erstellt, Dauer, oCPU gesamt, Gelesene Daten und Geschriebene Daten. Der Status für "Tutorial Example 1" lautet "Erfolgreich".

  6. Führen Sie einen Drilldown in die Ausführung durch, um weitere Details anzuzeigen, und scrollen Sie nach unten, um eine Liste der Logs anzuzeigen. Unten auf der Seite "Ausführungsdetails" befindet sich ein Abschnitt mit der Bezeichnung "Logs". Hier ist eine Tabelle mit fünf Spalten dargestellt. Diese enthält zwei Logdateien. Die Spalten sind: Name, Dateigröße, Quelle, Typ und Erstellt. Die Dateien sind stdout.log und stderr.log. Im linken Menü links neben dem Abschnitt "Logs" befindet sich der Abschnitt "Ressourcen". Dieser enthält "Logs" (aufgrund der Auswahl markiert) und "Zugehörige Ausführungen".

  7. Wenn Sie die Datei spark_application_stdout.log.gz auswählen, wird die Logausgabe Conversion was successful angezeigt: Hier ist eine leere Seite mit etwas Text ganz oben dargestellt. Der Text lautet "Conversion was successful".

  8. Sie können auch zum Object Storage-Ausgabe-Bucket navigieren, um zu bestätigen, dass neue Dateien erstellt wurden. Der Abschnitt "Objekte" wird angezeigt. Dieser enthält drei Schaltflächen: "Objekte hochladen", "Wiederherstellen" und "Löschen". Nur die erste Schaltfläche ist aktiv. Darunter befindet sich eine Tabelle mit vier Spalten: Name, Größe, Status und Erstellt. In dieser Tabelle sind die verfügbaren Objekte aufgeführt.

    Diese neuen Dateien werden von späteren Anwendungen verwendet. Stellen Sie sicher, dass sie in Ihrem Bucket angezeigt werden, bevor Sie mit den nächsten Übungen fortfahren.

2. SparkSQL leicht gemacht

In dieser Übung führen Sie ein SQL-Skript aus, um ein einfaches Profiling eines Datasets durchzuführen.

In dieser Übung wird die in 1. ETL mit Java generierte Ausgabe verwendet. Sie müssen den Vorgang erfolgreich abgeschlossen haben, bevor Sie ihn versuchen können.

Die hier beschriebenen Schritte beziehen sich auf die Verwendung der Konsolen-UI. Sie können diese Übung mit spark-submit über CLI oder spark-submit mit Java-SDK abschließen.

Überblick

Wie auch bei anderen Datenflussanwendungen werden SQL-Dateien in Object Storage gespeichert und können von vielen SQL-Benutzern gemeinsam verwendet werden. Um dies zu erleichtern, können Sie mit Data Flow SQL-Skripte parametrisieren und zur Laufzeit anpassen. Wie auch bei anderen Anwendungen können Sie Standardwerte für Parameter angeben, die häufig als wertvoller Hinweis für Personen dienen, die diese Skripte ausführen.

Das SQL-Skript kann direkt in der Datenflussanwendung verwendet werden. Sie müssen keine Kopie des Skripts erstellen. Das Skript wird hier reproduziert, um einige Punkte zu veranschaulichen.

Referenztext des SparkSQL-Skripts: Ein Beispiel für SparkSQL-Code.

Wichtige Punkte:
  1. Das Skript beginnt, indem die erforderlichen SQL-Tabellen erstellt werden. Aktuell verfügt Data Flow über keinen persistenten SQL-Katalog, sodass alle Skripte mit der Definition der erforderlichen Tabellen beginnen müssen.
  2. Der Speicherort der Tabelle wird als ${location} festgelegt. Diesen Parameter muss der Benutzer zur Laufzeit angeben. Dies gibt Data Flow die Flexibilität, mit nur einem Skript viele verschiedene Speicherorte zu verwenden und Code für verschiedene Benutzer zu verwenden. Für diese Übung müssen wir ${location} anpassen, damit auf den in Übung 1 verwendeten Ausgabespeicherort verwiesen wird.
  3. Dadurch wird die Ausgabe des SQL-Skriptes erfasst und uns unter der Ausführung verfügbar gemacht.
SQL-Anwendung erstellen
  1. Erstellen Sie in Data Flow eine SQL-Anwendung, wählen Sie den Typ "SQL" aus, und übernehmen Sie die Standardressourcen. Auf der Auszugsseite "Anwendung erstellen" auf der rechten Seite der Seite "Anwendungen" befindet sich ein Abschnitt namens "Anwendungskonfiguration". Die Kontrollkästchen "Spark-Streaming" und "Spark-Submit-Optionen verwenden" sind nicht aktiviert. Unter dem Label "Sprache" befinden sich vier Optionsfelder. Als Sprache ist SQL ausgewählt.
  2. Konfigurieren Sie die SQL-Anwendung unter "Anwendungskonfiguration" wie folgt:
    1. URL der Datei: Dies ist der Speicherort der SQL-Datei in Object Storage. Der Speicherort für diese Anwendung lautet:
      oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow_lab_2019_sparksql_report.sql
    2. Argumente: Das SQL-Skript erwartet einen Parameter, den Speicherort der Ausgabe aus dem vorherigen Schritt. Wählen Sie Parameter hinzufügen aus, und geben Sie einen Parameter namens location mit dem Wert ein, den Sie als Ausgabepfad in Schritt a basierend auf der Vorlage verwendet haben.
      oci://[bucket]@[namespace]/optimized_listings

    Wenn Sie fertig sind, stellen Sie sicher, dass die Anwendungskonfiguration etwa wie folgt aussieht:

    Im Auszug "Anwendung erstellen" auf der rechten Seite der Seite "Anwendungen" wird der Abschnitt "Anwendungskonfiguration" angezeigt. Das Kontrollkästchen "Spark-Submit-Optionen verwenden" ist nicht aktiviert. Unter "Sprache" sind vier Optionsfelder ausgewählt. Es gibt einen Abschnitt namens Datei auswählen. Darin ist das Kontrollkästchen "URL manuell eingeben" aktiviert. Dieser enthält ein Textfeld mit der Bezeichnung "URL der Datei", das den Link zur SQL-Datei enthält. Darunter befinden sich zwei Textfelder nebeneinander im Unterabschnitt "Parameter". Das erste Textfeld hat die Bezeichnung "Name". Darin ist "location" angegeben. Das zweite Textfeld hat die Bezeichnung "Wert" und enthält den Pfad zu einem Verzeichnis.

  3. Ändern Sie den Speicherortwert in einen gültigen Pfad in Ihrem Mandanten.
SQL-Anwendung ausführen
  1. Speichern Sie die Anwendung, und führen Sie sie über die Anwendungsliste aus. Die Seite "Anwendungen" mit den beiden bisher in diesem Tutorial erstellten Anwendungen in umgekehrter chronologischer Reihenfolge. Die Tabelle mit den Anwendungen enthält fünf Spalten: Name, Sprache, Eigentümer, Erstellt und Aktualisiert. Am Ende jeder Zeile befindet sich ein Dreipunktmenü. In Tutorial Example 2 wurde auf das Dreipunktmenü geklickt, woraufhin die Optionen angezeigt werden. Diese lauten "Details anzeigen", "Bearbeiten", "Ausführen", "Tags hinzufügen", "Tags anzeigen" und "Löschen". Als Nächstes wird auf "Ausführen" geklickt.
  2. Wenn die Ausführung abgeschlossen ist, öffnen Sie sie: Die Seite "Ausführungen" mit den beiden bisher in diesem Tutorial erstellten Anwendungen in umgekehrter chronologischer Reihenfolge. Jede Anwendung wurde nur einmal ausgeführt. Die Tabelle, in der die Anwendungen aufgeführt werden, enthält neun Spalten: Name, Sprache, Status, Eigentümer, Erstellt, Dauer, oCPU gesamt, Gelesene Daten und Geschriebene Daten. Der Status von "Tutorial Example 2" lautet "Erfolgreich", und die anderen Zellen in der Tabelle sind aufgefüllt.
  3. Navigieren Sie zu den Ausführungslogs: Unten auf der Seite "Ausführungsdetails". Unter den Details befindet sich ein Abschnitt mit der Bezeichnung "Logs". Darin werden die verfügbaren Logdateien in einer Tabelle mit fünf Spalten aufgeführt. Die Spalten sind: Name, Dateigröße, Quelle, Typ und Erstellt. Die beiden aufgeführten Logdateien sind stdout.log und stderr.log. Auf der linken Seite befindet sich ein kleiner Abschnitt mit der Bezeichnung "Ressourcen". Er enthält zwei Links: "Logs" und "Ressourcen". "Logs" ist ausgewählt.
  4. Öffnen Sie spark_application_stdout.log.gz, und bestätigen Sie, dass die Ausgabe der folgenden Ausgabe entspricht.
    Hinweis

    Die Reihenfolge Ihrer Zeilen kann sich von der im Bild unterscheiden, aber die Werte sollten übereinstimmen.
    Die Ausgabe der Datei spark_application_stdout.log.gz. Die Tabelle enthält fünf Spalten mit Daten. Die Spalten sind unbenannt und haben keine konsistente Breite. Die erste Spalte enthält Text, in den anderen Spalten stehen Zahlen.
  5. Anhand Ihres SQL-Profilings können Sie schlussfolgern, dass in diesem Dataset Neukolln mit $ 46,57 den niedrigsten durchschnittlichen Listenpreis hat, während Charlottenburg-Wilmersdorf den höchsten Durchschnittswert mit $ 114,27 aufweist. (Hinweis: Das Quell-Dataset enthält Preise in USD und nicht in EUR.)

In dieser Übung wurden einige wichtige Aspekte von Data Flow gezeigt. Wenn eine SQL-Anwendung eingerichtet ist, kann sie problemlos von beliebigen Benutzern ausgeführt werden, ohne dass Clusterkapazität, Datenzugriff und -aufbewahrung, Zugangsdatenverwaltung oder andere Sicherheitsaspekte berücksichtigt werden müssen. Beispiel: Ein Business Analyst kann mit Data Flow ganz einfach Spark-basierte Berichte nutzen.

3. Maschinelles Lernen mit PySpark

Führen Sie mit PySpark eine einfache Aufgabe für maschinelles Lernen mit den Eingabedaten aus.

In dieser Übung wird die Ausgabe von 1. ETL mit Java für die Eingabedaten verwendet. Sie müssen die erste Übung erfolgreich abgeschlossen haben, bevor Sie mit dieser beginnen können. Diesmal ist es Ihr Ziel, die besten Tarife unter den verschiedenen Airbnb-Angeboten mit Spark-Algorithmen für maschinelles Lernen zu identifizieren.

Die hier beschriebenen Schritte beziehen sich auf die Verwendung der Konsolen-UI. Sie können diese Übung mit spark-submit über CLI oder spark-submit mit Java-SDK abschließen.

Überblick

Eine PySpark-Anwendung kann direkt in Ihren Datenflussanwendungen verwendet werden. Sie müssen keine Kopie erstellen.

Hier finden Sie einen Referenztext des PySpark-Skripts, um einige Punkte zu veranschaulichen: PySpark-Beispielcode.

Einige Beobachtungen zu diesem Code:
  1. Das Python-Skript erwartet ein Befehlszeilenargument (rot hervorgehoben). Wenn Sie die Datenflussanwendung erstellen, müssen Sie einen Parameter erstellen, den der Benutzer auf den Eingabepfad setzt.
  2. Das Skript verwendet die lineare Regression zur Vorhersage eines Preises pro Angebot und sucht die besten Angebote durch Subtrahieren des Listenpreises von der Vorhersage. Der negativste Wert gibt gemäß dem Modell den besten Wert an.
  3. Das Modell in diesem Skript ist vereinfacht und berücksichtigt nur die Größe in Quadratfuß. In einer echten Einstellung würden Sie mehr Variablen verwenden, wie die nähere Umgebung und andere wichtige Vorhersagevariablen.
PySpark-Anwendung erstellen

Erstellen Sie eine PySpark-Anwendung in der Konsole oder mit spark-submit über die Befehlszeile oder mit SDK.

Maschinelles Lernen mit PySpark mit der Konsole

Erstellen Sie mit der Konsole eine PySpark-Anwendung in Data Flow.

  1. Erstellen Sie eine Anwendung, und wählen Sie den Typ "Python" aus.
    Auf der Pullout-Seite "Anwendung erstellen" ist Python als Sprache ausgewählt.
  2. Konfigurieren Sie unter Anwendungskonfiguration die Anwendung wie folgt:
    1. URL der Datei: Dies ist der Speicherort der Python-Datei in Object Storage. Der Speicherort für diese Anwendung lautet:
      oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow_lab_2019_pyspark_ml.py
    2. Argumente: Die Spark-Anwendung erwartet zwei Befehlszeilenparameter, einen für die Eingabe und einen für die Ausgabe. Geben Sie im Feld Argumente Folgendes ein:
      ${location}
      . Sie werden zur Eingabe des Standardwertes aufgefordert. Geben Sie den Wert ein, der als Ausgabepfad in Schritt a in der Vorlage verwendet wird::
      oci://<bucket>@<namespace>/optimized_listings
  3. Überprüfen Sie die Anwendungskonfiguration, und bestätigen Sie, dass sie der folgenden ähnelt:
    Auf der Pullout-Seite "Anwendung erstellen" auf der rechten Seite der Seite "Anwendungen" wird der Abschnitt "Anwendungskonfiguration" angezeigt. Es gibt das Kontrollkästchen "Spark-Submit-Optionen verwenden", das nicht aktiviert ist. Python wurde als Sprache ausgewählt. Das Textfeld mit der Bezeichnung "URL der Datei" enthält den Link zur PY-Datei. Darunter befindet sich ein weiteres Textfeld mit der Bezeichnung "Argumente", das "${location}" enthält. Darunter befinden sich zwei Textfelder nebeneinander im Unterabschnitt "Parameter". Das erste Feld ist ausgegraut und enthält "location". Das zweite Textfeld enthält den Pfad zu einem Verzeichnis.
  4. Ändern Sie den Speicherortwert in einen gültigen Pfad im Mandanten.
Maschinelles Lernen mit PySpark mit Spark-Submit und CLI

Erstellen Sie eine PySpark-Anwendung in Data Flow mit Spark-Submit und CLI.

  1. Schließen Sie die Übung Java-Anwendung mit Spark-Submit und CLI erstellen ab, bevor Sie diese Übung ausführen. Die Ergebnisse werden in dieser Übung verwendet.
  2. Führen Sie den folgenden Code aus:
    oci --profile <profile-name> --auth security_token data-flow run submit \
    --compartment-id <compartment-id> \
    --display-name Tutorial_3_PySpark_ML \
    --execute '
        oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow_lab_2019_pyspark_ml.py 
        oci://<your_bucket>@<namespace-name>/output/tutorial1'
Maschinelles Lernen mit PySpark mit Spark-Submit und SDK

Erstellen Sie eine PySpark-Anwendung in Data Flow mit Spark-Submit und SDK.

  1. Führen Sie die Übung Java-Anwendung mit Spark-Submit und SDK erstellen aus, bevor Sie diese Übung ausführen. Die Ergebnisse werden in dieser Übung verwendet.
  2. Führen Sie den folgenden Code aus:
    public class PySParkMLExample {
     
      private static Logger logger = LoggerFactory.getLogger(PySParkMLExample.class);
      String compartmentId = "<compartment-id>"; // need to change comapartment id
     
      public static void main(String[] ars){
        System.out.println("ML_PySpark Tutorial");
        new PySParkMLExample().createRun();
      }
     
      public void createRun(){
     
        ConfigFileReader.ConfigFile configFile = null;
        // Authentication Using config from ~/.oci/config file
        try {
          configFile = ConfigFileReader.parseDefault();
        }catch (IOException ie){
          logger.error("Need to fix the config for Authentication ", ie);
          return;
        }
     
        try {
        AuthenticationDetailsProvider provider =
            new ConfigFileAuthenticationDetailsProvider(configFile);
     
        DataFlowClient client = new DataFlowClient(provider);
        client.setRegion(Region.US_PHOENIX_1);
     
        String executeString = "oci://oow_2019_dataflow_lab@idehhejtnbtc/oow_2019_dataflow_lab/usercontent/oow_lab_2019_pyspark_ml.py oci://<bucket-name>@<namespace-name>/output/optimized_listings";
     
        CreateRunResponse response;
     
        CreateRunDetails runDetails = CreateRunDetails.builder()
            .compartmentId(compartmentId).displayName("Tutorial_3_ML_PySpark").execute(executeString)
            .build();
     
        CreateRunRequest runRequest = CreateRunRequest.builder().createRunDetails(runDetails).build();
        CreateRunResponse response = client.createRun(runRequest);
     
        logger.info("Successful run creation for ML_PySpark with OpcRequestID: "+response.getOpcRequestId()
            +" and Run ID: "+response.getRun().getId());
     
        }catch (Exception e){
          logger.error("Exception creating run for ML_PySpark ", e);
        }
     
     
      }
    }
PySpark-Anwendung ausführen
  1. Führen Sie die Anwendung von der Anwendungsliste aus. Die Seite "Anwendungen" mit den drei in diesem Tutorial erstellten Anwendungen in umgekehrter chronologischer Reihenfolge. Die Tabelle mit den Anwendungen enthält fünf Spalten: Name, Sprache, Eigentümer, Erstellt und Aktualisiert. Am Ende jeder Zeile befindet sich ein Dreipunktmenü. Bei "Tutorial Example 3" wurde auf das Dreipunktmenü geklickt, und die Optionen werden angezeigt. Diese lauten "Details anzeigen", "Bearbeiten", "Ausführen", "Tags hinzufügen", "Tags anzeigen" und "Löschen". Als Nächstes wird auf "Ausführen" geklickt.
  2. Wenn die Ausführung abgeschlossen ist, öffnen Sie sie, und navigieren Sie zu den Logs. Unten auf der Seite "Ausführungsdetails". Unter den Details befindet sich ein Abschnitt mit der Bezeichnung "Logs". Darin werden die verfügbaren Logdateien in einer Tabelle mit fünf Spalten aufgeführt. Die Spalten sind: Name, Dateigröße, Quelle, Typ und Erstellt. Die beiden aufgeführten Logdateien sind stdout.log und stderr.log. Auf der linken Seite befindet sich ein kleiner Abschnitt mit der Bezeichnung "Ressourcen". Er enthält zwei Links: "Logs" und "Ressourcen". "Logs" ist ausgewählt.

  3. Öffnen Sie die Datei spark_application_stdout.log.gz. Die Ausgabe muss mit dem Folgenden identisch sein: Die Ausgabe der Datei spark_application_stdout.log.gz. Hier ist eine Tabelle mit sechs Spalten dargestellt. Die Spalten sind: ID, Name, Features, Preis, Vorhersage und Wert. Nur die ersten zwanzig Zeilen werden angezeigt. Alle Zellen sind aufgefüllt.
  4. Aus dieser Ausgabe wird ersichtlich, dass das Angebot mit der ID 690578 den besten Tarif mit einem vorhergesagten Preis von $ 313,70 gegenüber dem Listenpreis von $ 35,00 mit der angegebenen Fläche von 4639 Quadratfuß aufweist. Wenn dieser Preis zu schön ist, um wahr zu sein, können Sie mithilfe der eindeutigen ID einen Drilldown in die Daten ausführen, um zu überprüfen, ob dies wirklich das Angebot des Jahrhunderts ist. Auch hier könnte ein professioneller Analyst die Ausgabe dieses Algorithmus für maschinelles Lernen ganz einfach dazu nutzen, seine Analyse weiter zu vertiefen.

Wie geht es weiter?

Jetzt können Sie Java-, Python- oder SQL-Anwendungen mit Data Flow erstellen und ausführen und die Ergebnisse untersuchen.

Data Flow verarbeitet alle Details zu Deployment, Ausfall, Logmanagement, Sicherheit und UI-Zugriff. Mit Data Flow können Sie sich auf die Entwicklung von Spark-Anwendungen konzentrieren, ohne sich mit der Infrastruktur befassen zu müssen.