Настраиваемое секционирование в Azure Synapse Link для Azure Cosmos DB

Область применения: Nosql Mongodb Гремлин

Пользовательское секционирование позволяет разделить данные аналитического хранилища по полям, которые часто используются в качестве фильтров в аналитических запросах, что приводит к повышению производительности запросов.

В этой статье вы узнаете, как секционировать данные в аналитическом хранилище Azure Cosmos DB с помощью ключей, критически важных для аналитических рабочих нагрузок. Здесь также объясняется, как воспользоваться преимуществами улучшенной производительности запроса с помощью очистки разделов. Кроме того, вы узнаете, как настраиваемое секционирование повышает производительность запросов, если рабочие нагрузки имеют значительное количество обновлений или удалений.

Примечание.

Учетные записи и контейнеры Azure Cosmos DB должны включать Azure Synapse Link , чтобы воспользоваться преимуществами пользовательского секционирования.

Как это работает?

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

Секционирование можно запустить в записной книжке Azure Synapse Spark с помощью Azure Synapse Link. Вы можете запланировать его выполнение в качестве фонового задания один или два раза в день, но при необходимости его можно выполнять чаще.

Примечание.

Это секционированное хранилище указывает на основную учетную запись хранения ADLS 2-го поколения, связанную с рабочей областью Azure Synapse.

Architecture of partitioned store in Azure Synapse Link for Azure Cosmos DB

Секционированное хранилище содержит аналитические данные Azure Cosmos DB вплоть до последней метки времени выполнения задания секционирования. При запросе аналитических данных с помощью фильтров ключей секции Synapse Link автоматически объединяет секционированные данные хранилища с последними изменениями в аналитическом хранилище. Таким образом вы получаете последние результаты по своим запросам. Хотя Synapse Link и объединяет данные перед отправкой запроса, разница не записывается обратно в секционированное хранилище. По мере расширения разницы между данными в аналитическом и секционированном хранилищах время запроса для секционированных данных может различаться. Активация задания секционирования чаще уменьшает эту разностную нагрузку. Каждый раз при выполнении задания секционирования обрабатываются только добавочные изменения в аналитическом хранилище, а не полный набор данных.

Сценарии использования

При запросе аналитических данных в Azure Cosmos DB не обязательно использовать секционированное хранилище. Вы можете напрямую запрашивать те же данные с помощью Synapse Link с уже имеющемся аналитическим хранилищем. Вы можете включить секционированное хранилище, если у вас есть следующие обязательные компоненты:

  • общие фильтры аналитических запросов, которые можно использовать в качестве столбцов разделов;
  • столбцы разделов с низкой кратностью;
  • столбец раздела, который распределяет данные равномерно по разделам;
  • большой объем операций обновления или удаления;
  • медленный прием данных.

Если вы запрашиваете динамические данные с помощью фильтров запросов, отличных от ключей секций, рекомендуется напрямую запрашивать аналитическое хранилище.

Льготы

Уменьшенное сканирование данных при очистке разделов

Так как данные, соответствующие каждому уникальному ключу раздела, находятся в секционированном хранилище, то когда вы используете ключ раздела в качестве фильтра запроса, выполнение запроса может привести к урезанию базовых данных и сканированию только необходимых данных. Благодаря сканированию ограниченных данных, очистка разделов повышает производительность аналитического запроса.

Гибкость для секционирования аналитических данных

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

Повышение производительности запросов

В дополнение к улучшениям запросов, полученным в результате очистки разделов, пользовательское секционирование также улучшает производительность запроса для приведенных ниже рабочих нагрузок.

  • Обновление и удаление больших рабочих нагрузок. Вместо того, чтобы отслеживать несколько версий записей в аналитическом хранилище и загружать их каждый раз во время выполнения запроса, секционированное хранилище содержит только последнюю версию данных. Эта возможность значительно повышает производительность запросов при обновлении и удалении тяжелых рабочих нагрузок.

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

Гарантия транзакции

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

Безопасность

Если вы настроили управляемые частные конечные точки для аналитического хранилища, рекомендуется также добавить управляемые частные конечные точки для секционированного хранилища. Секционированное хранилище — это основная учетная запись хранения, связанная с рабочей областью Synapse.

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

