Spark-Submit-Funktionalität in Data Flow

Erfahren Sie, wie Sie Data Flow mit spark-submit verwenden.

Spark-Submit-Kompatibilität

Sie können Ihre Anwendungen mit spark-submit-kompatiblen Optionen mit Data Flow ausführen.

Spark-Submit ist ein branchenüblicher Befehl zum Ausführen von Anwendungen in Spark-Clustern. Die folgenden spark-submit-Kompatibilitätsoptionen werden von Datenfluss unterstützt:

  • --conf
  • --files
  • --py-files
  • --jars
  • --class
  • --driver-java-options
  • --packages
  • main-application.jar oder main-application.py
  • Argumente für main-application. Argumente, die an die Hauptmethode der Hauptklasse übergeben werden (sofern vorhanden).

Mit der Option --files wird die Dateihierarchie vereinfacht, sodass alle Dateien auf derselben Ebene im aktuellen Arbeitsverzeichnis abgelegt werden. Um die Dateihierarchie beizubehalten, verwenden Sie entweder archive.zip oder --py-files mit einem JAR-, ZIP- oder EGG-Abhängigkeitsmodul.

Mit der Option --packages werden alle anderen Abhängigkeiten einbezogen, indem eine durch Komma getrennte Liste mit Maven-Koordinaten angegeben wird. Beispiel:
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.2
Alle transitiven Abhängigkeiten werden bei Verwendung dieses Befehls verarbeitet.
Hinweis

Mit der Option --packages muss der Treiberpod jeder Ausführung Abhängigkeiten dynamisch herunterladen. Dafür ist ein stabiles Netzwerk und Zugriff auf das zentrale Maven-Repository oder andere Remote-Repositorys erforderlich. Mit dem Data Flow Abhängigkeits-Packager können Sie ein Abhängigkeitsarchiv für die Produktion generieren.
Hinweis

Für alle spark-submit-Optionen in Data Flow muss die URI mit oci://... beginnen. Mit local://... oder hdfs://... beginnende URIs werden nicht unterstützt. Verwenden Sie die vollqualifizierten Domainnamen (FQDN) in der URI. Laden Sie alle Dateien, einschließlich main-application, in Oracle Cloud Infrastructure Object Storage.

Unter Spark-Submit-Datenflussanwendung erstellen wird erläutert, wie Sie eine Anwendung in der Konsole mit spark-submit erstellen. Sie können spark-submit auch mit einem Java-SDK oder über die CLI verwenden. Wenn Sie die CLI verwenden, müssen Sie keine Datenflussanwendung erstellen, um Ihre Spark-Anwendung mit spark-submit-kompatiblen Optionen in Data Flow auszuführen. Dies ist hilfreich, wenn Sie bereits einen funktionierenden spark-submit-Befehl in einer anderen Umgebung verwenden. Wenn Sie die Syntax des Befehls run submit befolgen, wird eine Anwendung erstellt, sofern unter der URI main-application noch keine Anwendung vorhanden ist.

Öffentliche CLI mit dem Befehl "run submit" installieren

Diese Schritte sind erforderlich, um eine öffentliche CLI mit dem Befehl run submit zur Verwendung mit Data Flow zu installieren:

  1. Erstellen Sie eine benutzerdefinierte Python-Umgebung, die als Ziel der CLI verwendet werden soll.
    python3.9 -m venv cli-3
    source cli-3/bin/activate
  2. Installieren Sie die öffentliche Befehlszeilenschnittstelle (CLI).
  3. Prüfen Sie, ob die run submit-Befehle geladen wurden:
    oci --version
     
    oci data-flow run submit
    Usage: oci data-flow run submit [OPTIONS]
     
    Error: Missing option(s) --compartment-id, --execute.
  4. Authentifizieren Sie die Session:
    oci session authenticate
    • Wählen Sie eine Region in der Liste aus.
    • Geben Sie den Namen des zu erstellen Profils ein.
    • Erstellen Sie ein Tokenprofil:
      oci iam region list --config-file /Users/<user-name>/.oci/config --profile <profile_name> --auth security_token

Spark-Submit in Data Flow verwenden

Sie können den spark-submit-CLI-Befehl in einen kompatiblen CLI-Befehl in Data Flow konvertieren.

