Spark Migration: framework concorrente para migracao de dados PostgreSQL com Apache Spark.
Project description
Spark Migration
Um framework concorrente para migração de dados PostgreSQL com Apache Spark
Descubra tabelas, execute tarefas concorrentes e transfira dados via JDBC usando uma única sessão Spark compartilhada.
Visão geral
Spark Migration é um framework Python para copiar dados entre bancos PostgreSQL. Ele combina SQLAlchemy para inspecionar o banco de origem, Apache Spark para transferir os dados via JDBC e um conjunto controlado de threads para processar as tabelas concorrentemente.
A API pública foi projetada para ser simples:
Migration(data=origem, new_data=destino).run()
Recursos
- Descoberta automática das tabelas do banco de origem.
- Leitura e escrita via JDBC com Apache Spark.
- Execução concorrente de até quatro tabelas.
- Uma única sessão Spark compartilhada entre todas as tarefas.
- Até três tentativas para falhas temporárias de leitura.
- Propagação de erros das tarefas para a thread principal.
- Driver JDBC do PostgreSQL incluído no pacote.
- Logs estruturados em inglês.
Como funciona
flowchart LR
A["PostgreSQL de origem"] -->|"Descobre tabelas"| B["SQLAlchemy"]
B --> C["Serviço Spark Migration"]
C -->|"Uma tarefa por tabela"| D["Pool de threads"]
D --> E["Sessão Spark compartilhada"]
E -->|"Leitura JDBC"| A
E -->|"Escrita JDBC em append"| F["PostgreSQL de destino"]
D -->|"Resultado ou erro"| C
Migrationformata as configurações de conexão da origem e do destino.- O SQLAlchemy conecta-se à origem e descobre suas tabelas.
- O serviço cria uma tarefa para cada tabela encontrada.
- Cada tarefa lê sua tabela em um DataFrame Spark via JDBC.
- O Spark adiciona o DataFrame à tabela correspondente no destino.
- A thread principal aguarda os resultados e interrompe a execução quando uma tarefa falha.
Requisitos
- Python 3.10 ou superior.
- Java 17 disponível no
PATH. - Bancos PostgreSQL de origem e destino.
- Acesso de rede aos dois bancos.
- Permissão de leitura nas tabelas de origem.
- Permissões de criação e inserção no destino.
Instalação
Instale o Spark Migration e suas dependências diretamente pelo PyPI:
pip install spark_migration
Após a instalação, o framework é importado como Migration.
Uso rápido
Mantenha as credenciais fora do código-fonte. Este exemplo utiliza variáveis de ambiente:
import os
from Migration import Migration
origem = {
"host": os.environ["SOURCE_DB_HOST"],
"port": int(os.getenv("SOURCE_DB_PORT", "5432")),
"dbname": os.environ["SOURCE_DB_NAME"],
"user": os.environ["SOURCE_DB_USER"],
"password": os.environ["SOURCE_DB_PASSWORD"],
}
destino = {
"host": os.environ["DESTINATION_DB_HOST"],
"port": int(os.getenv("DESTINATION_DB_PORT", "5432")),
"dbname": os.environ["DESTINATION_DB_NAME"],
"user": os.environ["DESTINATION_DB_USER"],
"password": os.environ["DESTINATION_DB_PASSWORD"],
}
Migration(data=origem, new_data=destino).run()
Execute o arquivo normalmente:
python spark_migration.py
Exemplo de saída:
INFO | Starting Spark session...
INFO | Spark session started.
INFO | Connecting to database postgres...
INFO | Discovered 1 table(s): orders
INFO | Starting database migration...
INFO | Reading table orders (attempt 1/3)
INFO | Table orders written successfully.
INFO | Database migration completed successfully.
Configuração da conexão
Os parâmetros data e new_data recebem os mesmos campos:
| Campo | Tipo | Descrição |
|---|---|---|
host |
str |
Endereço ou IP do servidor PostgreSQL |
port |
int |
Porta do PostgreSQL, normalmente 5432 |
dbname |
str |
Nome do banco de dados |
user |
str |
Usuário do banco |
password |
str |
Senha do banco |
Comportamento da escrita
A versão atual utiliza o modo append do Spark.
- Se a tabela não existir no destino, o Spark a criará com base no DataFrame.
- Se a tabela já existir, os novos registros serão adicionados.
- Executar a mesma migração mais de uma vez pode duplicar os dados.
- Uma falha durante a escrita pode deixar dados parciais no destino.
Utilize um destino limpo para migrações completas e compare a quantidade de registros na origem e no destino antes de repetir uma execução.
Escopo e limitações atuais
O framework atualmente migra os registros das tabelas. Ele ainda não reproduz todos os objetos e configurações do PostgreSQL, incluindo:
- chaves primárias e estrangeiras;
- índices e restrições únicas;
- sequências e seus valores atuais;
- views e materialized views;
- triggers e funções armazenadas;
- usuários, permissões e políticas de segurança em nível de linha;
- extensões e configurações do banco.
Em migrações de produção, recrie e valide esses objetos separadamente.
Observações para Windows
O Spark pode informar que winutils.exe, HADOOP_HOME ou a biblioteca nativa do Hadoop não estão disponíveis. O framework carrega diretamente o driver JDBC incluído no pacote, portanto esses avisos não impedem o fluxo suportado de migração PostgreSQL.
Se o Spark não iniciar, confirme se o Java 17 está instalado:
java -version
Solução de problemas
Connection reset
O banco ou o gerenciador de conexões encerrou a conexão JDBC. O framework repete automaticamente a leitura até três vezes. Se o problema continuar, verifique o estado do banco, a estabilidade da rede, os requisitos de SSL e os limites do pool de conexões.
Migration failed
A thread principal recebeu uma exceção de uma tarefa. Procure o primeiro erro de banco ou Spark exibido antes dessa mensagem; normalmente ele contém a causa real.
Porta da interface Spark ocupada
O Spark pode selecionar outra porta quando a porta local 4040 já estiver em uso. Isso é apenas informativo e normalmente não impede a migração.
Segurança
- Nunca inclua senhas de banco ou tokens do PyPI no repositório.
- Prefira variáveis de ambiente ou um gerenciador de segredos.
- Utilize usuários de banco dedicados e com as menores permissões necessárias.
- Troque credenciais que já tenham sido publicadas ou compartilhadas.
Status do projeto
Spark Migration está em fase Beta. A migração de registros entre bancos PostgreSQL está funcional. Modos de escrita idempotentes, migração completa do esquema, validação automática e suporte a outros bancos ainda estão em desenvolvimento.
Roadmap
- Modos configuráveis
append,overwritee falha se a tabela existir. - Validação por quantidade de registros e checksum.
- Migração de esquema, restrições, índices e sequências.
- Filtros para incluir ou excluir tabelas.
- Configuração de concorrência e tentativas.
- Testes automatizados e integração contínua.
- Suporte a outros bancos compatíveis com JDBC.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spark_migration-0.1.0.tar.gz.
File metadata
- Download URL: spark_migration-0.1.0.tar.gz
- Upload date:
- Size: 1.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
799cca393f8076082b3b4cce7ea951947f1fc4d384e7731e925bffeac83f9555
|
|
| MD5 |
c31e0b9822bbde79ab9a0d8d52fcfed0
|
|
| BLAKE2b-256 |
68d024f01ef43ff361776f6f63eae9e3ad42fe773ca316982953835526abcded
|
File details
Details for the file spark_migration-0.1.0-py3-none-any.whl.
File metadata
- Download URL: spark_migration-0.1.0-py3-none-any.whl
- Upload date:
- Size: 1.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2bbdb8aac8ef03ccbc1bc60554f8e3d66d713eb4b70e65d89f8b9f9339cf9087
|
|
| MD5 |
c4943e02e661389c25b137d29b7530fb
|
|
| BLAKE2b-256 |
0c74b8eac48980d26f8887ce53936150a64ad81061e936bbd4b76293eb384b36
|