Настройка настраиваемого секционирования для секционирования аналитических данных хранилища

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

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

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

Примечание.

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

Примечание.

Synapse Link для API Gremlin теперь находится в предварительной версии. Вы можете включить Synapse Link в новых или существующих графах с помощью Azure CLI. Дополнительные сведения о настройке см . здесь.

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

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

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

  • spark.cosmos.asns.execute.partitioning - логическое значение, которое активирует пользовательское секционирование. По умолчанию используется значение false.

  • spark.cosmos.asns.partition.keys - ключи раздела с использованием форматированной строки языка DDL. Например: ReadDate String.

  • spark.cosmos.asns.basePath - базовый путь к хранилищу на основной учетной записи хранения Synapes, для которого нужно выполнить секционирование.

Примечание.

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

При запуске пользовательского секционирования можно использовать перечисленные ниже необязательные параметры конфигурации.

  • spark.cosmos.asns.merge.partitioned.files — логическое значение, которое позволяет создавать по одному файлу для каждого значения раздела в каждом выполнении. По умолчанию используется значение false.

  • spark.cosmos.asns.partitioning.maxRecordsPerFile — максимальное количество записей в файле с одним разделом в секционированном хранилище. Если указана эта конфигурация и spark.cosmos.asns.merge.partitioned.files, новые файлы создаются после того, как количество записей превышает значение maxRecordsPerFile. Эта конфигурация обычно необходима только для первоначального секционирования больших коллекций. Значение по умолчанию — 1 000 000.

    Если установить значение maxRecordsPerFile, но не настроить spark.cosmos.asns.merge.partitioned.files, записи могут быть разделены на несколько файлов, прежде чем будет достигнуто значение maxRecordsPerFile. Разделение файлов также зависит от доступного параллелизма в пуле.

  • spark.cosmos.asns.partitioning.shuffle.partitions — управляет параллелизмом во время записи разделов в секционированное хранилище. Эта конфигурация необходима только для первоначального секционирования для больших коллекций. Задается значение, равное количеству доступных ядер в пуле Spark. Значение по умолчанию — 200. Более низкие значения могут тратить ресурсы, если пул не используется для других рабочих нагрузок. Как правило, более высокое значение не вызывает проблем, так как некоторые задачи выполняются заранее и возможен запуск большего числа задач, пока выполняются медленные. Если вы хотите, чтобы задание секционирования завершалось быстрее, лучше увеличить размер пула.

spark.read\
    .format("cosmos.olap") \
    .option("spark.synapse.linkedService", "<enter linked service name>") \
    .option("spark.cosmos.container", "<enter container name>") \
    .option("spark.cosmos.asns.execute.partitioning", "true") \
    .option("spark.cosmos.asns.partition.keys", "readDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    .option("spark.cosmos.asns.merge.partitioned.files", "true") \
    .option("spark.cosmos.asns.partitioning.maxRecordsPerFile", "2000000") \
    .option("spark.cosmos.asns.partitioning.shuffle.partitions", "400") \
    .load()

Выполнение запросов в секционированном хранилище

Для выполнения запросов с поддержкой секционированного хранилища необходимы следующие две конфигурации:

  • spark.cosmos.asns.partition.keys
  • spark.cosmos.asns.basePath

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

df = spark.read\
    .format("cosmos.olap") \
    .option("spark.synapse.linkedService", "<enter linked service name>") \
    .option("spark.cosmos.container", "<enter container name>") \
    .option("spark.cosmos.asns.partition.keys", "readDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    .load()

df_filtered = df.filter("readDate='2020-11-01 00:00:00.000'")
display(df_filtered.limit(10))

При выполнении приведенного выше фильтра ReadDate = '2021-11-01' из сканирования будут исключены данные, соответствующие значениям ReadDate, отличным от 2021-11-01.

Примечание.

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

  • кадры данных Spark, созданные из контейнера аналитического хранилища Azure Cosmos DB;
  • таблицы Spark, указывающие на контейнер аналитического хранилища Azure Cosmos DB.

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

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