Compartir a través de


Conector de Spark de Azure Cosmos DB: control de rendimiento

SE APLICA A: NoSQL

El conector de Spark permite comunicarse con Azure Cosmos DB mediante Apache Spark. En este artículo se describe cómo funciona la característica de control de rendimiento. Consulte nuestros ejemplos de Spark en GitHub para empezar a usar el control de rendimiento.

En este artículo se documenta el uso de grupos de control del rendimiento globales en el conector de Spark de Azure Cosmos DB, pero la funcionalidad también está disponible en el SDK de Java. En el SDK, puede utilizar grupos de control de caudal globales y locales para limitar el consumo de unidades de solicitud (RU) en el contexto de una única instancia de conexión de cliente. Por ejemplo, puede aplicar esto a diferentes operaciones dentro de un solo microservicio, o quizás a un único programa de carga de datos. Para obtener más información, consulte cómo usar el control de rendimiento en el SDK de Java.

Advertencia

El control de rendimiento no se admite para el modo de puerta de enlace. Actualmente, para cuentas Azure Cosmos DB sin servidor, si se intenta utilizar targetThroughputThreshold para definir un porcentaje, se producirá un error. Solo se puede proporcionar un valor absoluto para el rendimiento/RU objetivo mediante spark.cosmos.throughputControl.targetThroughput.

¿Por qué es importante el control de rendimiento?

El control de rendimiento ayuda a aislar las necesidades de rendimiento de las aplicaciones que se ejecutan en un contenedor. El control de rendimiento limita la cantidad de RU que puede consumir un cliente de Spark específico.

Varios escenarios avanzados se benefician del control de caudal del lado del cliente:

  • Las distintas operaciones y tareas tienen prioridades diferentes: puede haber una necesidad de evitar que las transacciones normales se limiten debido a las actividades de ingesta o copia de datos. Algunas operaciones o tareas no son sensibles a la latencia y son más tolerantes a las limitaciones que otras.
  • Proporcionar imparcialidad o aislamiento a distintos usuarios o inquilinos: una aplicación normalmente tiene muchos usuarios. Algunos usuarios pueden enviar demasiadas solicitudes, que consumen todo el caudal disponible y provocan la estrangulación de otros.
  • Equilibrio de carga del rendimiento entre distintos clientes de Azure Cosmos DB: en algunos casos de uso, es importante asegurarse de que todos los clientes obtengan una distribución equilibrada (igual) del rendimiento.

El control de rendimiento ofrece la posibilidad de que el nivel de la limitación de velocidad de RU sea más granular según sea necesario.

¿Cómo funciona el control de rendimiento?

Para configurar el control de rendimiento para el conector de Spark, primero debe crear un contenedor que defina los metadatos del control de rendimiento. La clave de partición es groupId y ttl está habilitada. En este caso, creará este contenedor mediante Spark SQL y lo llamará ThroughputControl:

    %sql
    CREATE TABLE IF NOT EXISTS cosmosCatalog.`database-v4`.ThroughputControl 
    USING cosmos.oltp
    OPTIONS(spark.cosmos.database = 'database-v4')
    TBLPROPERTIES(partitionKeyPath = '/groupId', autoScaleMaxThroughput = '4000', indexingPolicy = 'AllProperties', defaultTtlInSeconds = '-1');

El ejemplo anterior crea un contenedor con autoescala. Si prefiere el aprovisionamiento estándar, puede reemplazar autoScaleMaxThroughput por manualThroughput en su lugar.

Importante

La clave de partición debe definirse como /groupId y ttl debe estar habilitado para que la característica de control de rendimiento funcione.

En la configuración de Spark de una aplicación específica, puede especificar parámetros para la carga de trabajo. En el ejemplo siguiente se establece el control de rendimiento como enabled. En el ejemplo se define un parámetro de grupo name de control de rendimiento y un parámetro targetThroughputThreshold. También se definen los parámetros database y container en los que se mantiene el grupo de control de rendimiento:

    "spark.cosmos.throughputControl.enabled" -> "true",
    "spark.cosmos.throughputControl.name" -> "SourceContainerThroughputControl",
    "spark.cosmos.throughputControl.targetThroughputThreshold" -> "0.95", 
    "spark.cosmos.throughputControl.globalControl.database" -> "database-v4", 
    "spark.cosmos.throughputControl.globalControl.container" -> "ThroughputControl"

