O adaptador dbt-clickhouse
Recursos suportados
- Materialização de tabela
- Materialização de view
- Materialização incremental
- Materialização incremental do tipo Microbatch
- Materializações de visão materializada (usa a forma
TOde MATERIALIZED VIEW, experimental) - Seeds
- Sources
- Geração de documentação
- Testes
- Snapshots
- A maioria das macros do dbt-utils (agora incluídas no dbt-core)
- Materialização efêmera
- Materialização de tabela distribuída (experimental)
- Materialização incremental distribuída (experimental)
- Materialização de dicionário (experimental)
- Contratos
- Configurações de coluna específicas do ClickHouse (Codec, TTL…)
- Configurações de tabela específicas do ClickHouse (índices, projeções…)
--sample, e todos os avisos de descontinuação já foram corrigidos para versões futuras. Integrações de catálogo (por exemplo, Iceberg), introduzidas no dbt 1.10, ainda não têm suporte nativo no adaptador, mas há soluções alternativas disponíveis. Consulte a seção Suporte a catálogo para mais detalhes.
Este adaptador ainda não está disponível para uso no dbt Cloud, mas esperamos disponibilizá-lo em breve. Entre em contato com o suporte para obter mais informações.
conceitos do dbt e materializações compatíveis
select do modelo. O código por trás de uma materialização é um SQL boilerplate que envolve sua consulta SELECT em uma instrução para criar uma nova relação ou atualizar uma relação existente.
O dbt fornece 5 tipos de materialização. Todos eles são compatíveis com dbt-clickhouse:
- view (padrão): O modelo é construído como uma view no banco de dados. No ClickHouse, isso é criado como uma view.
- table: O modelo é construído como uma tabela no banco de dados. No ClickHouse, isso é criado como uma table.
- ephemeral: O modelo não é construído diretamente no banco de dados, mas é incorporado aos modelos dependentes como CTEs (expressões de tabela comuns).
- incremental: O modelo é inicialmente materializado como uma tabela e, em execuções subsequentes, o dbt insere novas linhas e atualiza as linhas alteradas na tabela.
- materialized view: O modelo é construído como uma visão materializada no banco de dados. No ClickHouse, isso é criado como uma materialized view.
dbt-clickhouse:
Configuração do dbt e do adaptador do ClickHouse
Instale o dbt-core e o dbt-clickhouse
pip para instalar tanto o dbt quanto o dbt-clickhouse.
Forneça ao dbt os detalhes da conexão da nossa instância do ClickHouse.
clickhouse-service no arquivo ~/.dbt/profiles.yml e informe as propriedades schema, host, port, user e password. A lista completa de opções de configuração da conexão está disponível na página Recursos e configurações:
Criar um projeto dbt
project_name, atualize o arquivo dbt_project.yml para especificar um nome de perfil para se conectar ao servidor ClickHouse.
Testar a conexão
dbt debug na CLI para confirmar se o dbt consegue se conectar ao ClickHouse. Verifique se a resposta inclui Connection test: [OK connection ok], indicando que a conexão foi bem-sucedida.
Acesse a página de guias para saber mais sobre como usar o dbt com o ClickHouse.
Testando e implantando seus modelos (CI/CD)
CI/CD com testes de dados simples e testes unitários
dbt build no seu cluster de produção do ClickHouse.
Estágio de CI/CD mais completo: use dados recentes e teste apenas os modelos afetados
dbt clone copia tabelas MergeTree usando uma instrução CLONE zero-copy — consulte Clonagem de modelos com dbt clone abaixo para obter detalhes.
Recomendamos usar um cluster ou serviço ClickHouse dedicado para o ambiente de teste (ou seja, um ambiente de staging) para evitar impactar a operação do seu ambiente de produção. Para garantir que o ambiente de teste seja representativo, é importante usar um subconjunto dos seus dados de produção, além de executar o dbt de forma a evitar divergência de schema entre ambientes.
- Se você não precisa de dados recentes para testar, pode restaurar um backup dos seus dados de produção no ambiente de staging.
- Se você precisa de dados recentes para testar, pode usar uma combinação da table function
remoteSecure()com views materializadas atualizáveis para inserir dados na frequência desejada. Outra opção é usar armazenamento de objetos como intermediário e gravar dados periodicamente a partir do seu serviço de produção, depois importá-los para o ambiente de staging usando table functions de armazenamento de objetos ou ClickPipes (para ingestão contínua).
dbt build --select state:modified+ --state path/to/last/deploy/state.json para reconstruir seletivamente o menor conjunto de modelos necessário com base no que mudou desde a última execução em produção.
Clonagem de modelos com dbt clone
dbt clone usa a instrução zero-copy CREATE OR REPLACE TABLE ... CLONE AS ... do ClickHouse para clonar modelos materializados como tabelas que usam um motor da família MergeTree. Isso cria uma cópia da tabela sem duplicar as partes de dados subjacentes, o que torna essa uma forma rápida e econômica de sincronizar ambientes — por exemplo, ao configurar um ambiente de desenvolvimento ou Slim CI a partir do estado de produção.
Os modelos que não podem ser clonados dessa forma usam o comportamento padrão do dbt, que cria uma visão apontando para a relação de origem:
- Tabelas que usam motores diferentes de MergeTree
- Materializações Distributed
Solução de problemas comuns
Conexões
- O motor deve ser um dos motores compatíveis.
- Você deve ter permissões adequadas para acessar o banco de dados.
- Se você não estiver usando o motor de tabela padrão do banco de dados, deverá especificar um motor de tabela na configuração do seu modelo.
Entendendo operações de longa duração
debug — isso exibirá o tempo gasto por cada consulta. Por exemplo, isso pode ser feito acrescentando --log-level debug aos comandos do dbt.
Correlacionando execuções do dbt com consultas do ClickHouse
adapter_response do respectivo resultado do dbt e, portanto, está disponível em artefatos do dbt, como run_results.json. Você pode consultá-lo na tabela system.query_log para verificar a duração e o uso de recursos dessa instrução:
run_results.json identifica apenas a instrução principal do modelo. Para encontrar todas as instruções associadas a uma execução, filtre system.query_log pelo comentário de consulta do dbt incorporado ao texto de cada consulta.
O ID de consulta também permite que ferramentas de observabilidade que consomem artefatos do dbt (por exemplo, Elementary) vinculem automaticamente execuções de modelos do dbt às entradas em system.query_log.
Limitações
- O plugin usa uma sintaxe que exige o ClickHouse versão 25.3 ou mais recente. Não testamos versões mais antigas do ClickHouse. No momento, também não testamos tabelas Replicated.
- Diferentes execuções do
dbt-adapterpodem entrar em conflito se forem executadas ao mesmo tempo, pois internamente podem usar os mesmos nomes de tabela para as mesmas operações. Para mais informações, consulte a issue #420. - Atualmente, o adaptador materializa modelos como tabelas usando um INSERT INTO SELECT. Na prática, isso significa duplicação de dados se a execução ocorrer novamente. Datasets muito grandes (PB) podem resultar em tempos de execução extremamente longos, tornando alguns modelos inviáveis. Para melhorar o desempenho, use visões materializadas do ClickHouse implementando a view como
materialized: materialization_view. Além disso, procure minimizar o número de linhas retornadas por qualquer consulta usandoGROUP BYsempre que possível. Prefira modelos que resumam os dados em vez daqueles que apenas os transformam mantendo a mesma contagem de linhas da origem. - Para usar tabelas distribuídas para representar um modelo, você deve criar manualmente as tabelas replicadas subjacentes em cada nó. A tabela distribuída, por sua vez, pode ser criada sobre elas. O adaptador não gerencia a criação do cluster.
- Quando o dbt cria uma relação (tabela/view) em um banco de dados, ele normalmente a cria como:
{{ database }}.{{ schema }}.{{ table/view id }}. O ClickHouse não tem o conceito de schemas. Portanto, o adaptador usa{{schema}}.{{ table/view id }}, em queschemaé o banco de dados do ClickHouse. - Modelos/CTEs efêmeros não funcionam se forem colocados antes do
INSERT INTOem uma instrução de insert do ClickHouse; veja https://github.com/ClickHouse/ClickHouse/issues/30323. Isso não deve afetar a maioria dos modelos, mas é preciso ter cuidado com onde um modelo efêmero é colocado nas definições de modelo e em outras instruções SQL.
Fivetran
dbt-clickhouse também está disponível para uso em transformações do Fivetran, permitindo integração e transformação de forma fluida diretamente na plataforma Fivetran com dbt.