Dans cette section, nous présentons certaines des fonctionnalités disponibles pour dbt avec ClickHouse.
Configurations de profiles.yml
Pour vous connecter à ClickHouse depuis dbt, vous devez ajouter un profil à votre fichier profiles.yml. Un profil ClickHouse suit la syntaxe suivante :
your_profile_name:
target: dev
outputs:
dev:
type: clickhouse
# Optional
schema: [default] # ClickHouse database for dbt models
driver: [http] # http or native. If not set this will be autodetermined based on port setting
host: [localhost]
port: [8123] # If not set, defaults to 8123, 8443, 9000, 9440 depending on the secure and driver settings
user: [default] # User for all database operations
password: [<empty string>] # Password for the user
cluster: [<empty string>] # If set, certain DDL/table operations will be executed with the `ON CLUSTER` clause using this cluster. Distributed materializations require this setting to work. See the following ClickHouse Cluster section for more details.
verify: [True] # Validate TLS certificate if using TLS/SSL
secure: [False] # Use TLS (native protocol) or HTTPS (http protocol)
client_cert: [null] # Path to a TLS client certificate in .pem format
client_cert_key: [null] # Path to the private key for the TLS client certificate
server_host_name: [null] # Override the TLS SNI and hostname verification target. Useful when connecting via a DNS alias (e.g. an internal CNAME or AWS PrivateLink endpoint) where the TLS certificate is issued for a different hostname than the one used in `host`.
retries: [1] # Number of times to retry a "retriable" database exception (such as a 503 'Service Unavailable' error)
compression: [<empty string>] # Use gzip compression if truthy (http), or compression type for a native connection
connect_timeout: [10] # Timeout in seconds to establish a connection to ClickHouse
send_receive_timeout: [300] # Timeout in seconds to receive data from the ClickHouse server
cluster_mode: [False] # Use specific settings designed to improve operation on Replicated databases (recommended for ClickHouse Cloud)
use_lw_deletes: [False] # Use the strategy `delete+insert` as the default incremental strategy.
check_exchange: [True] # Validate that clickhouse support the atomic EXCHANGE TABLES command. (Not needed for most ClickHouse versions)
local_suffix: [_local] # Table suffix of local tables on shards for distributed materializations.
local_db_prefix: [<empty string>] # Database prefix of local tables on shards for distributed materializations. If empty, it uses the same database as the distributed table.
allow_automatic_deduplication: [False] # Enable ClickHouse automatic deduplication for Replicated tables
tcp_keepalive: [False] # Native client only, specify TCP keepalive configuration. Specify custom keepalive settings as [idle_time_sec, interval_sec, probes].
reuse_connections: [True] # Re-use the same connection across models. Set to `False` to close the connection at the end of each model — useful on multi-replica ClickHouse Cloud services where the load balancer routes by TCP connection. Note: disabling connection reuse adds a new TCP/TLS handshake per model, which increases total `dbt run` wall time (typically ~200-500 ms per model). Combine with `threads > 1` for the best balance between distribution and throughput.
custom_settings: [{}] # A dictionary/mapping of custom ClickHouse settings for the connection - default is empty.
database_engine: '' # Database engine to use when creating new ClickHouse schemas (databases). If not set (the default), new databases will use the default ClickHouse database engine (usually Atomic).
threads: [1] # Number of threads to use when running queries. Before setting it to a number higher than 1, make sure to read the [read-after-write consistency](#read-after-write-consistency) section.
# Native (clickhouse-driver) connection settings
sync_request_timeout: [5] # Timeout for server ping
compress_block_size: [1048576] # Compression block size if compression is enabledSchéma vs base de données
L’identifiant de relation du modèle dbt database.schema.table n’est pas compatible avec ClickHouse, car ClickHouse ne
prend pas en charge les schema.
Nous utilisons donc une approche simplifiée, schema.table, où schema correspond à la base de données ClickHouse. Il est déconseillé d’utiliser la base de données default.
Avertissement concernant l’instruction SET
Dans de nombreux environnements, utiliser l’instruction SET pour faire persister un paramètre ClickHouse dans l’ensemble des requêtes DBT n’est pas fiable et peut entraîner des échecs inattendus. C’est particulièrement vrai lors de l’utilisation de connexions HTTP via un load balancer qui répartit les requêtes entre plusieurs nœuds (comme dans ClickHouse Cloud), même si, dans certaines circonstances, cela peut aussi se produire avec des connexions ClickHouse natives. Par conséquent, nous recommandons, comme bonne pratique, de configurer tous les paramètres ClickHouse requis dans la propriété "custom_settings" du profil DBT, plutôt que de s’appuyer sur une instruction "SET" dans un pre-hook, comme cela a parfois été suggéré.
Définir quote_columns
Pour éviter cet avertissement, veillez à définir explicitement une valeur pour quote_columns dans votre dbt_project.yml. Consultez la documentation sur quote_columns pour plus d’informations.
seeds:
+quote_columns: false #or `true` if you have CSV column headers with spacesÀ propos du cluster ClickHouse
Lorsque vous utilisez un cluster ClickHouse, vous devez tenir compte de deux éléments :
- Configurer le paramètre
cluster. - Garantir la cohérence de lecture après écriture, en particulier si vous utilisez plusieurs
threads.
Paramètre cluster
Le paramètre cluster du profil permet à dbt-clickhouse de s’exécuter sur un cluster ClickHouse. Si cluster est défini dans le profil, tous les modèles seront créés avec la clause ON CLUSTER par défaut, à l’exception de ceux qui utilisent un moteur Replicated. Cela inclut :
- La création de bases de données
- Les matérialisations de vues
- Les matérialisations de tables et incrémentielles
- Les matérialisations Distributed
Les moteurs Replicated n’incluront pas la clause ON CLUSTER, car ils sont conçus pour gérer la réplication en interne.
Pour désactiver la création via le cluster pour un modèle spécifique, ajoutez la configuration disable_on_cluster :
{{ config(
engine='MergeTree',
materialized='table',
disable_on_cluster='true'
)
}}Les matérialisations table et incremental avec un moteur non répliqué ne seront pas affectées par le paramètre cluster (le modèle
sera créé uniquement sur le nœud auquel vous êtes connecté).
Compatibilité
Si un modèle a été créé sans paramètre cluster, dbt-clickhouse détectera cette situation et exécutera toutes les opérations DDL/DML
sans clause on cluster pour ce modèle.
Cohérence de lecture après écriture
dbt repose sur un modèle de cohérence de lecture après insertion. Cela n'est pas compatible avec les clusters ClickHouse qui ont plus d'une réplique si vous ne pouvez pas garantir que toutes les opérations auront lieu sur la même réplique. Il est possible que vous ne rencontriez aucun problème dans votre utilisation quotidienne de dbt, mais il existe, selon votre cluster, quelques stratégies pour mettre cette garantie en place :
- Si vous utilisez un cluster ClickHouse Cloud, il vous suffit de définir
select_sequential_consistency: 1dans la propriétécustom_settingsde votre profil. Vous trouverez plus d'informations sur ce paramètre ici. - Si vous utilisez un cluster auto-hébergé, assurez-vous que toutes les requêtes dbt sont envoyées vers la même réplique ClickHouse. Si vous avez un load balancer devant celle-ci, essayez d'utiliser un mécanisme de
replica aware routing/sticky sessionsafin de toujours atteindre la même réplique. L'ajout du paramètreselect_sequential_consistency = 1sur des clusters hors ClickHouse Cloud n'est pas recommandé.
Macros supplémentaires pour ClickHouse
Macros utilitaires de matérialisation des modèles
Les macros suivantes sont incluses pour faciliter la création de tables et de vues propres à ClickHouse :
engine_clause– Utilise la propriété de configuration du modèleenginepour attribuer un moteur de table ClickHouse. dbt-clickhouse utilise le moteurMergeTreepar défaut.partition_cols– Utilise la propriété de configuration du modèlepartition_bypour attribuer une clé de partition ClickHouse. Aucune clé de partition n'est attribuée par défaut.order_cols– Utilise la configuration du modèleorder_bypour attribuer une clé ORDER BY/de tri ClickHouse. Si elle n'est pas spécifiée, ClickHouse utilisera un tuple() vide et la table ne sera pas triéeprimary_key_clause– Utilise la propriété de configuration du modèleprimary_keypour attribuer une clé primaire ClickHouse. Par défaut, une clé primaire est définie et ClickHouse utilisera la clause ORDER BY comme clé primaire.on_cluster_clause– Utilise la propriété de profilclusterpour ajouter une clauseON CLUSTERà certaines opérations dbt : matérialisations distribuées, création de vues, création de bases de données.ttl_config– Utilise la propriété de configuration du modèlettlpour attribuer une expression de table TTL ClickHouse. Aucun TTL n'est attribué par défaut.
Macro auxiliaire s3Source
La macro s3source simplifie la sélection directe de données ClickHouse depuis S3 à l’aide de la fonction de table S3 de ClickHouse. Elle fonctionne en
renseignant les paramètres de la fonction de table S3 à partir d’un dictionnaire de configuration nommé (le nom du dictionnaire doit se terminer
par s3). La macro
recherche d’abord le dictionnaire dans les vars du profil, puis dans la configuration du modèle. Le dictionnaire peut contenir
l’une des
clés suivantes, utilisées pour renseigner les paramètres de la fonction de table S3 :
| Nom de l’argument | Description |
|---|---|
| bucket | L’URL de base du bucket, par exemple https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi. https:// est utilisé par défaut si aucun protocol n’est indiqué. |
| path | Le chemin S3 à utiliser pour la requête sur la table, par exemple /trips_4.gz. Les wildcards S3 sont prises en charge. |
| fmt | Le input format ClickHouse attendu (par exemple TSV ou CSVWithNames) pour les objets S3 référencés. |
| structure | La structure en colonnes des données du bucket, sous la forme d’une liste de paires nom/type de données, par exemple ['id UInt32', 'date DateTime', 'value String'] Si elle n’est pas fournie, ClickHouse inférera la structure. |
| aws_access_key_id | L’identifiant de la clé d’accès S3. |
| aws_secret_access_key | La clé secrète S3. |
| role_arn | L’ARN du rôle IAM créé pour sécuriser l’accès à S3. Consultez cette documentation pour plus d’informations. |
| external_id | L’ID externe à transmettre avec role_arn lors de l’utilisation du rôle IAM. Nécessite que role_arn soit défini. Disponible depuis dbt-clickhouse 1.10.2. |
| compression | La méthode de compression utilisée pour les objets S3. Si elle n’est pas fournie, ClickHouse tentera de déterminer la compression à partir du nom du fichier. |
Exemple
Définissez la configuration partagée dans dbt_project.yml (le nom du dictionnaire doit se terminer par s3) :
vars:
taxi_s3:
bucket: 'datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi'
fmt: 'TabSeparatedWithNames'Appelez ensuite la macro dans un modèle. N’importe lequel des arguments ci-dessus peut également être transmis directement lors de l’appel et prévaut alors sur les valeurs du dictionnaire :
select * from {{ clickhouse_s3source('taxi_s3', path='/trips_4.gz') }}Consultez le fichier de test S3 pour voir davantage d’exemples.
Prise en charge des macros inter-bases de données
dbt-clickhouse prend désormais en charge la plupart des macros inter-bases de données incluses dans dbt Core, à l’exception des suivantes :
- La fonction SQL
split_partest implémentée dans ClickHouse à l’aide de la fonction splitByChar. Cette fonction nécessite l’utilisation d’une chaîne constante comme délimiteur de fractionnement ; le paramètredelimeterutilisé pour cette macro sera donc interprété comme une chaîne, et non comme un nom de colonne. - De même, la fonction SQL
replacedans ClickHouse nécessite des chaînes constantes pour les paramètresold_charsetnew_chars; ces paramètres seront donc interprétés comme des chaînes plutôt que comme des noms de colonne lors de l’appel de cette macro.
Prise en charge du catalogue
Statut de l’intégration aux catalogues dans dbt
dbt Core v1.10 a introduit la prise en charge de l’intégration aux catalogues, ce qui permet aux adaptateurs de matérialiser des modèles dans des catalogues externes gérant des formats de table ouverts comme Apache Iceberg. Cette fonctionnalité n’est pas encore implémentée nativement dans dbt-clickhouse. Vous pouvez suivre l’avancement de cette implémentation dans l’issue GitHub #489.
Prise en charge des catalogues ClickHouse
ClickHouse a récemment ajouté la prise en charge native des tables Apache Iceberg et des catalogues de données. La plupart des fonctionnalités sont encore experimental, mais vous pouvez déjà les utiliser si vous disposez d’une version récente de ClickHouse.
-
Vous pouvez utiliser ClickHouse pour interroger des tables Iceberg stockées dans du stockage objet (S3, Azure Blob Storage, Google Cloud Storage) à l’aide du moteur de table Iceberg et de la fonction de table Iceberg.
-
En outre, ClickHouse propose le moteur de base de données DataLakeCatalog, qui permet de se connecter à des catalogues de données externes, notamment AWS Glue Catalog, Databricks Unity Catalog, Hive Metastore et les catalogues REST. Cela vous permet d’interroger directement, depuis des catalogues externes, des données dans des formats de table ouverts (Iceberg, Delta Lake), sans duplication des données.
Solutions de contournement pour utiliser Iceberg et les catalogues
Vous pouvez lire des données à partir de tables Iceberg ou de catalogues depuis votre projet dbt si vous les avez déjà définis dans votre cluster ClickHouse à l’aide des outils présentés ci-dessus. Vous pouvez utiliser la fonctionnalité source de dbt pour référencer ces tables dans vos projets dbt. Par exemple, si vous souhaitez accéder à vos tables dans un REST Catalog, vous pouvez :
- Créer une base de données pointant vers un catalogue externe :
-- Example with REST Catalog
SET allow_experimental_database_iceberg = 1;
CREATE DATABASE iceberg_catalog
ENGINE = DataLakeCatalog('http://rest:8181/v1', 'admin', 'password')
SETTINGS
catalog_type = 'rest',
storage_endpoint = 'http://minio:9000/lakehouse',
warehouse = 'demo'- Déclarez la base de données du catalogue et ses tables comme sources dans dbt : gardez à l’esprit que les tables doivent déjà être disponibles dans ClickHouse
version: 2
sources:
- name: external_catalog
database: iceberg_catalog
tables:
- name: orders
- name: customers- Utilisez les tables du catalogue dans vos modèles dbt :
SELECT
o.order_id,
c.customer_name,
o.order_date
FROM {{ source('external_catalog', 'orders') }} o
INNER JOIN {{ source('external_catalog', 'customers') }} c
ON o.customer_id = c.customer_idRemarques sur les solutions de contournement
Les avantages de ces solutions de contournement sont les suivants :
- Vous aurez immédiatement accès à différents types de tables externes et de catalogues externes, sans attendre l’intégration native des catalogues dans dbt.
- Vous bénéficierez d’un parcours de migration fluide lorsque la prise en charge native des catalogues sera disponible.
Mais il existe actuellement certaines limitations :
- Configuration manuelle : les tables Iceberg et les bases de données de catalogue doivent être créées manuellement dans ClickHouse avant de pouvoir être référencées dans dbt.
- Pas de DDL au niveau du catalogue : dbt ne peut pas gérer les opérations au niveau du catalogue, comme la création ou la suppression de tables Iceberg dans des catalogues externes. Vous ne pourrez donc pas les créer pour le moment depuis le connecteur dbt. La création de tables avec les engines Iceberg() pourrait être ajoutée à l’avenir.
- Opérations d’écriture : actuellement, l’écriture dans les tables Iceberg/Data Catalog est limitée. Consultez la documentation ClickHouse pour connaître les options disponibles.