

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 da integração do Amazon Redshift para Apache Spark no Amazon EMR Sem Servidor
<a name="emr-spark-redshift"></a>

Com as versões 6.9.0 e posteriores do Amazon EMR, cada imagem de versão inclui um conector entre o [Apache Spark](https://aws.amazon.com/emr/features/spark/) e o Amazon Redshift. Com esse conector, use o Spark no Amazon EMR Sem Servidor para processar dados armazenados no Amazon Redshift. A integração é baseada no [conector de código aberto `spark-redshift`](https://github.com/spark-redshift-community/spark-redshift#readme). No Amazon EMR Sem Servidor, a [integração do Amazon Redshift para Apache Spark](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) está incluída como uma integração nativa.

**Topics**
+ [Inicialização de uma aplicação do Spark com a integração do Amazon Redshift para Apache Spark](emr-spark-redshift-launch.md)
+ [Autenticação com a integração do Amazon Redshift para Apache Spark](emr-spark-redshift-auth.md)
+ [Leitura e gravação de e para o Amazon Redshift](emr-spark-redshift-readwrite.md)
+ [Considerações e limitações ao usar o conector do Spark](emr-spark-redshift-considerations.md)

# Inicialização de uma aplicação do Spark com a integração do Amazon Redshift para Apache Spark
<a name="emr-spark-redshift-launch"></a>

Para usar a integração com o EMR Sem Servidor 6.9.0, passe as dependências necessárias do Redshift para Spark com o trabalho do Spark. Use `--jars` para incluir as bibliotecas relacionadas ao conector do Redshift. Para acessar outros locais de arquivo com suporte pela opção `--jars`, consulte a seção [Gerenciamento avançado de dependências](https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management) na documentação do Apache Spark. 
+ `spark-redshift.jar`
+ `spark-avro.jar`
+ `RedshiftJDBC.jar`
+ `minimal-json.jar`

As versões 6.10.0 e superiores do Amazon EMR não exigem a dependência `minimal-json.jar` e, por padrão, instalam automaticamente as outras dependências em cada cluster. Os exemplos a seguir demonstram como iniciar uma aplicação do Spark com a integração do Amazon Redshift para Apache Spark.

------
#### [ Amazon EMR 6.10.0 \$1 ]

Inicie um trabalho do Spark no Amazon EMR Sem Servidor com a integração do Amazon Redshift para Apache Spark na versão 6.10.0 e posteriores do Amazon EMR Sem Servidor.

```
spark-submit my_script.py
```

------
#### [ Amazon EMR 6.9.0 ]

Para executar um trabalho do Spark no Amazon EMR Sem Servidor com a integração do Amazon Redshift para Apache Spark no EMR Sem Servidor versão 6.9.0, use a opção `--jars` como mostrado no exemplo a seguir. Observe que os caminhos listados com a opção `--jars` são os caminhos padrão para os arquivos JAR.

```
--jars 
    /usr/share/aws/redshift/jdbc/RedshiftJDBC.jar,
    /usr/share/aws/redshift/spark-redshift/lib/spark-redshift.jar,
    /usr/share/aws/redshift/spark-redshift/lib/spark-avro.jar,
    /usr/share/aws/redshift/spark-redshift/lib/minimal-json.jar
```

```
spark-submit \
  --jars /usr/share/aws/redshift/jdbc/RedshiftJDBC.jar,/usr/share/aws/redshift/spark-redshift/lib/spark-redshift.jar,/usr/share/aws/redshift/spark-redshift/lib/spark-avro.jar,/usr/share/aws/redshift/spark-redshift/lib/minimal-json.jar \
  my_script.py
```

------

# Autenticação com a integração do Amazon Redshift para Apache Spark
<a name="emr-spark-redshift-auth"></a>

## Use AWS Secrets Manager para recuperar credenciais e conectar-se ao Amazon Redshift
<a name="emr-spark-redshift-secrets"></a>

Você pode se autenticar com segurança no Amazon Redshift armazenando as credenciais no Secrets Manager e fazer com que o trabalho do Spark chame a API `GetSecretValue` para buscá-la:

```
from pyspark.sql import SQLContextimport boto3

sc = # existing SparkContext
sql_context = SQLContext(sc)

secretsmanager_client = boto3.client('secretsmanager', region_name=os.getenv('AWS_REGION'))
secret_manager_response = secretsmanager_client.get_secret_value(
    SecretId='string',
    VersionId='string',
    VersionStage='string'
)
username = # get username from secret_manager_response
password = # get password from secret_manager_response
url = "jdbc:redshift://redshifthost:5439/database?user=" + username + "&password=" + password

# Access to Redshift cluster using Spark
```

## Autenticação no Amazon Redshift com um driver JDBC
<a name="emr-spark-redshift-jdbc"></a>

**Definição de um nome de usuário e de uma senha no URL do JDBC**

Você pode autenticar um trabalho do Spark em um cluster do Amazon Redshift especificando o nome e a senha do banco de dados do Amazon Redshift no URL do JDBC.

**nota**  
Se você transferir as credenciais do banco de dados no URL, qualquer pessoa que tenha acesso ao URL também poderá acessar as credenciais. Este método geralmente não é recomendado porque não é uma opção segura.

Se a segurança não for uma preocupação para sua aplicação, use o seguinte formato para definir o nome de usuário e a senha no URL do JDBC:

```
jdbc:redshift://redshifthost:5439/database?user=username&password=password
```

## Uso da autenticação baseada no IAM com o perfil de execução de trabalho do Amazon EMR Sem Servidor
<a name="emr-spark-redshift-iam"></a>

A partir da versão 6.9.0 do Amazon EMR Sem Servidor, a versão 2.1 ou superior do driver JDBC do Amazon Redshift é empacotada no ambiente. Com a versão 2.1 e versões superiores do driver JDBC, é possível especificar o URL do JDBC e não incluir o nome de usuário e a senha brutos. 

Em vez disso, especifique o esquema `jdbc:redshift:iam://`. Isso comanda o driver JDBC para usar o perfil de execução de trabalho do EMR Sem Servidor para buscar as credenciais automaticamente. Consulte [Configurar uma conexão JDBC ou ODBC para usar credenciais do IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html) no *Guia de gerenciamento do Amazon Redshift* para obter mais informações. Um exemplo desse URL é:

```
jdbc:redshift:iam://examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev
```

As seguintes permissões são obrigatórias para o perfil de execução do trabalho quando ele atende às condições fornecidas:


| Permissão | Condições para se tornar obrigatória para o perfil de execução de trabalho | 
| --- | --- | 
|  redshift:GetClusterCredentials  | Obrigatória para que o driver JDBC busque as credenciais do Amazon Redshift. | 
|  redshift:DescribeCluster  | Obrigatória se você especificar o cluster do Amazon Redshift e a Região da AWS no URL do JDBC em vez do endpoint. | 
|  redshift-serverless:GetCredentials  | Obrigatória para que o driver JDBC busque as credenciais do Amazon Redshift sem servidor. | 
|  redshift-serverless:GetWorkgroup  | Obrigatória se você estiver usando o Amazon Redshift sem servidor e especificando o URL em termos de nome e de região do grupo de trabalho | 

## Como se conectar ao Amazon Redshift em uma VPC diferente
<a name="emr-spark-redshift-vpc"></a>

Ao definir um cluster provisionado do Amazon Redshift ou um grupo de trabalho do Amazon Redshift Sem Servidor em uma VPC, configure a conectividade da VPC para que a aplicação do Amazon EMR Sem Servidor acesse os recursos. Para obter mais informações sobre como configurar a conectividade da VPC em uma aplicação do EMR Sem Servidor, consulte [Configuração do acesso à VPC para que aplicações do EMR Sem Servidor se conectem aos dados](vpc-access.md).
+ Se o cluster provisionado do Amazon Redshift ou o grupo de trabalho do Amazon Redshift Sem Servidor estiver acessível publicamente, você poderá especificar uma ou mais sub-redes privadas que tenham um gateway NAT anexado ao criar aplicações do EMR Sem Servidor.
+ Se o cluster provisionado do Amazon Redshift ou o grupo de trabalho do Amazon Redshift Sem Servidor não estiver acessível publicamente, você deverá criar um endpoint da VPC gerenciado pelo Amazon Redshift para o cluster do Amazon Redshift, conforme descrito em [Configuração do acesso à VPC para que aplicações do EMR Sem Servidor se conectem aos dados](vpc-access.md). Como alternativa, você pode criar o grupo de trabalho do Amazon Redshift Sem Servidor conforme descrito em [Conectar-se ao Amazon Redshift Serverless](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-connecting.html) no *Guia de gerenciamento do Amazon Redshift*. É necessário associar o cluster ou subgrupo às sub-redes privadas que você especifica ao criar a aplicação do EMR Sem Servidor.

**nota**  
Se você usa autenticação baseada no IAM e suas sub-redes privadas na aplicação do EMR Sem Servidor não têm um gateway NAT anexado, também é necessário criar um endpoint da VPC nessas sub-redes para o Amazon Redshift ou o Amazon Redshift Sem Servidor. Dessa forma, o driver JDBC pode buscar as credenciais.

# Leitura e gravação de e para o Amazon Redshift
<a name="emr-spark-redshift-readwrite"></a>

Os exemplos de código a seguir são usados PySpark para ler e gravar dados de amostra de e para um banco de dados do Amazon Redshift com uma API de fonte de dados e com o SparkSQL.

------
#### [ Data source API ]

Use PySpark para ler e gravar dados de amostra de e para um banco de dados do Amazon Redshift com a API de fonte de dados.

```
import boto3
from pyspark.sql import SQLContext

sc = # existing SparkContext
sql_context = SQLContext(sc)

url = "jdbc:redshift:iam://redshifthost:5439/database"
aws_iam_role_arn = "arn:aws:iam::account-id:role/role-name"

df = sql_context.read \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "table-name") \
    .option("tempdir", "s3://path/for/temp/data") \
    .option("aws_iam_role", "aws-iam-role-arn") \
    .load()

df.write \
    .format("io.github.spark_redshift_community.spark.redshift") \
    .option("url", url) \
    .option("dbtable", "table-name-copy") \
    .option("tempdir", "s3://path/for/temp/data") \
    .option("aws_iam_role", "aws-iam-role-arn") \
    .mode("error") \
    .save()
```

------
#### [ SparkSQL ]

Use PySpark para ler e gravar dados de amostra de e para um banco de dados do Amazon Redshift com o SparkSQL.

```
import boto3
import json
import sys
import os
from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .enableHiveSupport() \
    .getOrCreate()
    
url = "jdbc:redshift:iam://redshifthost:5439/database"
aws_iam_role_arn = "arn:aws:iam::account-id:role/role-name"
    
bucket = "s3://path/for/temp/data"
tableName = "table-name" # Redshift table name

s = f"""CREATE TABLE IF NOT EXISTS {table-name} (country string, data string) 
    USING io.github.spark_redshift_community.spark.redshift 
    OPTIONS (dbtable '{table-name}', tempdir '{bucket}', url '{url}', aws_iam_role '{aws-iam-role-arn}' ); """

spark.sql(s)
         
columns = ["country" ,"data"]
data = [("test-country","test-data")]
df = spark.sparkContext.parallelize(data).toDF(columns)

# Insert data into table
df.write.insertInto(table-name, overwrite=False)
df = spark.sql(f"SELECT * FROM {table-name}")
df.show()
```

------

# Considerações e limitações ao usar o conector do Spark
<a name="emr-spark-redshift-considerations"></a>
+ Sugerimos que você ative o SSL para a conexão JDBC do Spark no Amazon EMR ao Amazon Redshift.
+ Sugerimos que você gerencie as credenciais do cluster do Amazon Redshift no AWS Secrets Manager como uma prática recomendada. Consulte [Usando AWS Secrets Manager para recuperar credenciais para se conectar ao Amazon Redshift para ver](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration.html) um exemplo.
+ Sugerimos que você transmita um perfil do IAM com o parâmetro `aws_iam_role` para o parâmetro de autenticação do Amazon Redshift.
+ No momento, o parâmetro `tempformat` não é compatível com o formato Parquet.
+ O URI `tempdir` aponta para um local do Amazon S3. Esse diretório temporário não é limpo automaticamente e, portanto, pode incorrer em custos adicionais. 
+ Considere as seguintes recomendações para o Amazon Redshift:
  + Sugerimos bloquear o acesso público ao cluster do Amazon Redshift.
  + Sugerimos ativar o [registro em log de auditoria do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/db-auditing.html).
  + Sugerimos que você ative a [Criptografia em repouso do Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/mgmt/security-server-side-encryption.html).
+ Considere as seguintes recomendações para o Amazon S3:
  + Sugerimos que você [bloqueie o acesso público aos buckets do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html).
  + Sugerimos que você use [criptografia no lado do servidor do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html) para criptografar os buckets do Amazon S3 usados.
  + Sugerimos que você use as [políticas de ciclo de vida do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) para definir as regras de retenção para o bucket do Amazon S3.
  + O Amazon EMR sempre verifica o código importado do código aberto para a imagem. Por motivos de segurança, não oferecemos suporte aos seguintes métodos de autenticação do Spark para o Amazon S3:
    + Definindo chaves de AWS acesso na classificação `hadoop-env` de configuração
    + Codificação de chaves de AWS acesso no URI `tempdir`

Para obter mais informações sobre como usar o conector e os parâmetros compatíveis, consulte os seguintes recursos:
+ [Integração do Amazon Redshift para Apache Spark](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html) no *Guia de gerenciamento do Amazon Redshift*.
+ O [repositório da comunidade `spark-redshift`](https://github.com/spark-redshift-community/spark-redshift#readme) no GitHub.