En el ejemplo anterior, el targetThroughputThreshold parámetro se define como 0.95. La limitación de velocidad se produce (y las solicitudes se reintentan) cuando los clientes consumen más del 95 por ciento (+/- 5-10 por ciento) del rendimiento asignado al contenedor. Esta configuración se almacena como un documento en el contenedor de caudal, que tiene el aspecto de este ejemplo:

    {
        "id": "ZGF0YWJhc2UtdjQvY3VzdG9tZXIvU291cmNlQ29udGFpbmVyVGhyb3VnaHB1dENvbnRyb2w.info",
        "groupId": "database-v4/customer/SourceContainerThroughputControl.config",
        "targetThroughput": "",
        "targetThroughputThreshold": "0.95",
        "isDefault": true,
        "_rid": "EHcYAPolTiABAAAAAAAAAA==",
        "_self": "dbs/EHcYAA==/colls/EHcYAPolTiA=/docs/EHcYAPolTiABAAAAAAAAAA==/",
        "_etag": "\"2101ea83-0000-1100-0000-627503dd0000\"",
        "_attachments": "attachments/",
        "_ts": 1651835869
    }

El control de rendimiento no realiza el precálculo de RU de cada operación. En su lugar, realiza un seguimiento de los usos de RU después de la operación en función del encabezado de respuesta. Como tal, el control del caudal se basa en una aproximación y no garantiza que la cantidad de caudal esté disponible para el grupo en un momento determinado.

Por ejemplo, si la RU configurada es tan baja que una sola operación puede usarla al completo, el control de rendimiento no puede evitar que la RU supere el límite configurado. El control de rendimiento funciona mejor cuando el límite configurado es mayor que cualquier operación única que un cliente del grupo de control específico pueda ejecutar.

Al leer a través de la consulta o la fuente de cambios, debe configurar el tamaño de página en spark.cosmos.read.maxItemCount (valor predeterminado 1000) para que sea una cantidad modesta. De este modo, el control de rendimiento del cliente se puede recalcular con mayor frecuencia y reflejarse con mayor precisión en cualquier momento específico. Sin embargo, al usar el control de rendimiento para un trabajo de escritura masivo, el número de documentos ejecutados en una sola solicitud se ajustará automáticamente en función de la velocidad de limitación para permitir que el control de rendimiento se inicie lo antes posible.

Advertencia

El targetThroughputThreshold parámetro es inmutable. Si cambia el valor del umbral de rendimiento de destino, se crea un nuevo grupo de control de rendimiento. (Si usa la versión 4.10.0 o posterior, puede tener el mismo nombre). Debe reiniciar todos los trabajos de Spark que usan el grupo si desea asegurarse de que todos consumen el nuevo umbral inmediatamente. De lo contrario, seleccionan el nuevo umbral después del siguiente reinicio.

Para cada cliente de Spark que usa el grupo de control de rendimiento, se crea un registro en el ThroughputControl contenedor, con unos ttl segundos. Como resultado, los documentos desaparecerán rápidamente si un cliente spark ya no se está ejecutando activamente. Este es un ejemplo:

    {
        "id": "Zhjdieidjojdook3osk3okso3ksp3ospojsp92939j3299p3oj93pjp93jsps939pkp9ks39kp9339skp",
        "groupId": "database-v4/customer/SourceContainerThroughputControl.config",
        "_etag": "\"1782728-w98999w-ww9998w9-99990000\"",
        "ttl": 10,
        "initializeTime": "2022-06-26T02:24:40.054Z",
        "loadFactor": 0.97636377638898,
        "allocatedThroughput": 484.89444487847,
        "_rid": "EHcYAPolTiABAAAAAAAAAA==",
        "_self": "dbs/EHcYAA==/colls/EHcYAPolTiA=/docs/EHcYAPolTiABAAAAAAAAAA==/",
        "_etag": "\"2101ea83-0000-1100-0000-627503dd0000\"",
        "_attachments": "attachments/",
        "_ts": 1651835869
    }

En cada registro de cliente, el atributo loadFactor representa la carga en el cliente determinado, en relación con otros clientes del grupo de control de rendimiento. El atributo allocatedThroughput muestra cuántas RU se asignan actualmente a este cliente. El conector de Spark ajustará el rendimiento asignado para cada cliente en función de su carga. De este modo, cada cliente obtiene un recurso compartido del rendimiento disponible que es proporcional a su carga. Todos los clientes juntos no consumen más del total asignado para el grupo de control de rendimiento al que pertenecen.