Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
SE APLICA A: NoSQL
En este tutorial se muestra cómo compilar una aplicación de consola de .NET que optimice la capacidad de proceso aprovisionada (RU/s) necesaria para importar datos en Azure Cosmos DB.
En este artículo, leerá los datos de un origen de datos de ejemplo e importará en un contenedor de Azure Cosmos DB.
Esta tutorial abarca lo siguiente:
- Creación de una cuenta de Azure Cosmos DB
- Configuración del proyecto
- Conexión a una cuenta de Azure Cosmos DB con compatibilidad para la ejecución en bloque habilitada
- Realización de una importación de datos mediante operaciones simultáneas de creación
Requisitos previos
Antes de seguir las instrucciones del presente artículo, asegúrese de tener los siguientes recursos:
Una cuenta de Azure activa. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Puede crear una cuenta de nivel gratis de Azure Cosmos DB, con las primeras 1000 RU/s y 25 GB de almacenamiento de forma gratuita. También puede usar el emulador de Azure Cosmos DB con un identificador URI
https://localhost:8081. Para obtener la clave que se va a usar con el emulador, consulte Autenticación de solicitudes.SDK de .NET Core 3. Puede comprobar qué versión está disponible en su entorno mediante la ejecución de
dotnet --version.
Este tutorial usa la versión 3.0+ del SDK de .NET de Azure Cosmos DB, cuyo destino puede ser .NET Framework o .NET Core.
Paso 1: Creación de una cuenta de Azure Cosmos DB
Cree una cuenta de Azure Cosmos DB para NoSQL desde Azure Portal o cree la cuenta mediante el emulador de Azure Cosmos DB.
Paso 2: Configuración del proyecto .NET
Abra el símbolo del sistema de Windows o una ventana de Terminal desde el equipo local. En las secciones siguientes todos los comandos se ejecutarán desde el símbolo del sistema o desde el terminal. Ejecute el siguiente comando dotnet new para crear una nueva aplicación con el nombre bulk-import-demo.
dotnet new console -n bulk-import-demo
Cambie el directorio a la carpeta de aplicaciones recién creada. Para compilar la aplicación:
cd bulk-import-demo
dotnet build
El resultado esperado de la compilación debe parecerse a lo siguiente:
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
Paso 3: Incorporación del paquete de Azure Cosmos DB
Mientras sigue en el directorio de aplicaciones, instale el paquete de la biblioteca cliente de Azure Cosmos DB para .NET Core con el comando dotnet add package.
dotnet add package Microsoft.Azure.Cosmos
Paso 4: Obtención de las credenciales de la cuenta de Azure Cosmos DB
La aplicación de ejemplo debe autenticarse para la cuenta de Azure Cosmos DB. Para hacer la autenticación, debe pasar las credenciales de cuenta de Azure Cosmos DB a la aplicación. Para obtener las credenciales de cuenta de Azure Cosmos DB, siga estos pasos:
- Inicie sesión en Azure Portal.
- Vaya a la cuenta de Azure Cosmos DB.
- Abra el panel Claves y copia el URI y la CLAVE PRINCIPAL de la cuenta.
Si usa el emulador de Azure Cosmos DB, obtenga las credenciales del emulador.
Paso 5: Inicialización del objeto CosmosClient con compatibilidad de ejecución en bloque
Abra el archivo Program.cs generado en un editor de código. Cree una nueva instancia de CosmosClient con la ejecución masiva habilitada y úsela para realizar operaciones en Azure Cosmos DB.
Empiece por sobrescribir el método predeterminado Main y definir las variables globales. Estas variables globales incluyen el punto de conexión y las claves de autorización, el nombre de la base de datos, el contenedor que creará y el número de elementos que insertará en masa. Asegúrese de reemplazar los valores de URL de punto de conexión y clave de autorización según su entorno.
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)
{
}
}
Dentro del método Main, agregue el siguiente código para inicializar el objeto CosmosClient:
CosmosClient cosmosClient = new CosmosClient(EndpointUrl, AuthorizationKey, new CosmosClientOptions() { AllowBulkExecution = true });
Nota
Una vez que se especifica la ejecución masiva en CosmosClientOptions, son inmutables de forma eficaz durante la vigencia de CosmosClient. Cambiar los valores no tiene ningún efecto.
Una vez habilitada la ejecución en bloque, CosmosClient agrupa internamente las operaciones simultáneas en llamadas de servicio únicas. De este modo, optimiza el uso de la capacidad de proceso, ya que distribuye las llamadas de servicio entre las particiones y, por último, asigna los resultados individuales a los llamadores originales.
Después, se puede crear un contenedor para almacenar todos los elementos. Defina /pk como clave de partición, 50000 RU/s como rendimiento aprovisionado y una directiva de indexación personalizada que excluye todos los campos para optimizar el rendimiento de escritura. Agregue el siguiente código después de la instrucción de inicialización de 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);
Paso 6: Rellenado de una lista de tareas simultáneas
Para aprovechar las ventajas de la compatibilidad con la ejecución en bloque, cree una lista de tareas asincrónicas en función del origen de los datos y de las operaciones que desee realizar, y use Task.WhenAll para ejecutarlas simultáneamente.
Empecemos por usar datos de Bogus para generar una lista de elementos a partir de nuestro modelo de datos. En una aplicación real, los elementos procederían del origen de datos deseado.
En primer lugar, agregue el paquete Bogus a la solución mediante el comando dotnet add package.
dotnet add package Bogus
Establezca la definición de los elementos que desea guardar. Debe definir la Item clase dentro del archivo Program.cs :
public class Item
{
public string id {get;set;}
public string pk {get;set;}
public string username{get;set;}
}
A continuación, cree una función auxiliar dentro de la clase Program. Esta función auxiliar obtiene el número de elementos que definió para insertar y genera datos aleatorios:
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);
}
Use la función auxiliar para inicializar una lista de documentos con los que trabajar:
IReadOnlyCollection<Item> itemsToInsert = Program.GetItemsToInsert();
A continuación, use la lista de documentos para crear tareas simultáneas y rellenar la lista de tareas para insertar los elementos en el contenedor. Para realizar esta operación, agregue el siguiente código a la clase 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);
Todas estas operaciones de punto simultáneos se ejecutan juntas (que se encuentran en masa) como se describe en la sección introducción.
Paso 7: Ejecución de la muestra
Puede ejecutar el ejemplo simplemente con el comando dotnet:
dotnet run
Obtención del ejemplo completo
Si no dispuso de tiempo para completar los pasos de este tutorial, o simplemente desea descargar los ejemplos de código, puede obtenerlos de GitHub.
Después de clonar el proyecto, asegúrese de actualizar las credenciales que desee en Program.cs.
El ejemplo se puede ejecutar cambiando al directorio del repositorio y usando dotnet:
cd cosmos-dotnet-bulk-import-throughput-optimizer
dotnet run
Pasos siguientes
¿Intenta planear la capacidad de una migración a Azure Cosmos DB? Para ello, puede usar información sobre el clúster de bases de datos existente.
- Si lo único que sabe es el número de núcleos virtuales y servidores del clúster de bases de datos existente, consulte la información sobre el cálculo de unidades de solicitud mediante núcleos virtuales o CPU virtuales.
- Si conoce las tasas de solicitudes típicas de la carga de trabajo de la base de datos actual, obtenga información sobre el cálculo de unidades de solicitud mediante la herramienta de planeamiento de capacidad de Azure Cosmos DB.