Funcionalidad de spark-submit en Data Flow

Descubra cómo utilizar Data Flow con spark-submit.

Compatibilidad de spark-submit

Puede utilizar las opciones compatibles con spark-submit para ejecutar las aplicaciones mediante Data Flow.

spark-submit es un comando estándar del sector para ejecutar aplicaciones en clusters de Spark. Data Flow admite las siguientes opciones compatibles con chispa-envío:

  • --conf
  • --files
  • --py-files
  • --jars
  • --class
  • --driver-java-options
  • --packages
  • main-application.jar o main-application.py
  • argumentos para main-application. Argumentos transferidos al método principal de la clase principal (si los hay).

La opción --files simplifica la jerarquía de archivos, por lo que todos los archivos se colocan en el mismo nivel en el directorio de trabajo actual. Para mantener la jerarquía de archivos, utilice archive.zip o --py-files con un módulo de dependencia JAR, ZIP o EGG.

La opción --packages se utiliza para incluir cualquier otra dependencia proporcionando una lista delimitada por comas de coordenadas de Maven. Por ejemplo,
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.2
Todas las dependencias transitivas se manejan cuando se utiliza este comando.
Nota

Con la opción --packages, el pod de controlador de cada ejecución debe descargar las dependencias de forma dinámica, lo cual depende de la estabilidad de la red y el acceso a la central de Maven u otros repositorios remotos. Utilice el empaquetador de dependencias de Data Flow para generar un archivo de dependencias para producción.
Nota

Para todas las opciones de spark-submit en Data Flow, el URI debe comenzar por oci://.... No se admiten los URI que comienzan por local://... o hdfs://.... Utilice los nombres de dominio completos (FQDN) en el URI. Cargue todos los archivos, incluido main-application, en Oracle Cloud Infrastructure Object Storage.

Creación de una aplicación de flujo de datos Spark-Submit explica cómo crear una aplicación en la consola mediante spark-submit. También puede utilizar spark-submit con Java SDK o desde la CLI. Si utiliza CLI, no tiene que crear una aplicación de Data Flow para ejecutar la aplicación Spark con opciones compatibles con spark-submit en Data Flow. Esto resulta útil si ya tiene un comando de spark-submit que funciona en otro entorno. Cuando sigue la sintaxis del comando run submit, se crea una aplicación, si no existe ya en el URI de main-application.

Instalación de CLI pública con el comando de run submit

Estos pasos son necesarios para instalar una CLI pública con el comando run submit para usar con Data Flow:

  1. Cree un entorno de Python personalizado para utilizarlo como destino de la CLI.
    python3.9 -m venv cli-3
    source cli-3/bin/activate
  2. Instale la interfaz de línea de comandos (CLI) pública.
  3. Verifique que los comandos de run submit estén cargados:
    oci --version
     
    oci data-flow run submit
    Usage: oci data-flow run submit [OPTIONS]
     
    Error: Missing option(s) --compartment-id, --execute.
  4. Autenticar la sesión:
    oci session authenticate
    • Seleccione una región de la lista.
    • Introduzca el nombre del perfil que desea crear.
    • Cree un perfil de token
      oci iam region list --config-file /Users/<user-name>/.oci/config --profile <profile_name> --auth security_token

Uso de Spark-submit en Data Flow

Puede utilizar el comando de la CLI de spark-submit y convertirlo en un comando de CLI compatible en Data Flow.

El comando compatible con spark-submit en Data Flow es el comando run submit. Si ya tiene una aplicación Spark en funcionamiento en cualquier cluster, está familiarizado con la sintaxis spark-submit. Por ejemplo:
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
Para ejecutar esta aplicación en Data Flow, el comando de la CLI es:
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"
Para obtener el comando Data Flow compatible, siga estos pasos:
  1. Cargue todos los archivos, incluida la aplicación principal, en Object Storage.
  2. Sustituya los URI existentes por el URI oci://... correspondiente.
  3. Elimine los parámetros de spark-submit no admitidos o reservados. Por ejemplo, --master y --deploy-mode están reservados para Data Flow y un usuario no necesita rellenarlos.

  4. Agregue el parámetro --execute y transfiera una cadena de comandos compatible con spark-submit. Para generar la cadena --execute, mantenga los parámetros de spark-submit soportados y la aplicación principal y sus argumentos, en secuencia. Póngalos dentro de una cadena entre comillas (comillas simples o comillas dobles).

  5. Sustituya spark submit por el prefijo de comando estándar de Oracle Cloud Infrastructure, oci data-flow run submit.
  6. Agregue los pares de argumentos y parámetros obligatorios de Oracle Cloud Infrastructure para --profile, --auth security_token y --compartment-id.

Ejemplos de Run Submit

Algunos ejemplos de run submit en Data Flow.

  • Ejemplos de run submit mediante Oci-cli.
  • Un ejemplo de run submit mediante Oci-curl.

Ejemplos de Oci-cli

Ejemplos de run submit con oci-cli en Data Flow

Run submit básico:
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 con configuraciones opcionales de --jars, --files y 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 con archiveUri, --jars, --files y 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 con validación de URL en jars, files y 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}

Para activar la autenticación de entidad de recurso, agregue la propiedad de Spark en el archivo de configuración mediante spark submit y agregue la siguiente configuración en el método execute:

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

Ejemplo de oci-curl

Ejemplo de run submit mediante oci-curl en 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": {}
}