Amazon Redshift é uma solução popular de armazenamento de dados em nuvem da Amazon Web Services. Este guia apresenta diferentes abordagens para migrar dados de uma instância do Redshift para o ClickHouse. Abordaremos três opções:
Da perspectiva da instância do ClickHouse, você pode:
-
enviar enviar dados para o ClickHouse usando uma ferramenta ou serviço de ETL/ELT de terceiros
-
extrair extrair dados do Redshift com a ajuda da ClickHouse JDBC Bridge
-
pivotar usar armazenamento de objetos S3 com uma lógica de “descarregar e depois carregar”
Usamos o Redshift como fonte de dados neste tutorial. No entanto, as abordagens de migração apresentadas aqui não se limitam ao Redshift, e etapas semelhantes podem ser adaptadas para qualquer fonte de dados compatível.
Enviar dados do Redshift para o ClickHouse
No cenário de envio, a ideia é usar uma ferramenta ou serviço de terceiros (seja código personalizado ou um ETL/ELT) para enviar seus dados à sua instância do ClickHouse. Por exemplo, você pode usar um software como o Airbyte para transferir dados entre sua instância do Redshift (como origem) e o ClickHouse como destino (veja nosso guia de integração do Airbyte)
- Pode aproveitar o catálogo existente de conectores do software de ETL/ELT.
- Recursos nativos para manter os dados em sincronia (lógica de append/overwrite/increment).
- Permite cenários de transformação de dados (por exemplo, consulte nosso guia de integração para dbt).
- Você precisa configurar e manter uma infraestrutura de ETL/ELT.
- Introduz um componente de terceiros na arquitetura, que pode se tornar um gargalo de escalabilidade.
No cenário de extração, a ideia é usar a ClickHouse JDBC Bridge para se conectar diretamente a um cluster do Redshift a partir de uma instância do ClickHouse e executar consultas INSERT INTO ... SELECT:
- Genérico para todas as ferramentas compatíveis com JDBC
- Solução elegante para permitir consultas a várias fontes de dados externas a partir do ClickHouse
- Requer uma instância do ClickHouse JDBC Bridge, o que pode se tornar um gargalo de escalabilidade
Embora o Redshift seja baseado em PostgreSQL, não é possível usar a table function PostgreSQL do ClickHouse nem o table engine, pois o ClickHouse exige PostgreSQL versão 9 ou superior, e a API do Redshift é baseada em uma versão anterior (8.x).
Para usar esta opção, você precisa configurar uma ClickHouse JDBC Bridge. A ClickHouse JDBC Bridge é um aplicativo Java independente que gerencia a conectividade JDBC e atua como proxy entre a instância do ClickHouse e as fontes de dados. Para este tutorial, usamos uma instância do Redshift pré-carregada com um banco de dados de exemplo.
Implante a ClickHouse JDBC Bridge
Implante a ClickHouse JDBC Bridge. Para mais detalhes, consulte nosso guia do usuário sobre JDBC para fontes de dados externasSe você estiver usando o ClickHouse Cloud, precisará executar sua ClickHouse JDBC Bridge em um ambiente separado e se conectar ao ClickHouse Cloud usando a função remoteSecure Configure sua fonte de dados do Redshift para a ClickHouse JDBC Bridge. Por exemplo, /etc/clickhouse-jdbc-bridge/config/datasources/redshift.json {
"redshift-server": {
"aliases": [
"redshift"
],
"driverUrls": [
"https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar"
],
"driverClassName": "com.amazon.redshift.jdbc.Driver",
"jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev",
"username": "awsuser",
"password": "<password>",
"maximumPoolSize": 5
}
}
Consulte sua instância do Redshift no ClickHouse
Depois que a ClickHouse JDBC Bridge estiver implantada e em execução, você poderá começar a consultar sua instância do Redshift no ClickHouseSELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5')
Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0
┌─username─┬─firstname─┬─lastname─┐
│ PGL08LJI │ Vladimir │ Humphrey │
│ XDZ38RDD │ Barry │ Roy │
│ AEB55QTM │ Reagan │ Hodge │
│ OWY35QYB │ Tamekah │ Juarez │
│ MSD36KVR │ Mufutau │ Watkins │
└──────────┴───────────┴──────────┘
5 rows in set. Elapsed: 0.438 sec.
SELECT *
FROM jdbc('redshift', 'select count(*) from sales')
Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b
┌──count─┐
│ 172456 │
└────────┘
1 rows in set. Elapsed: 0.304 sec.
Importe dados do Redshift para o ClickHouse
A seguir, mostramos como importar dados usando uma instrução INSERT INTO ... SELECT# CRIAÇÃO DA TABELA com 3 colunas
CREATE TABLE users_imported
(
`username` String,
`firstname` String,
`lastname` String
)
ENGINE = MergeTree
ORDER BY firstname
Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05
Ok.
0 rows in set. Elapsed: 0.233 sec.
INSERT INTO users_imported (*) SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users')
Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1
Ok.
0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.)
Pivotar dados do Redshift para o ClickHouse usando S3
Neste cenário, exportamos os dados para o S3 em um formato intermediário e, em uma segunda etapa, carregamos os dados do S3 no ClickHouse.
- Tanto o Redshift quanto o ClickHouse têm recursos poderosos de integração com S3.
- Aproveita recursos já existentes, como o comando
UNLOAD do Redshift e a função de tabela S3 / table engine do ClickHouse.
- Escala com facilidade graças às leituras paralelas e ao alto throughput de/para o S3 no ClickHouse.
- Pode aproveitar formatos avançados e compactados, como o Apache Parquet.
- Duas etapas no processo (exportar do Redshift e depois carregar no ClickHouse).
Exporte os dados para um bucket do S3 usando UNLOAD
Usando o recurso UNLOAD do Redshift, exporte os dados para um bucket privado existente do S3:Isso gerará arquivos de partes contendo os dados brutos no S3.Crie a tabela no ClickHouse
Crie a tabela no ClickHouse:CREATE TABLE users
(
username String,
firstname String,
lastname String
)
ENGINE = MergeTree
ORDER BY username
Como alternativa, o ClickHouse pode tentar inferir a estrutura da tabela usando CREATE TABLE ... EMPTY AS SELECT:CREATE TABLE users
ENGINE = MergeTree ORDER BY username
EMPTY AS
SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
Isso funciona especialmente bem quando os dados estão em um formato que contém informações sobre tipos de dados, como Parquet.Carregue os arquivos do S3 no ClickHouse
Carregue os arquivos do S3 no ClickHouse usando uma instrução INSERT INTO ... SELECT:INSERT INTO users SELECT *
FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557
Ok.
0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.)
Este exemplo usou CSV como formato de pivot. No entanto, para cargas de trabalho de produção, recomendamos Apache Parquet como a melhor opção para grandes migrações, já que ele oferece compressão e pode reduzir custos de armazenamento, além de diminuir os tempos de transferência. (Por padrão, cada row group é comprimido com SNAPPY.) O ClickHouse também aproveita a organização colunar do Parquet para acelerar a ingestão de dados.