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 |
|
|
| |
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 |
|
|
|
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.
RemarqueLe 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.modedu connecteur surauto(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
TRUEpour le mode COPY ou surFALSEpour 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.
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é :
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.xdepuis 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
-
Préparez les données source.
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 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.-
Exécutez la commande suivante dans le répertoire
dbgenpour générer un fichiercustomer.tblpour un jeu de données de test de 1 To../dbgen -s 1000 -T cLe 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
-
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.
-
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.
-
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.
RemarqueVous pouvez ajuster la valeur du paramètre
spark.sql.files.maxPartitionBytespour 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=644245094Dans la commande, path correspond au répertoire contenant le fichier
hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar. -
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.
RemarqueEn 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 |
|
Méthode de mise à jour des données |
|
Mode d'écriture |
|
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 |
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 Le tableau suivant décrit les paramètres.
|
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 :
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 % |
Les modes d'écriture correspondent aux opérations suivantes :
insert: INSERT INTO VALUESstream: FIXED COPYbulk_load: importation COPY vers une table sans clé primairebulk_load_on_conflict: importation COPY vers une table avec clé primaire