Tous les produits
Search
Centre de documentation

Hologres:Bonnes pratiques pour l'écriture par lots dans Hologres

Dernière mise à jour :Aug 11, 2026

Hologres est un moteur d'entrepôt de données en temps réel tout-en-un compatible avec le protocole PostgreSQL. Il prend en charge l'écriture, la mise à jour et l'interrogation de grands volumes de données, aussi bien dans des scénarios en temps réel que hors ligne. Sur la base des résultats de tests de performance des écritures par lots depuis Spark vers Hologres, cette rubrique vous aide à choisir le mode d'écriture optimal pour différents cas d'utilisation.

Pour les écritures et mises à jour de données en temps réel, consultez la rubrique Tests de charge pour les écritures, mises à jour et requêtes ponctuelles.

Comparaison des modes d'écriture par lots

Hologres prend en charge plusieurs modes d'écriture par lots, notamment le mode COPY traditionnel, le mode d'importation en continu FIXED COPY basé sur le protocole COPY, ainsi que le mode INSERT INTO VALUES qui convertit les importations par lots en écritures en continu.

Le tableau suivant compare ces trois modes d'écriture en détail.

Fonctionnalité

COPY

FIXED COPY

INSERT INTO VALUES

Description

Importation par lots vers des tables sans clé primaire

Importation par lots vers des tables avec clé primaire

Mode d'importation en continu basé sur le protocole COPY

Mode d'importation en continu de base

Cas d'utilisation

  • Importation par lots depuis Spark

  • Importation par lots depuis Apache Flink

  • Importation depuis Flink

  • Importation depuis DataWorks Data Integration

  • Importation en continu depuis Spark

  • Importation depuis Flink

  • Importation depuis DataWorks Data Integration

  • Importation en continu depuis Spark

Granularité du verrou

Verrou de ligne

Verrou de table

Verrou de ligne

Verrou de ligne

Visibilité des données

Visible une fois l'opération COPY terminée

Visible une fois l'opération COPY terminée

Visible en temps réel

Visible en temps réel

Performance

Élevée

Élevée

Moyenne

Moyenne

Consommation des ressources Hologres

Faible

Faible

Élevée

Élevée

Consommation des ressources client

Faible

Élevée

Faible

Moyenne

Politiques de gestion des conflits de clés primaires prises en charge

Sans objet

  • NONE

  • UPDATE : prend en charge les mises à jour complètes des lignes à partir de la version V3.0.4 et les mises à jour partielles à partir de la version V3.1.1.

  • IGNORE : pris en charge à partir de la version V3.0.4.

  • NONE (renvoie une erreur en cas de conflit)

  • UPDATE

  • IGNORE

  • NONE (renvoie une erreur en cas de conflit)

  • UPDATE

  • IGNORE

Sélection du mode d'écriture par lots

Dans les scénarios d'écriture par lots, ces trois modes offrent les fonctionnalités suivantes :

  • Mode COPY : Le mode COPY traditionnel offre les meilleures performances d'écriture tout en consommant le moins de ressources Hologres.

  • Mode FIXED COPY : Un mode d'importation en continu basé sur le protocole COPY. Il génère uniquement un verrou de ligne et assure la visibilité des données en temps réel.

  • Mode INSERT INTO VALUES : Ce mode convertit les importations par lots en écritures en continu traditionnelles et ne présente aucun avantage significatif dans les scénarios d'écriture par lots.

    Remarque

    Le mode INSERT INTO VALUES ne présente pas d'avantage distinct uniquement dans les scénarios d'écriture par lots. Toutefois, il s'agit du seul mode prenant en charge la rétractation des données (suppression) et il est requis pour des cas d'utilisation tels que l'écriture de données de journaux binaires.