Стратегии секционирования

Для аналитических данных можно использовать один или несколько ключей разделов. Если вы используете несколько ключей секций, ниже приведены некоторые рекомендации по секционированию данных:

  • Использование составных ключей

    Скажем, вы хотите часто запрашивать данные на основе ключа 1 и ключа 2.

    Например, "Запросить все записи, где ReadDate = 2021–10–08 и Location = Sydney".

    В этом случае использование составных ключей является более эффективным для поиска всех записей, соответствующих readDate, и записей, соответствующих расположению в этом элементе ReadDate.

    Пример параметров конфигурации:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    Теперь можно запрашивать на основе фильтра Location:

    • Вы можете запросить аналитическое хранилище напрямую. Секционированное хранилище сканирует все записи по readDate сначала, а затем по расположению. Таким образом, в зависимости от рабочей нагрузки и кратности аналитических данных вы можете получить лучшие результаты, отправив запрос напрямую в аналитическое хранилище.
    • Вы также можете выполнить другое задание секционирования, основанное на фильтре Location в том же секционированном хранилище.
  • Использование нескольких отдельных ключей

    Скажем, вам нужно часто отправлять запросы на основе ReadDate, а другие запросы на основе Location.

    Например,

    • Запрос для всех записей, где ReadDate = 2021–10–08
    • Запрос для всех записей, где Location = Sydney

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

    Задание 1:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    Задание 2:

    .option("spark.cosmos.asns.partition.keys", "Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    Обратите внимание, что сейчас это не эффективно для частого запроса на основе фильтров ReadDate и Location вместе при секционированиях. Составные ключи позволяют повысить производительность запросов в этом случае.

Ограничения

  • Пользовательское секционирование доступно только для Azure Synapse Spark. Пользовательское секционирование в настоящее время не поддерживается для бессерверных пулов SQL.

  • Сейчас секционированное хранилище может только указать на основную учетную запись хранения, связанную с рабочей областью Synapse. Выбор пользовательских учетных записей хранения на данный момент не поддерживается.

  • Настраиваемое секционирование доступно только для API noSQL в Azure Cosmos DB. API для MongoDB, Gremlin и Cassandra находятся в предварительной версии в настоящее время.

Цены

Помимо цен на Azure Synapse Link, при использовании пользовательского секционирования взимается следующая плата:

  • Вам будет выставлен счет за использование пулов Synapse Apache Spark при выполнении заданий секционирования в аналитическом хранилище.

  • Секционированные данные хранятся в основной учетной записи Azure Data Lake Storage 2-го поколения, связанной с рабочей областью Azure Synapse Analytics. Затраты, связанные с использованием хранилища и транзакций ADLS 2-го поколения. Эти затраты определяются на основе хранилища, требуемого для хранения секционированных аналитических данных и обработанных данных для аналитических запросов в Synapse соответственно. Дополнительные сведения о ценах см. в статье о ценах на Azure Data Lake Storage 2-го поколения.

Часто задаваемые вопросы

Как часто следует запускать задания пользовательского секционирования?

Существует несколько факторов, таких как добавочный объем данных, требования к задержкам запросов и т. д., которые определяют частоту выполнения заданий пользовательского секционирования. Его можно запускать один раз в день или раз в несколько часов. Вы можете запланировать задание секционирования чаще, если объем входящих данных слишком большой, а ожидаемая задержка запроса низкая. Чтобы процесс очистки разделов был эффективным, сперва необходимо собрать добавочные данные в аналитическом хранилище.

Содержатся ли последние данные в результатах запроса при выполнении задания секционирования?

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

Может ли пользовательское секционирование использовать проверку подлинности связанной службы в Azure Synapse Analytics?

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

Можно ли позже изменить ключ раздела для заданного контейнера?

Да, вы можете изменить ключ раздела для заданного контейнера, а определение нового ключа раздела создаст секционированное хранилище.

Примечание.

Определение ключа раздела является частью пути к секционированному хранилищу.

Могут ли разные ключи разделов указывать на один и тот же BasePath?

Да, вы можете указать несколько ключей разделов в одном секционированном хранилище, как показано в таблице ниже:

.option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
.option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \

Следующие шаги

Дополнительные сведения см. в следующих документах: