Поделиться через


Соединитель Spark Для Azure Cosmos DB: управление пропускной способностью

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Соединитель Spark позволяет взаимодействовать с Azure Cosmos DB с помощью Apache Spark. В этой статье описывается, как работает функция управления пропускной способностью. Ознакомьтесь с примерами Spark в GitHub, чтобы приступить к использованию функции управления пропускной способностью.

В этой статье описано использование глобальных групп управления пропускной способностью в соединителе Spark Для Azure Cosmos DB, но функциональные возможности также доступны в пакете SDK для Java. В пакете SDK можно использовать глобальные и локальные группы управления пропускной способностью для ограничения потребления единиц запросов (ЕЗ) в контексте одного экземпляра подключения клиента. Например, этот подход можно применить к различным операциям в одной микрослужбе или, возможно, к одной программе загрузки данных. Дополнительные сведения см. в статье об использовании управления пропускной способностью в пакете SDK для Java.

Предупреждение

Управление пропускной способностью не поддерживается для режима шлюза. В настоящее время для бессерверных учетных записей Azure Cosmos DB попытка targetThroughputThreshold определить процент результатов сбоя. Можно указать только абсолютное значение целевой пропускной способности/ЕЗ с помощью spark.cosmos.throughputControl.targetThroughput.

Почему управление пропускной способностью важно?

Управление пропускной способностью помогает изолировать потребности в производительности приложений, выполняемых в контейнере. Управление пропускной способностью ограничивает объем единиц запросов, которые может использовать конкретный клиент Spark.

Несколько расширенных сценариев получают преимущества от управления пропускной способностью на стороне клиента:

  • Различные операции и задачи имеют разные приоритеты: может потребоваться предотвратить регулирование обычных транзакций из-за приема данных или действий копирования. Некоторые операции или задачи не чувствительны к задержке и более терпимы к регулированию, чем другие.
  • Обеспечение справедливости и изоляции для разных пользователей или клиентов: приложение обычно имеет много пользователей. Некоторые пользователи могут отправлять слишком много запросов, которые используют всю доступную пропускную способность и вызывают регулирование других пользователей.
  • Балансировка пропускной способности между разными клиентами Azure Cosmos DB. В некоторых случаях важно убедиться, что все клиенты получают справедливую (равную) долю пропускной способности.

Управление пропускной способностью позволяет обеспечить более детализированное ограничение количества запросов (RUs) по мере необходимости.

Как работает функция управления пропускной способностью?

Чтобы настроить управление пропускной способностью для соединителя Spark, сначала создайте контейнер, определяющий метаданные элемента управления пропускной способностью. Ключ раздела — это groupId, и ttl включен. Здесь вы создадите этот контейнер с помощью Spark SQL и вызовите его 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');

В предыдущем примере создается контейнер с автомасштабированием. Если вы предпочитаете стандартную подготовку, можно заменить autoScaleMaxThroughput на manualThroughput.

Внимание

Ключ секции должен быть определен как /groupId и ttl должен быть включен для работы функции управления пропускной способностью.

В конфигурации Spark конкретного приложения можно указать параметры рабочей нагрузки. В следующем примере определяется контроль пропускной способности как enabled. В примере определяются параметр name группы управления пропускной способностью и параметр targetThroughputThreshold. Вы также определяете database параметры, container в которых поддерживается группа управления пропускной способностью:

    "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"

В предыдущем примере targetThroughputThreshold параметр определяется как 0,95. Ограничение скорости происходит (и запросы извлекаются) при использовании клиентами более 95 процентов (+/- 5-10 процентов) пропускной способности, выделенной контейнеру. Эта конфигурация хранится в виде документа в контейнере пропускной способности, который выглядит следующим образом:

    {
        "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
    }

Управление пропускной способностью не выполняет предварительное вычисление единиц запросов для каждой операции. Вместо этого он отслеживает использование единиц запросов (RU) на основе заголовка ответа после операции. Таким образом, контроль пропускной способности основан на приближении и не гарантирует , что объем пропускной способности доступен для группы в любое время.

По этой причине, если лимит запросов настроен настолько низко, что одна операция может использовать его полностью, контроль за пропускной способностью не сможет предотвратить превышение заданного лимита. Управление пропускной способностью лучше всего работает, если настроенное ограничение превышает одну операцию, которую может выполнить клиент в конкретной группе элементов управления.

При выполнении запросов или чтении ленты изменений, необходимо настроить размер страницы в spark.cosmos.read.maxItemCount (по умолчанию 1000) на умеренное значение. Таким образом, управление пропускной способностью клиента может пересчитываться с более высокой частотой и более точно отражаться в конкретный момент времени. При использовании управления пропускной способностью для задания записи с помощью массовой обработки количество документов, обрабатываемых в одном запросе, автоматически настраивается на основе скорости ограничения, чтобы управление пропускной способностью начиналось как можно раньше.

Предупреждение

Параметр targetThroughputThreshold неизменяем. При изменении порогового значения целевой пропускной способности создается новая группа управления пропускной способностью. (Если вы используете версию 4.10.0 или более поздней, она может иметь то же имя.) Чтобы обеспечить немедленное использование нового порогового значения, необходимо перезапустить все задания Spark, использующие группу. В противном случае они получают новое пороговое значение после следующего перезапуска.

Для каждого клиента Spark, использующего группу управления пропускной способностью, в контейнере создается запись ThroughputControl, действительная в течение нескольких секунд ttl. В результате документы исчезают быстро, если клиент Spark больше не работает. Приведем пример:

    {
        "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
    }

В каждой записи клиента loadFactor атрибут представляет нагрузку на конкретного клиента относительно других клиентов в группе управления пропускной способностью. Атрибут allocatedThroughput показывает, сколько RUs в настоящее время выделено этому клиенту. Соединитель Spark настраивает выделенную пропускную способность для каждого клиента на основе его нагрузки. Таким образом, каждый клиент получает общую долю доступной пропускной способности, пропорциональной его нагрузке. Все клиенты вместе не используют больше общего объема, выделенного для группы управления пропускной способностью, к которой они принадлежат.