Sauf si vous avez des exigences spécifiques concernant la visibilité des données en temps réel, la granularité des verrous (un verrou de table empêche les tâches d'écriture concurrentes) ou la charge de la source de données, nous vous recommandons d'utiliser le mode COPY pour les écritures par lots.

  • Pour les écritures par lots depuis Spark : nous vous recommandons de mettre à niveau votre instance Hologres vers la version V2.2.25 ou ultérieure et de définir le paramètre d'écriture write.mode du connecteur sur auto (valeur par défaut). Le système sélectionne alors automatiquement le mode d'écriture par lots optimal.

  • Pour les écritures par lots depuis Flink : utilisez d'abord l'arbre de décision ci-dessous pour sélectionner soit le mode COPY, soit le mode FIXED COPY. Ensuite, configurez les paramètres suivants :

    • jdbccopywritemode : définissez-le sur TRUE. Cela évite l'utilisation du mode INSERT INTO VALUES.

    • bulkload : définissez-le sur TRUE pour le mode COPY ou sur FALSE pour le mode FIXED COPY selon vos besoins.

Utilisez l'arbre de décision suivant pour sélectionner le mode d'écriture par lots approprié à votre scénario.

image

Test de performance d'écriture par lots

Ce test utilise le connecteur open-source Hologres-Spark-Connector de Hologres.

Prérequis

Configuration de l'environnement

Avant de commencer, assurez-vous que l'environnement suivant est configuré :

Important

L'instance Hologres et le cluster EMR Spark doivent se trouver dans la même région et utiliser le même VPC.

  • Provisionnez une instance Hologres de version V2.2.25 ou ultérieure et créez une base de données.

  • Créez un cluster EMR Spark exécutant Spark 3.3.0 ou une version ultérieure. Pour plus d'informations, consultez la rubrique Créer un cluster.

  • Téléchargez le package Spark-Connector.

    Pour permettre à Spark de lire et d'écrire dans Hologres, téléchargez le fichier JAR hologres-connector-spark-3.x depuis le référentiel central Maven.

Le tableau suivant décrit l'environnement utilisé pour le test de performance.

Service

Version

Spécifications

Hologres

V3.0.30

64 cœurs, 256 Go (1 CU = 1 cœur, 4 Go)

EMR Spark

EMR-5.18.1, Spark-3.5.3

8 cœurs, 32 Go × 8 (1 nœud maître, 7 nœuds core)

Important

Vous devez activer le service OSS-HDFS.

Spark-Connector

1.5.2

N/A

Préparation des données de test

  1. Préparez les données source.

    1. Connectez-vous au nœud maître du cluster EMR Spark. Pour plus d'informations, consultez la rubrique Se connecter à une instance ECS.

    2. Téléchargez le package d'outils TPC-H TPC-H_Tools_v3.0.0.zip. Copiez ensuite le package sur l'instance ECS du nœud maître, extrayez-le et accédez au répertoire TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgen.

    3. Exécutez la commande suivante dans le répertoire dbgen pour générer un fichier customer.tbl pour un jeu de données de test de 1 To.

      ./dbgen -s 1000 -T c

      Le tableau suivant décrit la table customer dans le jeu de données TPC-H de 1 To.

      Élément

      Description

      Nombre de champs

      8

      Types de champs

      INT, BIGINT, TEXT, DECIMAL

      Nombre de lignes

      150 000 000

      Nombre de shards

      40

  2. Importez les données de test dans Spark.

    Exécutez la commande suivante pour télécharger le fichier customer.tbl vers le cluster Spark.

    hadoop fs -put customer.tbl <spark_resource>

    Dans la commande, spark_resource fait référence au Root Storage Directory of Cluster que vous avez défini lors de la création du cluster EMR Spark.

  3. Stockage hybride ligne-colonne

    CREATE TABLE test_table_mixed (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column,row'
    );

    Stockage orienté colonne (avec clé primaire)

    CREATE TABLE test_table_column (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column'
    );

    Stockage orienté colonne (sans clé primaire)

    CREATE TABLE test_table_column_no_pk (
        C_CUSTKEY BIGINT,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'column'
    );

    Stockage orienté ligne (avec clé primaire)

    CREATE TABLE test_table_row (
        C_CUSTKEY BIGINT PRIMARY KEY,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'row'
    );

    Stockage orienté ligne (sans clé primaire)

    CREATE TABLE test_table_row_no_pk (
        C_CUSTKEY BIGINT,
        C_NAME TEXT,
        C_ADDRESS TEXT,
        C_NATIONKEY INT,
        C_PHONE TEXT,
        C_ACCTBAL DECIMAL(15, 2),
        C_MKTSEGMENT TEXT,
        C_COMMENT TEXT
    )
    WITH (
        orientation = 'row'
    );

Test de performance

Configuration du test

Cette rubrique teste les performances d'importation de différents modes.

  1. Connectez-vous au nœud maître du cluster EMR Spark. Pour plus d'informations, consultez la rubrique Se connecter à une instance ECS. Téléchargez le package Spark-Connector précédemment téléchargé, puis exécutez la commande suivante pour accéder au shell interactif Spark SQL.

    Remarque

    Vous pouvez ajuster la valeur du paramètre spark.sql.files.maxPartitionBytes pour contrôler la concurrence de lecture des fichiers HDFS dans Spark. Dans cet exemple, la concurrence est définie sur 40.

    # Enter the Spark SQL interactive shell.
    spark-sql --jars <path>/hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \
    --conf spark.executor.instances=40 \
    --conf spark.executor.cores=1 \
    --conf spark.executor.memory=4g \
    --conf spark.sql.files.maxPartitionBytes=644245094

    Dans la commande, path correspond au répertoire contenant le fichier hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar.

  2. Dans le shell interactif Spark SQL, exécutez les instructions SQL suivantes pour créer des vues temporaires et écrire des données.

    Une table temporaire est utilisée dans ce test pour faciliter l'ajustement des paramètres lors de l'évaluation des performances d'écriture de différents modes.

    Remarque

    En pratique, vous pouvez également utiliser un catalogue pour charger directement les tables Hologres.

    -- Create a temporary table in CSV format.
    CREATE TEMPORARY VIEW csvtable (
      c_custkey BIGINT,
      c_name STRING,
      c_address STRING,
      c_nationkey INT,
      c_phone STRING,
      c_acctbal DECIMAL(15, 2),
      c_mktsegment STRING,
      c_comment STRING)
    USING csv OPTIONS (
      path "<spark_resources>/customer.tbl", sep "|"
    );
    CREATE TEMPORARY VIEW hologresTable (
      c_custkey BIGINT,
      c_name STRING,
      c_address STRING,
      c_nationkey INT,
      c_phone STRING,
      c_acctbal DECIMAL(15, 2),
      c_mktsegment STRING,
      c_comment STRING)
    USING hologres OPTIONS (
      jdbcurl "jdbc:postgresql://<hologres_vpc_endpoint>/<database_name>",
      username "<accesskey_id>", 
      password "<accesskey_secret>", 
      table "<table_name>",
      direct_connect "false",
      write.mode "auto",
      write.insert.thread_size "3",
      write.insert.batch_size "2048"
    );
    INSERT INTO hologresTable SELECT * FROM csvTable;

    Le tableau suivant décrit les paramètres.

    Paramètre

    Description

    spark_resources

    Le cluster root storage path que vous configurez lors de la création du cluster EMR Spark.

    Vous pouvez trouver ce chemin dans la section Cluster Information de la page Basic Information de votre cluster dans la console EMR on ECS.

    hologres_vpc_endpoint

    Le Domain Name VPC de l'instance Hologres.

    Connectez-vous à la console Hologres, cliquez sur l'ID de l'instance cible et recherchez le point de terminaison pour le VPC spécifié dans la section d'informations réseau de la page des détails de l'instance. Par exemple, un point de terminaison VPC dans la région Chine (Hangzhou) a le format <Instance ID>-cn-hangzhou-vpc-st.hologres.aliyuncs.com:80.

    database_name

    Le nom de la base de données dans l'instance Hologres.

    accesskey_id

    L'AccessKey ID disposant des autorisations de lecture sur la base de données Hologres spécifiée.

    accesskey_secret

    L'AccessKey Secret disposant des autorisations de lecture sur la base de données Hologres spécifiée.

    table_name

    Le nom de la table Hologres de destination.

    write.mode

    Le mode d'écriture. Valeurs possibles :

    • auto : valeur par défaut. Le connecteur sélectionne automatiquement le mode optimal.

    • insert : écrit les données à l'aide d'instructions INSERT INTO VALUES.

    • stream : effectue des écritures en continu à l'aide de FIXED COPY.

    • bulk_load : effectue une importation par lots vers une table sans clé primaire à l'aide de COPY.

    • bulk_load_on_conflict : effectue une importation par lots vers une table avec clé primaire à l'aide de COPY.

    write.insert.thread_size

    La concurrence d'écriture. Ce paramètre s'applique uniquement au mode insert.

    write.insert.batch_size

    La taille du lot d'écriture. Ce paramètre s'applique uniquement au mode insert.

    write.on_conflict_action

    INSERT_OR_REPLACE (par défaut) : si un conflit de clé primaire se produit, les données sont mises à jour.

    INSERT_OR_IGNORE : si un conflit de clé primaire se produit, les données sont ignorées.

    Pour plus d'informations sur les paramètres, consultez la rubrique Paramètres.

Scénarios de test

Scénario de test

Options

Format de stockage de la table

  • Stockage orienté ligne

  • Stockage orienté colonne

  • Stockage hybride ligne-colonne

Méthode de mise à jour des données

  • Écritures en ajout seul vers une table sans clé primaire

  • Écritures initiales vers une table vide avec clé primaire

  • Mises à jour complètes des lignes vers une table avec clé primaire

Mode d'écriture

  • insert (INSERT INTO VALUES)

  • stream (FIXED COPY)

  • bulk_load (importation COPY vers une table sans clé primaire)

  • bulk_load_on_conflict (importation COPY vers une table avec clé primaire)

Résultats du test

Les résultats du test incluent les champs suivants :

Champ

Description

Durée totale du job

Le temps d'exécution total du job Spark.

Cette valeur correspond au temps nécessaire pour exécuter l'opération INSERT dans le shell interactif Spark SQL sur un nœud de cluster EMR Spark. Cette durée apparaît dans la ligne Time taken de la sortie du shell :

spark-sql (default)> insert into hologresTable select * from csvTable;25/04/11 15:05:51 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:05:52 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:05:52 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:02 WARN [main] PGStream: create socket to25/04/11 15:06:02 WARN [main] JDBCUtil$: could not connect directly25/04/11 15:06:03 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:04 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:04 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:05 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:05 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:06 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:06 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:07 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:07 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:09 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:09 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:10 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:10 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:11 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:11 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:12 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:12 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]25/04/11 15:06:13 WARN [embedded-hologres-connector-spark-SparkSQL::xxx -worker]Time taken: 228.901 seconds

