Соединитель 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. В некоторых случаях важно убедиться, что все клиенты получают справедливую (равную) долю пропускной способности.
Управление пропускной способностью позволяет обеспечить более детализированное ограничение скорости ЕЗ при необходимости.
Как работает функция управления пропускной способностью?
Чтобы настроить управление пропускной способностью для соединителя 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
}
Управление пропускной способностью не выполняет предварительное вычисление единиц запросов для каждой операции. Вместо этого он отслеживает использование единиц запросов после операции на основе заголовка ответа. Таким образом, контроль пропускной способности основан на приближении и не гарантирует , что объем пропускной способности доступен для группы в любое время.
По этой причине, если настроенная единица запросов настолько низка, что одна операция может использовать ее все, управление пропускной способностью не может избежать превышения заданного предела. Управление пропускной способностью лучше всего работает, если настроенное ограничение превышает одну операцию, которую может выполнить клиент в конкретной группе элементов управления.
При чтении с помощью канала запросов или изменений необходимо настроить размер страницы 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
показывает, сколько ЕЗ в настоящее время выделено этому клиенту. Соединитель Spark настраивает выделенную пропускную способность для каждого клиента на основе его нагрузки. Таким образом, каждый клиент получает общую долю доступной пропускной способности, пропорциональной его нагрузке. Все клиенты вместе не используют больше общего объема, выделенного для группы управления пропускной способностью, к которой они принадлежат.
Связанный контент
- См . примеры Spark в GitHub.
- Узнайте, как управлять данными с помощью соединителя Spark 3 OLTP Azure Cosmos DB для API для NoSQL.
- Узнайте больше об Apache Spark.