Importer des données en bloc dans un compte Azure Cosmos DB for NoSQL à l’aide du kit SDK .NET
S’APPLIQUE À : NoSQL
Ce tutoriel vous montre comment créer une application console .NET qui optimise le débit approvisionné (RU/s) requis pour importer des données dans Azure Cosmos DB.
Dans cet article, vous allez lire des données à partir d’un exemple de source de données et les importer dans un conteneur Azure Cosmos DB. Ce tutoriel utilise la Version 3.0+ du kit de développement logiciel (SDK) .NET Azure Cosmos DB, qui peut être ciblé sur le .NET Framework ou .NET Core.
Ce didacticiel contient les sections suivantes :
- Création d’un compte Azure Cosmos DB
- Configuration de votre projet
- Connexion à un compte Azure Cosmos DB avec prise en charge de l’exécution en bloc activée
- Effectuer une importation de données via des opérations de création simultanées
Prérequis
Avant de suivre les instructions de cet article, vérifiez que vous disposez bien des ressources suivantes :
Un compte Azure actif. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
Vous pouvez essayer Azure Cosmos DB gratuitement sans abonnement Azure, et sans engagement requis. Vous pouvez également créer un compte de niveau gratuit Azure Cosmos DB qui propose gratuitement 1000 RU et 25 Go de stockage. Vous pouvez également utiliser l’émulateur Azure Cosmos DB avec l’URI
https://localhost:8081
. Pour obtenir la clé à utiliser avec l’émulateur, consultez Authentification des demandes.Kit de développement logiciel (SDK) .NET Core 3 Pour connaître la version disponible dans votre environnement, exécutez
dotnet --version
.
Étape 1 : Création d’un compte Azure Cosmos DB
Créez un compte Azure Cosmos DB for NoSQL à partir du portail Azure ou à l’aide de l’émulateur Azure Cosmos DB.
Étape 2 : Configurer votre projet .NET
Ouvrez l’invite de commandes Windows ou une fenêtre de terminal à partir de votre ordinateur local. Vous allez exécuter toutes les commandes des sections suivantes à partir de l’invite de commandes ou du terminal. Exécutez la commande dotnet new suivante pour créer une application nommée bulk-import-demo.
dotnet new console -n bulk-import-demo
Déplacez vos répertoires vers le dossier d’application nouvellement créé. Vous pouvez générer l’application avec :
cd bulk-import-demo
dotnet build
La sortie attendue de la build doit ressembler à ceci :
Restore completed in 100.37 ms for C:\Users\user1\Downloads\CosmosDB_Samples\bulk-import-demo\bulk-import-demo.csproj.
bulk -> C:\Users\user1\Downloads\CosmosDB_Samples\bulk-import-demo \bin\Debug\netcoreapp2.2\bulk-import-demo.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:34.17
Étape 3 : Ajouter le package Azure Cosmos DB
Tout en restant dans le répertoire de l’application, installez la bibliothèque de client Azure Cosmos DB pour .NET Core à l’aide de la commande dotnet add Package.
dotnet add package Microsoft.Azure.Cosmos
Étape 4 : Obtenir les informations d’identification de votre compte Azure Cosmos DB
L’exemple d’application doit s’authentifier auprès de votre compte Azure Cosmos DB. Pour vous authentifier, vous devez transmettre les informations d’identification du compte Azure Cosmos DB à l’application. Pour obtenir les informations d’identification de votre compte Azure Cosmos DB, procédez comme suit :
- Connectez-vous au portail Azure.
- Accédez à votre compte Azure Cosmos DB.
- Ouvrez le volet Clés et copiez l’URI et la CLÉ PRIMAIRE de votre compte.
Si vous utilisez l’émulateur Azure Cosmos DB, obtenez les informations d’identification à partir de cet article.
Étape 5 : Initialiser l’objet CosmosClient avec prise en charge de l’exécution en bloc
Ouvrez le fichier Program.cs
généré dans un éditeur de code. Vous allez créer une nouvelle instance CosmosClient avec l’exécution en bloc activée et l’utiliser pour effectuer des opérations sur Azure Cosmos DB.
Commencez par remplacer la méthode Main
par défaut et définir les variables globales. Ces variables globales incluront le point de terminaison, les clés d’autorisation, le nom de la base de données, le conteneur que vous créez ainsi que le nombre d’éléments que vous allez insérer en bloc. Veillez à remplacer les valeurs correspondant à endpointURL et aux clés d’autorisation en fonction de votre environnement.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Azure.Cosmos;
public class Program
{
private const string EndpointUrl = "https://<your-account>.documents.azure.com:443/";
private const string AuthorizationKey = "<your-account-key>";
private const string DatabaseName = "bulk-tutorial";
private const string ContainerName = "items";
private const int AmountToInsert = 300000;
static async Task Main(string[] args)
{
}
}
Dans la méthode Main
, ajoutez le code suivant pour initialiser l’objet CosmosClient :
CosmosClient cosmosClient = new CosmosClient(EndpointUrl, AuthorizationKey, new CosmosClientOptions() { AllowBulkExecution = true });
Notes
Une fois l’exécution en bloc spécifiée dans CosmosClientOptions, elles sont effectivement immuables pour la durée de vie du CosmosClient. La modification des valeurs n’aura aucun effet.
Une fois l’exécution en bloc activée, CosmosClient regroupe en interne les opérations simultanées en appels de service unique. Ainsi, il optimise l’utilisation du débit en distribuant les appels de service entre les partitions, puis en attribuant les résultats individuels aux appelants d’origine.
Vous pouvez ensuite créer un conteneur pour stocker tous les éléments. Définissez /pk
en tant que clé de partition, 50 000 RU/s en tant que débit approvisionné, et une stratégie d’indexation personnalisée qui exclut tous les champs afin d'optimiser le débit d’écriture. Ajoutez le code suivant après l’instruction d’initialisation CosmosClient :
Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync(Program.DatabaseName);
await database.DefineContainer(Program.ContainerName, "/pk")
.WithIndexingPolicy()
.WithIndexingMode(IndexingMode.Consistent)
.WithIncludedPaths()
.Attach()
.WithExcludedPaths()
.Path("/*")
.Attach()
.Attach()
.CreateAsync(50000);
Étape 6 : Remplir une liste de tâches simultanées
Pour bénéficier de la prise en charge de l’exécution en bloc, créez une liste de tâches asynchrones en fonction de la source de données et des opérations que vous souhaitez effectuer, puis utilisez Task.WhenAll
pour les exécuter simultanément.
Commencez par utiliser des données « fictives » pour générer une liste d’éléments à partir du modèle de données. Dans une application réelle, les éléments proviennent de la source de données souhaitée.
Tout d’abord, ajoutez le package fictif à la solution à l’aide de la commande dotnet add package.
dotnet add package Bogus
Définissez les éléments que vous souhaitez enregistrer. Vous devez définir la classe Item
dans le fichier Program.cs
:
public class Item
{
public string id {get;set;}
public string pk {get;set;}
public string username{get;set;}
}
Ensuite, créez une fonction d’assistance au sein la classe Program
. Cette fonction d’assistance obtient le nombre d’éléments que vous avez définis à des fins d'insertion et génère des données aléatoires :
private static IReadOnlyCollection<Item> GetItemsToInsert()
{
return new Bogus.Faker<Item>()
.StrictMode(true)
//Generate item
.RuleFor(o => o.id, f => Guid.NewGuid().ToString()) //id
.RuleFor(o => o.username, f => f.Internet.UserName())
.RuleFor(o => o.pk, (f, o) => o.id) //partitionkey
.Generate(AmountToInsert);
}
Utilisez la fonction d’assistance pour initialiser une liste de documents à utiliser :
IReadOnlyCollection<Item> itemsToInsert = Program.GetItemsToInsert();
Utilisez ensuite la liste de documents pour créer des tâches simultanées et remplissez la liste des tâches afin d’insérer les éléments dans le conteneur. Pour effectuer cette opération, ajoutez le code suivant à la classe Program
:
Container container = database.GetContainer(ContainerName);
List<Task> tasks = new List<Task>(AmountToInsert);
foreach (Item item in itemsToInsert)
{
tasks.Add(container.CreateItemAsync(item, new PartitionKey(item.pk))
.ContinueWith(itemResponse =>
{
if (!itemResponse.IsCompletedSuccessfully)
{
AggregateException innerExceptions = itemResponse.Exception.Flatten();
if (innerExceptions.InnerExceptions.FirstOrDefault(innerEx => innerEx is CosmosException) is CosmosException cosmosException)
{
Console.WriteLine($"Received {cosmosException.StatusCode} ({cosmosException.Message}).");
}
else
{
Console.WriteLine($"Exception {innerExceptions.InnerExceptions.FirstOrDefault()}.");
}
}
}));
}
// Wait until all are done
await Task.WhenAll(tasks);
Toutes ces opérations de point simultanées sont exécutées ensemble (en bloc), comme décrit dans la section Introduction.
Étape 7 : Exécuter l’exemple
Pour exécuter l’exemple, vous pouvez tout simplement utiliser la commande dotnet
:
dotnet run
Obtenir l'exemple complet
Si vous n’avez pas le temps de suivre les étapes de ce didacticiel, ou que vous voulez simplement télécharger les exemples de code, vous pouvez les obtenir à partir de GitHub.
Après avoir cloné le projet, assurez-vous de mettre à jour les informations d’identification souhaitées dans Program.cs.
Pour exécuter l'exemple, vous utilisez le répertoire du référentiel et dotnet
:
cd cosmos-dotnet-bulk-import-throughput-optimizer
dotnet run
Étapes suivantes
Dans ce tutoriel, vous avez effectué les tâches suivantes :
- Création d’un compte Azure Cosmos DB
- Configuration de votre projet
- Connexion à un compte Azure Cosmos DB avec prise en charge de l’exécution en bloc activée
- Effectuer une importation de données via des opérations de création simultanées
Vous pouvez maintenant passer au tutoriel suivant :
Vous tentez d’effectuer une planification de la capacité pour une migration vers Azure Cosmos DB ? Vous pouvez utiliser les informations sur votre cluster de bases de données existant pour la planification de la capacité.
- Si vous ne connaissez que le nombre de vCore et de serveurs présents dans votre cluster de bases de données existant, lisez Estimation des unités de requête à l’aide de vCore ou de processeurs virtuels.
- Si vous connaissez les taux de requêtes typiques de votre charge de travail de base de données actuelle, lisez la section concernant l’estimation des unités de requête à l’aide du planificateur de capacité Azure Cosmos DB