

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Uso das configurações do Spark ao executar trabalhos do EMR Sem Servidor
<a name="jobs-spark"></a>

Você pode executar trabalhos do Spark em uma aplicação com o parâmetro `type` definido como `SPARK`. Os trabalhos devem ser compatíveis com a versão do Spark compatível com a versão de lançamento do Amazon EMR. Por exemplo, quando você executa trabalhos com o Amazon EMR versão 6.6.0, seu trabalho deve ser compatível com o Apache Spark 3.2.0. Para obter informações sobre as versões da aplicação para cada versão, consulte [Versões de lançamento do Amazon EMR Sem Servidor](release-versions.md).

## Parâmetros do trabalho do Spark
<a name="spark-params"></a>

Ao usar a [API `StartJobRun`](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/API_StartJobRun.html) para executar um trabalho do Spark, especifique os parâmetros a seguir.

**Topics**
+ [Perfil de runtime de trabalhos do Spark](#spark-defaults-executionRoleArn)
+ [Parâmetro do driver de trabalhos do Spark](#spark-defaults-jobDriver)
+ [Parâmetro de substituição de configuração do Spark](#spark-defaults-configurationOverrides)
+ [Otimização dinâmica da alocação de recursos do Spark](#spark-defaults-dynamicResourceAllocation)

### Perfil de runtime de trabalhos do Spark
<a name="spark-defaults-executionRoleArn"></a>

Use **`executionRoleArn`** para especificar o ARN do perfil do IAM que a aplicação usa para executar trabalhos do Spark. Esse perfil deve conter as seguintes permissões: 
+ Leitura dos buckets do S3 ou de outras fontes de dados em que os dados residem
+ Leia os buckets ou prefixos do S3 em que seu PySpark script ou arquivo JAR reside
+ Gravação nos buckets do S3 onde você pretende gravar a saída final
+ Gravação de logs em um bucket ou prefixo do S3 que `S3MonitoringConfiguration` especifica
+ Acesso às chaves do KMS se você usá-las para criptografar dados no bucket do S3
+ Acesso ao AWS Glue Data Catalog se você usar o SparkSQL

Se o trabalho do Spark ler ou gravar dados entre outras fontes de dados, especifique as permissões apropriadas nesse perfil do IAM. Se você não fornecer essas permissões ao perfil do IAM, o trabalho poderá falhar. Para obter mais informações, consulte [Perfis de runtime do trabalho para o Amazon EMR Sem Servidor](security-iam-runtime-role.md) e [Armazenamento de logs](logging.md). 

### Parâmetro do driver de trabalhos do Spark
<a name="spark-defaults-jobDriver"></a>

Use **`jobDriver`** para fornecer entradas ao trabalho. O parâmetro do driver do trabalho aceita somente um valor para o tipo de trabalho que você deseja executar. Para um trabalho do Spark, o valor do parâmetro é `sparkSubmit`. Você pode usar esse tipo de tarefa para executar Scala PySpark, Java e qualquer outra tarefa compatível por meio do envio do Spark. Os trabalhos do Spark têm os seguintes parâmetros:
+ **`sparkSubmitParameters`**: esses são os parâmetros adicionais do Spark que você deseja enviar para o trabalho. Use este parâmetro para substituir as propriedades padrão do Spark, como a memória do driver ou o número de executores, como aqueles definidos nos argumentos `--conf` ou `--class`. 
+ **`entryPointArguments`**: essa é uma matriz de argumentos que você deseja transferir para o arquivo principal em JAR ou Python. Você deve realizar a leitura desses parâmetros usando seu código de Entrypoint. Separe cada argumento da matriz por uma vírgula.
+ **`entryPoint`**: essa é a referência no Amazon S3 ao arquivo JAR ou Python principal que você deseja executar. Se você estiver executando um JAR Scala ou Java, especifique a classe de entrada principal nos `SparkSubmitParameters` usando o argumento `--class`.

Para obter informações adicionais, consulte [Iniciar aplicações com spark-submit](https://spark.apache.org/docs/latest/submitting-applications.html#launching-applications-with-spark-submit).

### Parâmetro de substituição de configuração do Spark
<a name="spark-defaults-configurationOverrides"></a>

Use **`configurationOverrides`** para substituir as propriedades de configuração no nível de monitoramento e no nível de aplicação. Este parâmetro aceita um objeto JSON com os seguinte dois campos:
+ **`monitoringConfiguration`**: use esse campo para especificar o URL do Amazon S3 (`s3MonitoringConfiguration`) no qual você deseja que o trabalho do EMR Sem Servidor armazene os logs do trabalho do Spark. Certifique-se de ter criado esse bucket com o mesmo Conta da AWS que hospeda seu aplicativo e no mesmo Região da AWS local em que seu trabalho está sendo executado.
+ **`applicationConfiguration`**: para substituir as configurações padrão de uma aplicação, você pode fornecer um objeto de configuração nesse campo. Você pode usar uma sintaxe abreviada para fornecer a configuração ou fazer referência ao objeto de configuração em um arquivo JSON. Os objetos de configuração consistem em uma classificação, propriedades e configurações opcionais aninhadas As propriedades consistem nas configurações que você deseja substituir neste arquivo. Você pode especificar várias classificações para diversas aplicações em um único objeto JSON.
**nota**  
As classificações de configuração disponíveis variam de acordo com a versão específica do EMR Sem Servidor. Por exemplo, classificações para Log4j personalizado `spark-driver-log4j2` e `spark-executor-log4j2` estão disponíveis somente nas versões 6.8.0 e superiores. 

Se você usar a mesma configuração em uma substituição de aplicação e nos parâmetros de envio do Spark, os parâmetros de envio do Spark terão prioridade. As configurações são classificadas em prioridade da seguinte forma, da mais alta para a mais baixa:
+ Configuração que o EMR Sem Servidor fornece quando cria `SparkSession`.
+ Configuração que você fornece como parte dos `sparkSubmitParameters` com o argumento `--conf`.
+ A configuração que você fornece como parte da aplicação é substituída ao iniciar um trabalho.
+ Configuração fornecida como parte da `runtimeConfiguration` ao criar uma aplicação.
+ Configurações otimizadas escolhidas pelo Amazon EMR para a versão.
+ Configurações padrão de código aberto para a aplicação.

Para obter mais informações sobre como declarar configurações no nível da aplicação e substituir configurações durante a execução do trabalho, consulte [Configuração padrão de aplicações do EMR Sem Servidor](default-configs.md).

### Otimização dinâmica da alocação de recursos do Spark
<a name="spark-defaults-dynamicResourceAllocation"></a>

Use `dynamicAllocationOptimization` para otimizar o uso de recursos no EMR Sem Servidor. Definir essa propriedade como `true` na classificação de configuração do Spark indica que o EMR Sem Servidor otimizará a alocação de recursos do executor para melhor alinhar a taxa na qual o Spark solicita e cancela os executores com a taxa na qual o EMR Sem Servidor cria e libera trabalhadores. Ao fazer isso, o EMR Sem Servidor reutiliza de forma mais otimizada os trabalhadores em todos os estágios, resultando em menor custo ao executar trabalhos com vários estágios, mantendo a mesma performance.

Essa propriedade está disponível em todas as versões de lançamento do Amazon EMR.

O exemplo a seguir é de uma classificação de configuração com `dynamicAllocationOptimization`.

```
[
  {
    "Classification": "spark",
    "Properties": {
      "dynamicAllocationOptimization": "true"
    }
  }
]
```

Considere o seguinte se estiver usando a otimização de alocação dinâmica:
+ Essa otimização está disponível nos trabalhos do Spark para os quais você habilitou a alocação dinâmica de recursos.
+ Para obter a melhor eficiência de custos, sugerimos configurar um limite superior de ajuste de escala para os trabalhadores usando a configuração de nível de trabalho `spark.dynamicAllocation.maxExecutors` ou a configuração de [capacidade máxima em nível de aplicação](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/app-behavior.html#max-capacity) com base na workload.
+ Talvez você não veja uma melhora de custo em trabalhos mais simples. Por exemplo, se o trabalho for executado em um pequeno conjunto de dados ou terminar de ser executado em um estágio, talvez o Spark não precise de um número maior de executores ou de vários eventos de ajuste de escala.
+ Trabalhos com uma sequência de um estágio grande, estágios menores e, em seguida, um estágio grande novamente podem sofrer regressão no runtime do trabalho. Como o EMR Sem Servidor usa os recursos com mais eficiência, isso pode levar a menos trabalhadores disponíveis para estágios maiores, ocasionando um runtime mais longo.

## Propriedades do trabalho do spark
<a name="spark-defaults"></a>

A tabela a seguir lista as propriedades opcionais do Spark e seus valores padrão que você pode substituir ao enviar um trabalho do Spark.


**Propriedades opcionais do Spark e valores padrão**  

| Chave | Description | Valor padrão  | 
| --- | --- | --- | 
| spark.archives | Uma lista separada por vírgulas de arquivos que o Spark extrai no diretório de trabalho de cada executor. Os tipos de arquivo compatíveis incluem .jar, .tar.gz, .tgz e .zip. Para especificar o nome do diretório a ser extraído, adicione \$1 após o nome do arquivo que deseja extrair. Por exemplo, .file.zip\$1directory | NULL | 
| spark.authenticate | Opção que ativa a autenticação das conexões internas do Spark. | TRUE | 
| spark.driver.cores | O número de núcleos que o driver usa. | 4 | 
| spark.driver.extraJavaOptions | Opções extras de Java para o driver do Spark. | NULL | 
| spark.driver.memory | A quantidade de memória que o driver usa. | 14G | 
| spark.dynamicAllocation.enabled | Opção que ativa a alocação dinâmica de recursos. Essa opção aumenta ou reduz a escala verticalmente do número de executores registrados na aplicação com base na workload. | TRUE | 
| spark.dynamicAllocation.executorIdleTimeout | O tempo que um executor pode permanecer inativo antes que o Spark o remova. Isso só se aplica se você ativar a alocação dinâmica. | 60 segundos | 
| spark.dynamicAllocation.initialExecutors | O número inicial de executores a serem executados se você ativar a alocação dinâmica. | 3 | 
| spark.dynamicAllocation.maxExecutors | O limite superior do número de executores se você ativar a alocação dinâmica. | Nas versões 6.10.0 e posteriores, `infinity` Na versão 6.9.0 e inferiores, `100`  | 
| spark.dynamicAllocation.minExecutors | O limite inferior do número de executores se você ativar a alocação dinâmica. | 0 | 
| spark.emr-serverless.allocation.batch.size | O número de contêineres a serem solicitados em cada ciclo de alocação do executor. Há uma lacuna de um segundo entre cada ciclo de alocação. | 20 | 
| spark.emr-serverless.driver.disk | O disco do driver do Spark. | 20G | 
| spark.emr-serverless.driverEnv.[KEY] | Opção que adiciona variáveis de ambiente ao driver do Spark. | NULL | 
| spark.emr-serverless.executor.disk | O disco do executor do Spark. | 20G | 
| spark.emr-serverless.memoryOverheadFactor | Define a sobrecarga de memória a ser adicionada à memória do contêiner do driver e do executor. | 0.1 | 
| spark.emr-serverless.driver.disk.type | O tipo de disco anexado ao driver do Spark. | Standard | 
| spark.emr-serverless.executor.disk.type | O tipo de disco anexado aos executores do Spark. | Standard | 
| spark.executor.cores | O número de núcleos que cada executor usa. | 4 | 
| spark.executor.extraJavaOptions | Opções extras de Java para o executor do Spark. | NULL | 
| spark.executor.instances | O número de contêineres do executor do Spark a serem alocados. | 3 | 
| spark.executor.memory | A quantidade de memória que cada executor usa. | 14G | 
| spark.executorEnv.[KEY] | Opção que adiciona variáveis de ambiente aos executores do Spark. | NULL | 
| spark.files | Uma lista separada por vírgulas de arquivos a serem colocados no diretório de trabalho de cada executor. Você pode acessar os caminhos desses arquivos no executor com SparkFiles.get(fileName). | NULL | 
| spark.hadoop.hive.metastore.client.factory.class | A classe de implementação da metastore do Hive. | NULL | 
| spark.jars | Mais JARs para adicionar ao classpath de runtime do driver e dos executores. | NULL | 
| spark.network.crypto.enabled | Opção que ativa a criptografia RPC baseada em AES. Isso inclui o protocolo de autenticação adicionado no Spark 2.2.0. | FALSE | 
| spark.sql.warehouse.dir | O local padrão para bancos de dados e tabelas gerenciados. | O valor de \$1PWD/spark-warehouse | 
| spark.submit.pyFiles | Uma lista separada por vírgula de arquivos .zip, .egg ou  .py para colocar no PYTHONPATH de aplicações do Python. | NULL | 

A tabela a seguir lista os parâmetros de envio padrão do Spark.


**Parâmetros padrão de envio do Spark**  

| Chave | Description | Valor padrão  | 
| --- | --- | --- | 
| archives | Uma lista separada por vírgulas de arquivos que o Spark extrai no diretório de trabalho de cada executor. | NULL | 
| class | A classe principal da aplicação (para aplicações Java e Scala). | NULL | 
| conf | Uma propriedade de configuração arbitrária do Spark. | NULL | 
| driver-cores | O número de núcleos que o driver usa. | 4 | 
| driver-memory | A quantidade de memória que o driver usa. | 14G | 
| executor-cores | O número de núcleos que cada executor usa. | 4 | 
| executor-memory | A quantidade de memória que o executor usa. | 14G | 
| files | Uma lista separada por vírgulas de arquivos a serem colocados no diretório de trabalho de cada executor. Você pode acessar os caminhos desses arquivos no executor com SparkFiles.get(fileName). | NULL | 
| jars | Uma lista separada por vírgula de JARS a serem incluídos nos classpaths do driver e do executor. | NULL | 
| num-executors | O número de executores a serem iniciados. | 3 | 
| py-files | Uma lista separada por vírgulas de arquivos .zip, .egg ou .py para colocar no PYTHONPATH de aplicações do Python. | NULL | 
| verbose | Opção que ativa a saída de depuração adicional. | NULL | 

## Praticas recomendadas de configuração de recursos
<a name="spark-configuring-driver-executor-resources"></a>

### Configurando recursos de driver e executor por meio da API StartJobRun
<a name="spark-configuring-driver-executor-resources"></a>

**nota**  
Os núcleos do driver e do executor do Spark e as propriedades de memória, se especificados, devem ser especificados diretamente na solicitação da StartJobRun API.

Configurar seus recursos dessa maneira garante que o EMR Sem Servidor possa alocar os recursos corretos antes de executar o trabalho. Isso contrasta com as configurações fornecidas no script do usuário, como no arquivo .py ou .jar, que são avaliadas tarde demais, pois os operadores do driver e do executor às vezes são pré-provisionados antes do início da execução do script. Há duas formas compatíveis de configurar esses recursos durante o envio de trabalhos:

#### Opção 1: Usar sparkSubmitParameters
<a name="-spark-option-sparksubmitparameters"></a>

```
"jobDriver": {
 "sparkSubmit": {
    "entryPoint": "s3://your-script-path.py",
    "sparkSubmitParameters": "—conf spark.driver.memory=4g \
    —conf spark.driver.cores=2 \
    —conf spark.executor.memory=8g \
    —conf spark.executor.cores=4"
  }
 }
```

#### Opção 2: usar configurationOverrides para a classificação spark-defaults
<a name="spark-option2configurationoverrides"></a>

```
"configurationOverrides": {
 "applicationConfiguration": [
 {
 "classification": "spark-defaults",
 "properties": {
     "spark.driver.memory": "4g",
     "spark.driver.cores": "2",
     "spark.executor.memory": "8g",
     "spark.executor.cores": "4"
      }
    }
  ]
 }
```

## Exemplos do Spark
<a name="spark-examples"></a>

O exemplo a seguir mostra como usar a API `StartJobRun` para executar um script do Python. Para obter um end-to-end tutorial que usa esse exemplo, consulte[Conceitos básicos do Amazon EMR Sem Servidor](getting-started.md). Você pode encontrar outros exemplos de como executar PySpark trabalhos e adicionar dependências do Python no repositório de amostras sem servidor do [EMR](https://github.com/aws-samples/emr-serverless-samples/tree/main/examples/pyspark). GitHub 

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://us-east-1.elasticmapreduce/emr-containers/samples/wordcount/scripts/wordcount.py",
            "entryPointArguments": ["s3://amzn-s3-demo-destination-bucket/wordcount_output"],
            "sparkSubmitParameters": "--conf spark.executor.cores=1 --conf spark.executor.memory=4g --conf spark.driver.cores=1 --conf spark.driver.memory=4g --conf spark.executor.instances=1"
        }
    }'
```

O exemplo a seguir mostra como usar a API `StartJobRun` para executar um JAR do Spark.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "/usr/lib/spark/examples/jars/spark-examples.jar",
            "entryPointArguments": ["1"],
            "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }'
```