Cloud & Infraestrutura

Dominando Redshift e Athena: Data Warehouse e Query Serverless em S3 em Projetos Reais

8 min de leitura

Dominando Redshift e Athena: Data Warehouse e Query Serverless em S3 em Projetos Reais

Entendendo Redshift e Athena: Duas Abordagens para Data Warehouse Redshift e Athena são soluções complementares da AWS para análise de dados em escala. Redshift é um data warehouse tradicional baseado em clusters com armazenamento próprio, otimizado para queries complexas e alta concorrência. Athena, por sua vez, é uma solução serverless que consulta dados diretamente no S3 sem infraestrutura dedicada, pagando apenas pelas queries executadas. A escolha entre elas depende do padrão de uso: Redshift brilha em análises contínuas com milhares de queries diárias, enquanto Athena é ideal para consultas ad-hoc, exploração de dados ou quando você não quer gerenciar clusters. Em projetos reais, muitas empresas usam ambas complementarmente — Athena para exploração inicial e Redshift para operações críticas. Configurando Athena: Query Serverless no S3 Estrutura de Dados e Particionamento Antes de rodar a primeira query, organize seus dados no S3 com uma estrutura apropriada. Particionamento é essencial: dados organizados como permitem que Athena pule partições inteiras, reduzindo custos drasticamente. Criando

<h2>Entendendo Redshift e Athena: Duas Abordagens para Data Warehouse</h2>

<p>Redshift e Athena são soluções complementares da AWS para análise de dados em escala. Redshift é um data warehouse tradicional baseado em clusters com armazenamento próprio, otimizado para queries complexas e alta concorrência. Athena, por sua vez, é uma solução serverless que consulta dados diretamente no S3 sem infraestrutura dedicada, pagando apenas pelas queries executadas.</p>

<p>A escolha entre elas depende do padrão de uso: Redshift brilha em análises contínuas com milhares de queries diárias, enquanto Athena é ideal para consultas ad-hoc, exploração de dados ou quando você não quer gerenciar clusters. Em projetos reais, muitas empresas usam ambas complementarmente — Athena para exploração inicial e Redshift para operações críticas.</p>

<h2>Configurando Athena: Query Serverless no S3</h2>

<h3>Estrutura de Dados e Particionamento</h3>

<p>Antes de rodar a primeira query, organize seus dados no S3 com uma estrutura apropriada. Particionamento é essencial: dados organizados como <code>s3://seu-bucket/dados/ano=2024/mês=01/arquivo.parquet</code> permitem que Athena pule partições inteiras, reduzindo custos drasticamente.</p>

<pre><code class="language-python">import boto3

import pandas as pd

from datetime import datetime

