Funcionalidade Spark-Submit no Serviço Data Flow

Saiba como usar o serviço Data Flow com o script Spark-submit.

Compatibilidade de Script Spark-Submit

Você pode usar opções compatíveis com o script spark-submit para executar seus aplicativos usando o serviço Data Flow.

Spark-submit é um comando padrão do setor para executar aplicativos em clusters do Spark. O serviço Data Flow suporta as seguintes opções compatíveis com script spark:

  • --conf
  • --files
  • --py-files
  • --jars
  • --class
  • --driver-java-options
  • --packages
  • main-application.jar ou main-application.py
  • argumentos para main-application. Os argumentos especificados para o método principal da sua classe principal (se houver).

A opção --files simplifica sua hierarquia de arquivos, de modo que todos os arquivos são colocados no mesmo nível no diretório de trabalho atual. Para manter a hierarquia de arquivos, use archive.zip ou --py-files com um módulo de dependência JAR, ZIP ou EGG.

A opção --packages é usada para incluir qualquer outra dependência fornecendo uma lista delimitada por vírgulas de coordenadas do Maven. Por exemplo,
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.2
Todas as dependências transitivas são tratadas ao usar este comando.
Observação

Com a opção --packages, cada pod de driver da Execução precisa fazer download de dependências dinamicamente, o que depende da estabilidade da rede e do acesso ao Maven Central ou a outros repositórios remotos. Use o Pacote de Dependência do Serviço Data Flow para gerar um arquivo compactado de dependência para produção.
Observação

Para todas as opções de script spark-submit no serviço Data Flow, o URI deve iniciar oci://.... Não há suporte para URIs que começam com local://... ou hdfs://.... Use os nomes de domínio totalmente qualificados (FQDN) no URI. Carregar todos os arquivos, incluindo main-application, para o Oracle Cloud Infrastructure Object Storage.

Criar um Aplicativo Spark-Submit Data Flow explica como criar um aplicativo na Console usando o script spark-submit. Você também pode usar o script spark-submit com um SDK Java ou pela CLI. Se você estiver usando a CLI, não precisará criar um Aplicativo do serviço Data Flow para executar seu aplicativo Spark com opções compatíveis com o script spark-submit no serviço Data Flow. Isso será útil se você já tiver um comando spark-submit em operação em outro ambiente. Quando você segue a sintaxe do comando run submit, um Aplicativo é criado, se ainda não existir um no URI main-application.

Instalando a CLI Pública com o Comando de envio de execução

Estas etapas são necessárias para instalar uma CLI pública com o comando run submit para uso com o Serviço Data Flow:

  1. Crie um ambiente Python personalizado para ser usado como o destino da CLI.
    python3.9 -m venv cli-3
    source cli-3/bin/activate
  2. Instale a Interface de Linha de Comando (CLI) pública.
  3. Verifique se os comandos run submit estão carregados:
    oci --version
     
    oci data-flow run submit
    Usage: oci data-flow run submit [OPTIONS]
     
    Error: Missing option(s) --compartment-id, --execute.
  4. Autentique a sessão:
    oci session authenticate
    • Selecione uma região na lista.
    • Digite o nome do perfil a ser criado.
    • Criar um perfil de token:
      oci iam region list --config-file /Users/<user-name>/.oci/config --profile <profile_name> --auth security_token

Usando o Script Spark-Submit no Serviço Data Flow

Você pode usar o comando da CLI spark-submit e convertê-lo em um comando da CLI compatível no serviço Data Flow.

O comando compatível com o script spark-submit no serviço Data Flow é o comando run submit. Se você já tiver um aplicativo Spark ativo em qualquer cluster, você estará familiarizado com a sintaxe spark-submit. Por exemplo:
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 executar este aplicativo no serviço Data Flow, o comando da CLI é:
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 obter o comando compatível do serviço Data Flow, siga estas etapas:
  1. Faça upload de todos os arquivos, incluindo o aplicativo principal, no serviço Object Storage.
  2. Substitua os URIs existentes pelo URI oci://... correspondente.
  3. Remova os parâmetros de script spark-submit não suportados ou reservados. Por exemplo, --master e --deploy-mode são reservados para o serviço Data Flow e um usuário não precisa preenchê-los.

  4. Adicione o parâmetro --execute e especifique uma string de comando compatível com o script spark-submit. Para criar a string --execute, mantenha os parâmetros de script spark-submit suportados, e main-application e seus argumentos, em sequência. Coloque-os em uma string entre aspas (aspas simples ou duplas).

  5. Substitua spark submit pelo prefixo do comando padrão do Oracle Cloud Infrastructure, oci data-flow run submit.
  6. Adicione o argumento obrigatório e os pares de parâmetros do Oracle Cloud Infrastructure para --profile, --auth security_token e --compartment-id.

Executar Exemplos de Envio

Alguns exemplos do comando submit no serviço Data Flow.

  • Exemplos de comando run submit usando Oci-cli.
  • Um exemplo de comando run submit usando o Oci-curl.

Exemplos de Oci-cli

Exemplos de run submit usando oci-cli no serviço Data Flow.

Submissão de execução básica:
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"
Execute o envio com configurações opcionais de --jars, --files e 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"
Execute o envio com archiveUri, --jars, --files e 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"
Execute o envio com validação de URL em jars, files e 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 ativar a Autenticação do Controlador de Recursos, adicione a propriedade Spark no arquivo conf usando o Spark submit e adicione a seguinte configuração no método de execução:

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

Exemplo de Oci-curl

Um exemplo de run submit usando oci-curl no serviço Data Flow.

oci-curl <IP-Address>:443 POST /Users/<user-name>/workspace/sss/dependency_test/spark-submit-test.json
 /latest/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": {}
}