Der spark-submit-kompatible Befehl in Data Flow ist der Befehl run submit. Wenn Sie bereits eine funktionierende Spark-Anwendung in einem beliebigen Cluster verwenden, sind Sie mit der Syntax zum Übermitteln von Funken vertraut. Beispiel:
spark-submit --master spark://<IP-address>:port \
--deploy-mode cluster \
--conf spark.sql.crossJoin.enabled=true \
--files oci://file1.json \
--class org.apache.spark.examples.SparkPi \ 
--jars oci://file2.jar <path_to>/main_application_with-dependencies.jar 1000
Zum Ausführen dieser Anwendung in Data Flow lautet der CLI-Befehl:
oci data-flow run submit \
--compartment-id <compartment-id> \
--execute "--conf spark.sql.crossJoin.enabled=true
 --files oci://<bucket-name>@<namespace>/path/to/file1.json
 --jars oci://<bucket-name>@<namespace>/path/to/file2.jar
 oci://<bucket-name>@<namespace>/path_to_main_application_with-dependencies.jar 1000"
So rufen Sie den kompatiblen Data Flow-Befehl ab:
  1. Laden Sie alle Dateien, einschließlich der Hauptanwendung, in Object Storage hoch.
  2. Ersetzen Sie die vorhandenen URIs durch die entsprechende oci://...-URI.
  3. Entfernen Sie alle nicht unterstützten oder reservierten spark-submit-Parameter. Beispiel: --master und --deploy-mode sind für Data Flow reserviert und müssen nicht von einem Benutzer angegeben werden.

  4. Fügen Sie den Parameter --execute hinzu, und übergeben Sie eine spark-submit-kompatible Befehlszeichenfolge. Um die Zeichenfolge --execute zu erstellen, behalten Sie die unterstützten spark-submit-Parameter sowie die Hauptanwendung und ihre Argumente nacheinander bei. Stellen Sie sie in eine Zeichenfolge in (einzelnen oder doppelten) Anführungszeichen.

  5. Ersetzen Sie spark submit durch das Oracle Cloud Infrastructure-Standardbefehlspräfix oci data-flow run submit.
  6. Fügen Sie die erforderlichen Argument- und Parameterpaare von Oracle Cloud Infrastructure für --profile, --auth security_token und --compartment-id hinzu.

Beispiele für "run submit"

Beispiele für "run submit" in Data Flow.

  • Beispiele für "run submit" mit Oci-cli.
  • Beispiel für "run submit" mit Oci-curl.

Beispiele für "oci-cli"

Beispiele für run submit mit oci-cli in Data Flow.

Basisbefehl "run submit":
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--execute "--conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
"Run submit" mit optionalen Konfigurationen von --jars, --files und pyfiles:
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--execute "--jars oci://<bucket-name>@<tenancy-name>/a.jar
 --files \"oci://<bucket-name>@<tenancy-name>/b.json\"
 --py-files oci://<bucket-name>@<tenancy-name>/c.py
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
"Run submit" mit archiveUri, --jars, --files und pyfiles:
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--archive-uri  "oci://<bucket-name>@<tenancy-name>/mmlspark_original.zip" \
--execute "--jars local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar
 --files \"local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar\"
 --py-files local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
"Run submit" mit URL-Validierung innerhalb von jars, files und pyfiles:
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--archive-uri  "oci://<bucket-name>@<tenancy-name>/mmlspark_original.zip" \
--execute "--jars oci://<bucket-name>@<tenancy-name>/fake.jar
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
#result
{'opc-request-id': '<opc-request-id>', 'code': 'InvalidParameter',
 'message': 'Invalid OCI Object Storage uri. The object was not found or you are not authorized to access it.
 {ResultCode: OBJECTSTORAGE_URI_INVALID,
 Parameters: [oci://<bucket-name>@<tenancy-name>/fake.jar]}', 'status': 400}

Um die Resource-Principal-Authentifizierung zu aktivieren, fügen Sie die Spark-Eigenschaft mit Spark-Submit in der Konfigurationsdatei hinzu, und fügen Sie die folgende Konfiguration in der Ausführungsmethode hinzu:

--execute 
"--conf dataflow.auth=resource_principal
 --conf other-spark-property=other-value" 

Beispiel für "oci-curl"

Beispiel für run submit mit oci-curl in Data Flow.

oci-curl <IP-Address>:443 POST /Users/<user-name>/workspace/sss/dependency_test/spark-submit-test.json
 /20200129/runs --insecure --noproxy <IP-Address>
 
{
"execute": "--jars local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar
 --files \"local:///opt/spark/examples/jars/spark-examples_2.11-2.4.4.jar\"
 --py-files local:///opt/spark/conf/spark.properties
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
     oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10",
"displayName": "spark-submit-test",
"sparkVersion": "2.4",
"driverShape": "VM.Standard2.1",
"executorShape": "VM.Standard2.1",
"numExecutors": 1,
"logsBucketUri": "",
"freeformTags": {},
"definedTags": {}
}