Ingérer des données en bloc dans Azure Cosmos DB pour Gremlin à l’aide d’une bibliothèque d’exécuteur en bloc
S’APPLIQUE À : Gremlin
Les bases de données de graphe doivent souvent ingérer des données en bloc pour actualiser un graphe entier ou mettre à jour une partie de celui-ci. Cosmos DB, qui est une base de données distribuée et l’épine dorsale d’Azure Cosmos DB pour Gremlin, fonctionne de manière optimale lorsque les charges sont bien distribuées. Dans Azure Cosmos DB, les bibliothèques d’exécuteur en bloc sont conçues pour exploiter cette fonctionnalité unique d’Azure Cosmos DB et pour fournir des performances optimales. Pour plus d’informations, consultez Introducing bulk support in the .NET SDK.
Dans ce tutoriel, vous allez voir comment utiliser la bibliothèque de l’exécuteur en bloc .NET d’Azure Cosmos DB pour importer et mettre à jour des objets Graph au sein d’un conteneur Azure Cosmos DB pour Gremlin. Au cours de ce processus, vous allez utiliser la bibliothèque pour créer des objets vertex (sommet) et edge (arête) par programmation, puis insérer plusieurs objets par requête réseau.
Au lieu d’envoyer des requêtes Gremlin à une base de données où les commandes sont évaluées puis exécutées une par une, vous utilisez la bibliothèque d’exécuteur en bloc pour créer et valider les objets en local. Une fois que la bibliothèque a initialisé les objets Graph, elle vous permet de les envoyer séquentiellement au service de base de données.
À l’aide de cette méthode, vous pouvez augmenter les vitesses d’ingestion des données (jusqu’à 100 fois plus rapidement), ce qui la rend idéale pour effectuer les migrations de données initiales ou des opérations périodiques de déplacement de données.
La bibliothèque d’exécuteur en bloc est maintenant disponible dans les variantes suivantes.
.NET
Prérequis
Avant de commencer, veillez à effectuer les étapes suivantes :
Visual Studio 2019 avec la charge de travail de développement Azure. Vous pouvez commencer gratuitement avec Visual Studio 2019 Community Edition.
Un abonnement Azure. Si vous n’avez pas encore d’abonnement, vous pouvez créer un compte Azure gratuit.
Vous pouvez également créer un compte Azure Cosmos DB gratuit sans disposer d’un abonnement Azure.
Une base de données Azure Cosmos DB pour Gremlin avec une collection illimitée. Pour commencer, accédez à Azure Cosmos DB pour Gremlin dans .NET.
Git. Pour commencer, accédez à la page des téléchargements Git.
Clone
Pour exécuter cet exemple, utilisez la commande suivante :
git clone https://github.com/Azure-Samples/azure-cosmos-graph-bulk-executor.git
Pour obtenir l’exemple, accédez à .\azure-cosmos-graph-bulk-executor\dotnet\src\
.
Exemple
IGraphBulkExecutor graphBulkExecutor = new GraphBulkExecutor("MyConnectionString", "myDatabase", "myContainer");
List<IGremlinElement> gremlinElements = new List<IGremlinElement>();
gremlinElements.AddRange(Program.GenerateVertices(Program.documentsToInsert));
gremlinElements.AddRange(Program.GenerateEdges(Program.documentsToInsert));
BulkOperationResponse bulkOperationResponse = await graphBulkExecutor.BulkImportAsync(
gremlinElements: gremlinElements,
enableUpsert: true);
Execute
Modifiez les paramètres comme le montre le tableau suivant :
Paramètre | Description |
---|---|
ConnectionString |
La chaîne de connexion de votre service que vous trouvez dans la section Clés de votre compte Azure Cosmos DB pour Gremlin. Il est au format suivant : AccountEndpoint=https://<account-name>.documents.azure.com:443/;AccountKey=<account-key>; . |
DatabaseName , ContainerName |
Noms de la base de données et du conteneur cibles. |
DocumentsToInsert |
Nombre de documents à générer (pertinent uniquement pour les données synthétiques). |
PartitionKey |
Garantit qu’une clé de partition est spécifiée avec chaque document pendant l’ingestion des données. |
NumberOfRUs |
Est pertinent uniquement si un conteneur n’existe pas déjà et qu’il doit être créé pendant l’exécution. |
Téléchargez l’exemple d’application complet dans .NET.
Java
Exemple d’utilisation
L’exemple d’application suivant montre comment utiliser le package GraphBulkExecutor. Les exemples utilisent soit les annotations d’objet domain, soit directement les objets POJO (c’est-à-dire les objets Java). Il est recommandé d’essayer les deux approches pour déterminer ce qui répond le mieux à vos exigences en matière d’implémentation et de performances.
Clone
Pour utiliser l’exemple, exécutez la commande suivante :
git clone https://github.com/Azure-Samples/azure-cosmos-graph-bulk-executor.git
Pour obtenir l’exemple, accédez à .\azure-cosmos-graph-bulk-executor\java\
.
Prérequis
Pour exécuter cet exemple, vous devez disposer des logiciels suivants :
- OpenJDK 11
- Maven
- Un compte de base de données Azure Cosmos DB configuré pour utiliser l’API Gremlin
Exemple
private static void executeWithPOJO(Stream<GremlinVertex> vertices,
Stream<GremlinEdge> edges,
boolean createDocs) {
results.transitionState("Configure Database");
UploadWithBulkLoader loader = new UploadWithBulkLoader();
results.transitionState("Write Documents");
loader.uploadDocuments(vertices, edges, createDocs);
}
Configuration
Pour exécuter l’exemple, reportez-vous à la configuration suivante et modifiez-la.
Le fichier /resources/application.properties définit les données qui sont nécessaires pour configurer Azure Cosmos DB. Les valeurs nécessaires sont décrites dans le tableau suivant :
Propriété | Description |
---|---|
sample.sql.host |
Valeur fournie par Azure Cosmos DB. Vérifiez que vous utilisez l’URI du SDK .NET, que vous trouverez dans la section Vue d’ensemble du compte Azure Cosmos DB. |
sample.sql.key |
Vous pouvez obtenir la clé primaire ou secondaire à partir de la section Clés du compte Azure Cosmos DB. |
sample.sql.database.name |
Nom de la base de données du compte Azure Cosmos DB sur laquelle exécuter l’exemple. Si aucune base de données n’est trouvée, l’exemple de code en crée une. |
sample.sql.container.name |
Nom du conteneur de la base de données sur lequel exécuter l’exemple. Si aucun conteneur n’est trouvé, l’exemple de code en crée un. |
sample.sql.partition.path |
Si vous devez créer le conteneur, utilisez cette valeur pour définir le chemin partitionKey . |
sample.sql.allow.throughput |
Le conteneur sera mis à jour pour utiliser la valeur de débit définie ici. Si vous explorez différentes options de débit pour répondre à vos besoins en performances, veillez à réinitialiser le débit du conteneur lorsque vous avez terminé votre exploration. Il existe des coûts associés à la sortie du conteneur approvisionné avec un débit plus élevé. |
Execute
Une fois que vous avez modifié la configuration en fonction de votre environnement, exécutez la commande suivante :
mvn clean package
Pour plus de sécurité, vous pouvez également exécuter les tests d’intégration en définissant la valeur skipIntegrationTests
sur false
dans pom.xml.
Une fois que vous avez correctement exécuté les tests unitaires, vous pouvez exécuter l’exemple de code :
java -jar target/azure-cosmos-graph-bulk-executor-1.0-jar-with-dependencies.jar -v 1000 -e 10 -d
L’exécution de la commande précédente exécute l’exemple avec un petit lot (1 000 sommets et environ 5 000 arêtes). Utilisez les arguments de ligne de commande des sections suivantes pour ajuster les volumes à exécuter et choisir la version d’exemple à exécuter.
Arguments de ligne de commande
Plusieurs arguments de ligne de commande sont disponibles pendant l’exécution de cet exemple, comme le décrit le tableau suivant :
Argument | Description |
---|---|
--vertexCount (-v ) |
Indique à l’application le nombre de sommets Person à générer. |
--edgeMax (-e ) |
Indique à l’application le nombre maximal d’arêtes à générer pour chaque sommet. Le générateur sélectionne de manière aléatoire un nombre compris entre 1 et la valeur que vous spécifiez. |
--domainSample (-d ) |
Indique à l’application d’exécuter l’exemple à l’aide des structures de domaine Person et Relationship au lieu des POJO GraphBulkExecutors , GremlinVertex et GremlinEdge . |
--createDocuments (-c ) |
Indique à l’application d’utiliser des opérations create . Si l’argument n’est pas présent, l’application utilisera par défaut des opérations upsert . |
Informations détaillées sur les exemples
Sommet Person
La classe Person est un objet Domain simple qui est décoré de plusieurs annotations afin d’aider à sa transformation en classe GremlinVertex
, comme décrit dans le tableau suivant :
Annotation de classe | Description |
---|---|
GremlinVertex |
Utilise le paramètre facultatif label pour définir tous les sommets que vous créez à l’aide de cette classe. |
GremlinId |
Utilisé pour définir le champ qui sera utilisé comme valeur ID . Le nom du champ de la classe Person est ID, mais il n’est pas obligatoire. |
GremlinProperty |
Utilisé dans le champ email pour modifier le nom de la propriété lorsque celle-ci est stockée dans la base de données. |
GremlinPartitionKey |
Utilisé pour définir le champ de la classe qui contient la clé de partition. Le nom de champ que vous fournissez doit correspondre à la valeur définie par le chemin de partition du conteneur. |
GremlinIgnore |
Utilisé pour exclure le champ isSpecial de la propriété écrite dans la base de données. |
Classe RelationshipEdge
La classe RelationshipEdge
est un objet Domain polyvalent. À l’aide de l’annotation d’étiquette au niveau du champ, vous pouvez créer une collection dynamique de types d’arêtes, comme indiqué dans le tableau suivant :
Annotation de classe | Description |
---|---|
GremlinEdge |
La décoration GremlinEdge de la classe définit le nom du champ pour la clé de partition spécifiée. Lorsque vous créez un document d’arête, la valeur affectée provient des informations des sommets sources. |
GremlinEdgeVertex |
Deux instances de GremlinEdgeVertex sont définies, une pour chaque côté de l’arête (source et destination). Dans l’exemple, le type de données du champ est GremlinEdgeVertexInfo . Les informations fournies par la classe GremlinEdgeVertex sont nécessaires pour que l’arête soit correctement créée dans la base de données. Une autre option consisterait à faire en sorte que le type de données des sommets soit une classe décorée avec les annotations GremlinVertex . |
GremlinLabel |
L’exemple d’arête utilise un champ pour définir la valeur label . Celle-ci permet de définir différentes étiquettes, car elle utilise la même classe Domain de base. |
Sortie expliquée
La console termine son exécution avec une chaîne JSON décrivant le temps d’exécution de l’exemple. La chaîne JSON contient les informations suivantes :
Chaîne JSON | Description |
---|---|
startTime | System.nanoTime() à laquelle le processus a démarré. |
endTime | Le System.nanoTime() lorsque le processus s’est terminé. |
durationInNanoSeconds | La différence entre les valeurs endTime et startTime . |
durationInMinutes | La valeur durationInNanoSeconds , convertie en minutes. La valeur durationInMinutes est représentée sous la forme d’un nombre à virgule flottante, et non une valeur de temps. Par exemple, la valeur 2.5 correspond à 2 minutes et 30 secondes. |
vertexCount | Volume de sommets générés, qui doit correspondre à la valeur qui est passée dans l’exécution de la ligne de commande. |
edgeCount | Volume des arêtes générées, qui n’est pas statique et qui est généré avec un élément de caractère aléatoire. |
exception | Renseigné uniquement si une exception est levée lorsque vous tentez l’exécution. |
Tableau d’états
Le tableau d’états donne un aperçu du temps nécessaire à chaque étape de l’exécution. Les étapes sont décrites dans le tableau suivant :
Étape d’exécution | Description |
---|---|
Créer des exemples de sommets | Temps nécessaire pour fabriquer le volume demandé d’objets personne. |
Créer des exemples d’arêtes | Temps nécessaire pour fabriquer le volume demandé d’objets relation. |
Configurer la base de données | Temps nécessaire pour configurer la base de données, en fonction des valeurs fournies dans application.properties . |
Écrire des documents | Temps nécessaire pour écrire les documents dans la base de données. |
Chaque état contient les valeurs suivantes :
Valeur d’état | Description |
---|---|
stateName |
Nom de l’état signalé. |
startTime |
La valeur System.nanoTime() au démarrage de l’état. |
endTime |
La valeur System.nanoTime() à la fin de l’état. |
durationInNanoSeconds |
La différence entre les valeurs endTime et startTime . |
durationInMinutes |
La valeur durationInNanoSeconds , convertie en minutes. La valeur durationInMinutes est représentée sous la forme d’un nombre à virgule flottante, et non une valeur de temps. Par exemple, la valeur 2.5 correspond à 2 minutes et 30 secondes. |
Étapes suivantes
- Pour plus d’informations sur les classes et les méthodes définies dans cet espace de noms, consultez la documentation open source BulkExecutor Java.
- Consultez l’article Importer des données en bloc dans un compte d’API SQL Azure Cosmos DB à l’aide du kit SDK .NET. La documentation relative au mode En bloc fait partie du SDK .NET v3.