Durée moyenne d'écriture des données

La durée moyenne du job d'écriture lui-même, excluant le temps passé sur la planification du cluster Spark, la lecture des données ou le brassage des données.

Sur la page HoloWeb de la console Hologres, exécutez l'instruction SQL suivante pour obtenir la concurrence des shards (la valeur de COUNT(*)) et la durée moyenne d'écriture des données (avg_duration_ms) en millisecondes :

SELECT    COUNT(*), AVG(duration) AS avg_duration_msFROM    hologres.hg_query_logWHERE    query_start >= '<start_time>' AND query_start <= '<end_time>'    AND query LIKE '%<hologres_table_name>%' AND command_tag = 'COPY';

Le tableau suivant décrit les paramètres.

  • start_time : l'heure de début de l'opération d'écriture des données, par exemple 2024-04-11 15:00:00.

  • end_time : l'heure de fin de l'opération d'écriture des données, par exemple 2024-04-11 15:10:00.

  • hologres_table_name : le nom de la table Hologres de destination, par exemple your_table_name.

Charge Hologres

L'utilisation du CPU de l'instance Hologres.

Vous pouvez obtenir l'utilisation du CPU sur la page Monitoring Information de l'instance dans la console Hologres.

Charge Spark

La charge sur les nœuds EMR.

