Insertion dans ClickHouse vs. les bases de données OLTP
Bonnes pratiques pour les insertions
Effectuez des insertions par lots de grande taille
Assurer des lots cohérents pour des reprises idempotentes
-
- Si le nœud qui reçoit les données rencontre des problèmes, la requête d’insertion expirera (ou renverra une erreur plus spécifique) et aucun accusé de réception ne sera renvoyé.
-
- Si les données ont bien été écrites par le nœud, mais que l’accusé de réception ne peut pas être renvoyé à l’émetteur de la requête en raison d’interruptions réseau, celui-ci recevra soit un time-out, soit une erreur réseau.
Insérer dans une table MergeTree ou une table distribuée
internal_replication=true.
ClickHouse se chargera ainsi de répliquer les données vers toute réplique disponible et garantira une cohérence à terme des données.
Si cet équilibrage de charge côté client n’est pas pratique, vous pouvez insérer via une table distribuée, qui répartira alors les écritures entre les nœuds. Là encore, il est conseillé de définir internal_replication=true.
Il convient toutefois de noter que cette approche est légèrement moins performante, car les écritures doivent d’abord être effectuées localement sur le nœud qui héberge la table distribuée, puis envoyées aux shards.
Utilisez les insertions asynchrones pour les petits lots
Utiliser les clients ClickHouse officiels
Préférez le format natif
Utiliser l’interface HTTP
Exemple de base
INSERT INTO TABLE, bien connue, avec ClickHouse. Insérons quelques données dans la table que nous avons créée dans le guide de démarrage « Création de tables dans ClickHouse ».
SELECT suivante :
Chargement de données depuis Postgres
ClickPipes, un outil ETL spécialement conçu pour la réplication de bases de données PostgreSQL. Il est disponible dans les deux options suivantes :- ClickHouse Cloud - disponible via notre service d’ingestion managé dans ClickPipes.
- Auto-hébergé - via le projet open-source PeerDB.
- Le moteur de table PostgreSQL pour lire directement les données, comme dans les exemples précédents. Cette solution convient généralement si une réplication par lots basée sur un watermark connu, par exemple un timestamp, est suffisante, ou s’il s’agit d’une migration ponctuelle. Cette approche peut gérer des dizaines de millions de lignes. Les utilisateurs souhaitant migrer des jeux de données plus volumineux devraient envisager plusieurs requêtes, chacune traitant une partie des données. Des tables de staging peuvent être utilisées pour chaque partie avant le déplacement de ses partitions vers une table finale. Cela permet de relancer les requêtes ayant échoué. Pour plus de détails sur cette stratégie de chargement en masse, voir ici.
- Les données peuvent être exportées depuis PostgreSQL au format CSV. Elles peuvent ensuite être insérées dans ClickHouse à partir de fichiers locaux ou via le stockage objet à l’aide de fonctions de table.
Besoin d’aide pour insérer de grands jeux de données ?Si vous avez besoin d’aide pour insérer de grands jeux de données, ou si vous rencontrez des erreurs lors de l’importation de données dans ClickHouse Cloud, veuillez nous contacter à support@clickhouse.com et nous pourrons vous aider.
Insertion de données depuis la ligne de commande
- Vous avez installé ClickHouse
clickhouse-serverest en cours d’exécution- Vous avez accès à un terminal avec
wget,zcatetcurl
clickhouse-client en mode batch. Pour plus d’informations et d’exemples sur l’insertion de données via la ligne de commande avec clickhouse-client en mode batch, consultez “Mode batch”.
Nous utiliserons le jeu de données Hacker News pour cet exemple, qui contient 28 millions de lignes de données Hacker News.
Télécharger le CSV
Exécutez la commande suivante pour télécharger une version CSV du jeu de données depuis notre bucket S3 public :Créer la table
Avecclickhouse-server en cours d’exécution, vous pouvez créer une table vide avec le schéma suivant directement depuis la ligne de commande à l’aide de clickhouse-client en mode batch :_EOF) afin d’empêcher toute interpolation. Sans ces guillemets simples, il serait nécessaire d’échapper les backticks autour des noms de colonnes.Insérer les données depuis la ligne de commande
Exécutez ensuite la commande ci-dessous pour insérer dans votre table les données du fichier que vous avez téléchargé précédemment :gzip, zcat ou équivalent, puis rediriger les données décompressées vers clickhouse-client avec l’instruction INSERT et le FORMAT appropriés.Lors de l’insertion de données avec
clickhouse-client en mode interactif, vous pouvez laisser ClickHouse gérer la décompression à l’insertion en utilisant la clause COMPRESSION. ClickHouse peut détecter automatiquement le type de compression à partir de l’extension du fichier, mais vous pouvez aussi le spécifier explicitement.La requête d’insertion ressemblerait alors à ceci :hackernews :Insérer des données via la ligne de commande avec curl
Dans les étapes précédentes, vous avez d’abord téléchargé le fichier CSV sur votre machine locale avecwget. Il est également possible d’insérer directement les données depuis l’URL distante avec une seule commande.Exécutez la commande suivante pour supprimer les données de la table hackernews afin de pouvoir les insérer à nouveau sans l’étape intermédiaire de téléchargement sur votre machine locale :