É possível enviar um job para um cluster do Serviço Gerenciado para Apache Spark usando uma solicitação programática ou HTTP da API jobs.submit, usando a ferramenta de linha de comando gcloud da Google Cloud CLI em uma janela do terminal local ou no Cloud Shell, ou no Google Cloud console aberto em um navegador local. Também é possível fazer SSH na instância mestre no cluster e executar um job diretamente da instância sem usar o Serviço Gerenciado para Apache Spark.
Simultaneidade de jobs:
é possível configurar o número máximo de jobs simultâneos do Serviço Gerenciado para Apache Spark
com a propriedade de cluster
dataproc:dataproc.scheduler.max-concurrent-jobs
ao criar um cluster. Se esse valor de propriedade não for definido,
o limite máximo de jobs simultâneos será calculado como
max((masterMemoryMb - 3584) / masterMemoryMbPerJob, 5).
masterMemoryMb é determinado pelo tipo de máquina da VM mestre.
masterMemoryMbPerJob é 1024 por padrão, mas é
configurável na criação do cluster com a
propriedade de cluster dataproc:dataproc.scheduler.driver-size-mb.
Como enviar um job
Isolamento de classpath e JARs personalizados: não copie "fat JARs" personalizados ou pacotes JAR (como o ambiente de execução do Apache Iceberg ou pacotes do Google Cloud ) diretamente para diretórios do sistema do cluster, como /usr/lib/spark/jars/. Colocar JARs personalizados em diretórios do sistema polui o caminho de classe do agente do Serviço Gerenciado para Apache Spark com dependências transitivas (como bibliotecas Guava ou Hadoop) que entram em conflito com as bibliotecas integradas do agente. Esse conflito pode causar erros de resolução de classe (como ClassNotFoundException ou NoClassDefFoundError) ao realizar operações de gerenciamento de jobs, como cancelar um job, fazendo com que o agente falhe e deixando os aplicativos do YARN órfãos.
Em vez disso, use uma das seguintes abordagens compatíveis:
- Dependências específicas do job: especifique o caminho do Cloud Storage para os JARs ao enviar o job usando a flag
--jarsna CLI do Google Cloud, o campo Arquivos JAR no console do Google Cloud ou o campojarFileUrisna API. O Spark distribui as dependências para o driver e os executores do job sem poluir o caminho de classe do agente. - Dependências em todo o cluster: especifique as dependências durante a criação do cluster usando a propriedade de cluster
spark:spark.jars: Isso instrui o Serviço Gerenciado para Apache Spark a configurar--properties="spark:spark.jars=gs://YOUR_BUCKET/jar-1.jar,gs://YOUR_BUCKET/jar-2.jar"
/etc/spark/conf/spark-defaults.conf, distribuindo automaticamente as dependências para os caminhos de classe do driver e do executor do Spark para todos os jobs, mantendo o agente do Serviço Gerenciado para Apache Spark local do nó isolado.
Console
Abra a página Enviar um job do Serviço Gerenciado para Apache Spark no console do Google Cloud no navegador.
Exemplo de job do Spark
Para enviar um job de amostra do Spark, preencha os campos na página Enviar um job da seguinte maneira:
- Em Selecionar o tipo de computação para o job, selecione Spark no Compute Engine.
- Na seção Detalhes do job do cluster, especifique um código da tarefa (ou aceite o ID padrão) e selecione o Cluster na lista de clusters.
- Na seção Arquivos e artefatos:
- Defina Tipo de serviço como Spark (Scala / Java) (
Spark). - Em Configuração do driver, selecione Classe principal e defina Classe principal como
org.apache.spark.examples.SparkPi. - Defina Argumentos como o argumento único
1000. - Adicione
file:///usr/lib/spark/examples/jars/spark-examples.jaraos arquivos JAR (ou ao campojarFileUrisda API):file:///indica um esquema de LocalFileSystem do Hadoop. O Serviço Gerenciado para Apache Spark instalou o/usr/lib/spark/examples/jars/spark-examples.jarno nó mestre do cluster quando o criou. Esse caminho é usado apenas para exemplos pré-instalados fornecidos pelo Serviço Gerenciado para Apache Spark. Não copie JARs personalizados para diretórios do sistema (consulte o aviso em Como enviar um job).- Como alternativa, é possível especificar um caminho do Cloud Storage
(
gs://your-bucket/your-jarfile.jar) ou um caminho do sistema de arquivos distribuídos do Hadoop (hdfs://path-to-jar.jar) para um dos seus jars. Se você enviar o job usando a API, especifique esse caminho no campojarFileUris.
- Defina Tipo de serviço como Spark (Scala / Java) (
Clique em Enviar para iniciar o job. Depois de iniciado, o job será adicionado à lista.
Clique no código da tarefa para abrir a página Jobs, em que é possível ver a saída do driver da tarefa. Como esse job produz linhas de saída longas que
excedem a largura da janela do navegador, marque a caixa Quebra de linha para exibir todo
o texto de saída e mostrar o resultado calculado para pi.
É possível ver a saída do driver do job na linha de comando usando o comando
gcloud dataproc jobs wait
mostrado abaixo. Para mais informações, consulte
Ver saída do job: COMANDO GCLOUD.
Copie e cole o ID do projeto como o valor da flag --project e o
ID do job (mostrado na lista de jobs) como o argumento final.
gcloud dataproc jobs wait job-id \ --project=project-id \ --region=region
Veja snippets da saída do driver para o job de amostra SparkPi:
... 2015-06-25 23:27:23,810 INFO [dag-scheduler-event-loop] scheduler.DAGScheduler (Logging.scala:logInfo(59)) - Stage 0 (reduce at SparkPi.scala:35) finished in 21.169 s 2015-06-25 23:27:23,810 INFO [task-result-getter-3] cluster.YarnScheduler (Logging.scala:logInfo(59)) - Removed TaskSet 0.0, whose tasks have all completed, from pool 2015-06-25 23:27:23,819 INFO [main] scheduler.DAGScheduler (Logging.scala:logInfo(59)) - Job 0 finished: reduce at SparkPi.scala:35, took 21.674931 s Pi is roughly 3.14189648 ... Job [c556b47a-4b46-4a94-9ba2-2dcee31167b2] finished successfully. driverOutputUri: gs://sample-staging-bucket/google-cloud-dataproc-metainfo/cfeaa033-749e-48b9-... ...
gcloud
Para enviar um job a um cluster do Serviço Gerenciado para Apache Spark, execute o comando gcloud dataproc jobs submit da CLI gcloud localmente em uma janela do terminal ou no Cloud Shell.
gcloud dataproc jobs submit job-command \ --cluster=cluster-name \ --region=region \ other dataproc-flags \ -- job-args
- Liste os
hello-world.pyacessíveis publicamente localizados no Cloud Storage. Lista de arquivos:gcloud storage cat gs://dataproc-examples/pyspark/hello-world/hello-world.py
#!/usr/bin/python import pyspark sc = pyspark.SparkContext() rdd = sc.parallelize(['Hello,', 'world!']) words = sorted(rdd.collect()) print(words)
- Envie o job do PySpark para o Serviço Gerenciado para Apache Spark.
Saída do terminal:gcloud dataproc jobs submit pyspark \ gs://dataproc-examples/pyspark/hello-world/hello-world.py \ --cluster=cluster-name \ --region=region
Waiting for job output... … ['Hello,', 'world!'] Job finished successfully.
- Execute o exemplo do SparkPi pré-instalado no nó mestre do cluster do Serviço Gerenciado para Apache Spark. O caminho
file:///usr/lib/spark/examples/jars/spark-examples.jaré apenas para exemplos pré-instalados. Para dependências JAR personalizadas, consulte o aviso em Como enviar um job. Saída do terminal:gcloud dataproc jobs submit spark \ --cluster=cluster-name \ --region=region \ --class=org.apache.spark.examples.SparkPi \ --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \ -- 1000
Job [54825071-ae28-4c5b-85a5-58fae6a597d6] submitted. Waiting for job output… … Pi is roughly 3.14177148 … Job finished successfully. …
REST
Nesta seção, mostramos como enviar um job do Spark para calcular o valor aproximado
de pi usando a API
jobs.submit do Serviço Gerenciado para Apache Spark.
Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:
- project-id: Google Cloud ID do projeto
- region: região do cluster
- clusterName: nome do cluster
Método HTTP e URL:
POST https://dataproc.googleapis.com/v1/projects/project-id/regions/region/jobs:submit
Corpo JSON da solicitação:
{
"job": {
"placement": {
"clusterName": "cluster-name"
},
"sparkJob": {
"args": [
"1000"
],
"mainClass": "org.apache.spark.examples.SparkPi",
"jarFileUris": [
"file:///usr/lib/spark/examples/jars/spark-examples.jar"
]
}
}
}
Para enviar a solicitação, expanda uma destas opções:
Você receberá uma resposta JSON semelhante a esta:
{
"reference": {
"projectId": "project-id",
"jobId": "job-id"
},
"placement": {
"clusterName": "cluster-name",
"clusterUuid": "cluster-Uuid"
},
"sparkJob": {
"mainClass": "org.apache.spark.examples.SparkPi",
"args": [
"1000"
],
"jarFileUris": [
"file:///usr/lib/spark/examples/jars/spark-examples.jar"
]
},
"status": {
"state": "PENDING",
"stateStartTime": "2020-10-07T20:16:21.759Z"
},
"jobUuid": "job-Uuid"
}
Java
Python
Go
Node.js
Enviar um trabalho diretamente no cluster
Se você quiser executar um job diretamente no cluster sem usar o Serviço Gerenciado para Apache Spark, faça login por SSH no nó mestre do cluster e execute o job no nó mestre.
Depois de estabelecer uma conexão SSH com a instância mestre da VM, execute comandos em uma janela de terminal no nó mestre do cluster para:
- abrir um shell do Spark;
- Execute um job do Spark para contar o número de linhas em um arquivo Python "hello-world" (de sete linhas) localizado em um arquivo do Cloud Storage acessível publicamente.
sair do shell.
user@cluster-name-m:~$ spark-shell ... scala> sc.textFile("gs://dataproc-examples" + "/pyspark/hello-world/hello-world.py").count ... res0: Long = 7 scala> :quit
Executar jobs do Bash no Serviço Gerenciado para Apache Spark
Talvez você queira executar um script bash como seu job do Serviço Gerenciado para Apache Spark, seja porque os mecanismos usados não são compatíveis como um tipo de serviço de nível superior do Serviço Gerenciado para Apache Spark ou porque você precisa fazer uma configuração ou um cálculo adicional de argumentos antes de iniciar um job usando hadoop ou spark-submit do seu script.
Exemplo de Python
Suponha que você tenha copiado um script hello.sh bash no Cloud Storage:
gcloud storage cp hello.sh gs://${BUCKET}/hello.shComo o comando pig fs usa caminhos do Hadoop, copie o script do
Cloud Storage para um destino especificado como file:/// para garantir
que ele esteja no sistema de arquivos local em vez do HDFS. Os comandos sh subsequentes
fazem referência ao sistema de arquivos local automaticamente e não exigem o prefixo
file:///.
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
-e='fs -cp -f gs://${BUCKET}/hello.sh file:///tmp/hello.sh; sh chmod 750 /tmp/hello.sh; sh /tmp/hello.sh'Como alternativa, como o argumento --jars de envio de jobs do Serviço Gerenciado para Apache Spark prepara um arquivo em um diretório temporário criado para o ciclo de vida do job, é possível especificar o script de shell do Cloud Storage como um argumento --jars:
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
--jars=gs://${BUCKET}/hello.sh \
-e='sh chmod 750 ${PWD}/hello.sh; sh ${PWD}/hello.sh'Observe que o argumento --jars também pode fazer referência a um script local:
gcloud dataproc jobs submit pig --cluster=${CLUSTER} --region=${REGION} \
--jars=hello.sh \
-e='sh chmod 750 ${PWD}/hello.sh; sh ${PWD}/hello.sh'