s3 = boto3.client(&#039;s3&#039;)

athena = boto3.client(&#039;athena&#039;)

Salvar dados particionados no S3

df = pd.read_csv(&#039;vendas.csv&#039;)

df[&#039;ano&#039;] = df[&#039;data&#039;].dt.year

df[&#039;mes&#039;] = df[&#039;data&#039;].dt.month

for (ano, mes), grupo in df.groupby([&#039;ano&#039;, &#039;mes&#039;]):

caminho = f&quot;s3://meu-bucket/vendas/ano={ano}/mes={mes:02d}/dados.parquet&quot;

grupo.to_parquet(caminho)</code></pre>

<h3>Criando Tabelas e Executando Queries</h3>

<p>Athena usa Apache Trino (antigo Presto) para SQL. Crie uma tabela external apontando para seus dados no S3 e comece a consultar imediatamente.</p>

<pre><code class="language-sql">CREATE EXTERNAL TABLE IF NOT EXISTS vendas (

id STRING,

cliente STRING,

valor DECIMAL(10,2),

data STRING

)

PARTITIONED BY (ano INT, mes INT)

STORED AS PARQUET

LOCATION &#039;s3://meu-bucket/vendas/&#039;

TBLPROPERTIES (&#039;parquet.compression&#039;=&#039;SNAPPY&#039;);

-- Executar query

SELECT cliente, SUM(valor) as total

FROM vendas

WHERE ano = 2024 AND mes = 1

GROUP BY cliente

ORDER BY total DESC;</code></pre>

<pre><code class="language-python"># Executar query via boto3

response = athena.start_query_execution(

QueryString=&quot;SELECT COUNT(*) FROM vendas WHERE ano=2024&quot;,

QueryExecutionContext={&#039;Database&#039;: &#039;default&#039;},

ResultConfiguration={&#039;OutputLocation&#039;: &#039;s3://meu-bucket/resultados/&#039;},

WorkGroup=&#039;primary&#039;

)

query_id = response[&#039;QueryExecutionId&#039;]

Aguardar resultado

while True:

result = athena.get_query_execution(QueryExecutionId=query_id)

if result[&#039;QueryExecution&#039;][&#039;Status&#039;][&#039;State&#039;] != &#039;RUNNING&#039;:

break</code></pre>

<h2>Implementando Redshift para Análises em Escala</h2>

<h3>Arquitetura e Schema Design</h3>

<p>Redshift usa compressão colunar e é otimizado para OLAP (Online Analytical Processing). Crie distribuição de dados baseada em suas queries mais frequentes — escolha uma coluna com alta cardinalidade como distribution key para evitar skew.</p>

<pre><code class="language-sql">-- Criar tabela com distribuição e sort key

CREATE TABLE vendas (

id BIGINT NOT NULL,

cliente_id INT NOT NULL,

valor DECIMAL(12,2),

data DATE NOT NULL

)

DISTKEY (cliente_id)

SORTKEY (data);

-- Criar índice para melhor performance

CREATE INDEX idx_vendas_data ON vendas(data);</code></pre>

<p>Redshift também suporta Spectrum, que consulta dados diretamente do S3 quando necessário, complementando o armazenamento local do cluster.</p>

<h3>ETL Eficiente com COPY e Unload</h3>

<p>Carregue dados em massa com o comando COPY (muito mais rápido que INSERT) e exporte com UNLOAD para S3 em paralelo.</p>

<pre><code class="language-sql">-- Carregar dados do S3 para Redshift

COPY vendas

FROM &#039;s3://meu-bucket/dados/vendas_2024.parquet&#039;

IAM_ROLE &#039;arn:aws:iam::ACCOUNT:role/RedshiftRole&#039;

FORMAT PARQUET;

-- Unload (exportar) resultados para S3

UNLOAD (

SELECT cliente, SUM(valor) as total

FROM vendas

WHERE ano = 2024

GROUP BY cliente

)

TO &#039;s3://meu-bucket/resultados/relatorio_2024/&#039;

IAM_ROLE &#039;arn:aws:iam::ACCOUNT:role/RedshiftRole&#039;

FORMAT PARQUET;</code></pre>

<pre><code class="language-python"># Conectar e executar queries em Redshift

import psycopg2

conn = psycopg2.connect(

host=&#039;seu-cluster.redshift.amazonaws.com&#039;,

port=5439,

database=&#039;analytics&#039;,

user=&#039;admin&#039;,

password=&#039;sua_senha&#039;

)

cursor = conn.cursor()

cursor.execute(&quot;SELECT COUNT(*) FROM vendas;&quot;)

resultado = cursor.fetchone()

print(f&quot;Total de registros: {resultado[0]}&quot;)

conn.close()</code></pre>

<h2>Integrando Athena e Redshift em Pipelines Reais</h2>

<h3>Padrão de Arquitetura Híbrida</h3>

<p>Em um pipeline típico: Athena explora dados brutos no S3, identifica padrões, então carrega dados limpos no Redshift para análises operacionais. Use Glue Crawlers para manter o Athena Catalog sincronizado automaticamente com novos arquivos.</p>

<pre><code class="language-python">import boto3

from awsglue.transforms import *

from awsglue.dynamicframe import DynamicFrame

glue = boto3.client(&#039;glue&#039;)

Iniciar crawler para descobrir novos dados

glue.start_crawler(Name=&#039;crawler-vendas&#039;)

Usar script Glue para ETL

glue_context = GlueContext(SparkContext.getOrCreate())

datasource = glue_context.create_dynamic_frame.from_catalog(

database=&#039;vendas_db&#039;,

table_name=&#039;vendas_raw&#039;

)

Filtrar e transformar

filtrado = Filter.apply(

frame=datasource,

f=lambda x: x[&#039;valor&#039;] &gt; 100

)

Carregar em Redshift

glue_context.write_dynamic_frame.from_jdbc_conf(

frame=filtrado,

catalog_connection=&#039;redshift-connection&#039;,

connection_options={&#039;dbtable&#039;: &#039;vendas_processadas&#039;, &#039;database&#039;: &#039;analytics&#039;}

)</code></pre>

<h3>Monitoramento e Otimização de Custos</h3>

<p>Athena cobra por terabyte de dados escaneados — otimize usando partições, colunas específicas e formatos comprimidos (Parquet &gt; CSV). Redshift cobra por hora de cluster — dimensione clusters adequadamente e use reserved instances para descontos.</p>

<pre><code class="language-python"># Verificar custos de queries Athena

response = athena.list_query_executions()

total_bytes = 0

for query_id in response[&#039;QueryExecutionIds&#039;][:100]:

stats = athena.get_query_execution(QueryExecutionId=query_id)

bytes_scanned = stats[&#039;QueryExecution&#039;][&#039;Statistics&#039;][&#039;DataScannedInBytes&#039;]

total_bytes += bytes_scanned

custo_estimado = (total_bytes / 1e12) * 5 # $5 por TB

print(f&quot;Custo estimado das últimas 100 queries: ${custo_estimado:.2f}&quot;)</code></pre>

<h2>Conclusão</h2>

<p><strong>Primeiro aprendizado:</strong> Redshift e Athena não competem, mas complementam-se. Use Athena para exploração rápida e sem infraestrutura, Redshift para cargas analíticas pesadas com concorrência. <strong>Segundo:</strong> Estruture dados com particionamento inteligente no S3 — isso reduz custos exponencialmente em Athena. <strong>Terceiro:</strong> Implemente monitoramento de custos desde o início; otimizações pequenas em queries e retenção de dados têm impacto financeiro significativo em escala.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/athena/" target="_blank" rel="noopener noreferrer">AWS Athena Documentation</a></li>

<li><a href="https://docs.aws.amazon.com/redshift/latest/dg/welcome.html" target="_blank" rel="noopener noreferrer">Amazon Redshift Architecture Guide</a></li>

<li><a href="https://docs.aws.amazon.com/glue/latest/dg/best-practices.html" target="_blank" rel="noopener noreferrer">AWS Glue ETL Best Practices</a></li>

<li><a href="https://parquet.apache.org/docs/" target="_blank" rel="noopener noreferrer">Parquet Format Specification</a></li>

<li><a href="https://www.oreilly.com/library/view/fundamentals-of-data/9781098108298/" target="_blank" rel="noopener noreferrer">Fundamentals of Data Engineering - O&#039;Reilly</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

O que Todo Dev Deve Saber sobre AWS MSK: Kafka Gerenciado na AWS para Streaming de Alta Escala
O que Todo Dev Deve Saber sobre AWS MSK: Kafka Gerenciado na AWS para Streaming de Alta Escala

O que é AWS MSK e por que você precisa conhecer AWS Managed Streaming for Apa...

O que Todo Dev Deve Saber sobre SNS: Fan-out Pattern, Filtros e Integração com SQS e Lambda
O que Todo Dev Deve Saber sobre SNS: Fan-out Pattern, Filtros e Integração com SQS e Lambda

O que é SNS e Por Que Importa Amazon Simple Notification Service (SNS) é um s...

Dominando FinOps Avançado na AWS: Reserved Instances, Savings Plans e Spot em Projetos Reais
Dominando FinOps Avançado na AWS: Reserved Instances, Savings Plans e Spot em Projetos Reais

Entendendo os Modelos de Preços na AWS A otimização de custos na AWS vai muit...