Dans la console EMR on ECS, accédez à l'onglet Monitoring and Diagnostics > Metric Monitoring de votre cluster et configurez les paramètres suivants :

  • Dashboard : sélectionnez HOST.

  • nodeGroupId : sélectionnez l'ID du groupe de nœuds core du cluster.

  • hostname : sélectionnez les nœuds core.

  • Select Time : sélectionnez la période couvrant l'opération d'écriture des données Spark.

Interrogez ensuite la métrique CPU utilization pour afficher la charge Spark.

Le tableau suivant présente les résultats détaillés du test.

Format de stockage

Clé primaire

Mode d'écriture

Durée totale du job

Durée moyenne d'écriture

Charge Hologres

Charge Spark

Stockage orienté colonne

Aucune clé primaire

insert

241,61 s

232,70 s

92 %

15 %

stream

228,11 s

222,34 s

100 %

36 %

bulk_load

88,72 s

57,16 s

97 %

47 %

Avec clé primaire

ignore

insert

190,96 s

172,60 s

90 %

14 %

stream

149,60 s

142,16 s

100 %

14 %

bulk_load_on_conflict

115,96 s

42,92 s

60 %

75 %

Avec clé primaire

replace

insert

600,40 s

574,31 s

91 %

5 %

stream

550,29 s

540,32 s

100 %

5 %

bulk_load_on_conflict

188,05 s

109,77 s

93 %

78 %

Stockage orienté ligne

Aucune clé primaire

insert

132,38 s

123,79 s

94 %

22 %

stream

114,41 s

103,81 s

100 %

17 %

bulk_load

68,20 s

41,22 s

98 %

32 %

Avec clé primaire

ignore

insert

190,48 s

170,49 s

89 %

15 %

stream

185,46 s

172,48 s

85 %

14 %

bulk_load_on_conflict

117,81 s

47,69 s

58 %

75 %

Avec clé primaire

replace

insert

177,97 s

170,78 s

93 %

15 %

stream

142,44 s

130,16 s

100 %

20 %

bulk_load_on_conflict

137,69 s

65,18 s

92 %

78 %

Stockage hybride ligne-colonne

Avec clé primaire

ignore

insert

172,19 s

158,74 s

86 %

16 %

stream

150,63 s

149,76 s

100 %

12 %

bulk_load_on_conflict

128,83 s

42,09 s

59 %

79 %

Avec clé primaire

replace

insert

690,37 s

662,00 s

92 %

5 %

stream

625,84 s

623,08 s

100 %

4 %

bulk_load_on_conflict

202,07 s

121,58 s

93 %

80 %

Remarque

Les modes d'écriture correspondent aux opérations suivantes :

  • insert : INSERT INTO VALUES

  • stream : FIXED COPY

  • bulk_load : importation COPY vers une table sans clé primaire

  • bulk_load_on_conflict : importation COPY vers une table avec clé primaire