Массовое прием данных в Azure Cosmos DB для Gremlin с помощью библиотеки массового исполнителя
Область применения: Гремлин
Для массового обновления всего графа или части графа в базе данных часто требуется массовый прием данных. Azure Cosmos DB, распределенная база данных и магистраль Azure Cosmos DB для Gremlin, предназначена для оптимального выполнения при хорошо распределенных нагрузках. Библиотеки исполнителя массовых операций в Azure Cosmos DB используют эту уникальную возможность Azure Cosmos DB для обеспечения оптимальной производительности. Дополнительные сведения см. в записи блога Introducing bulk support in the .NET SDK (Введение в поддержку массовых операций SDK для .NET).
В этом руководстве описано, как использовать библиотеку массового исполнителя Azure Cosmos DB для импорта и обновления объектов графа в контейнер Azure Cosmos DB для Gremlin. В ходе этого процесса вы с помощью библиотеки программным образом создадите объекты вершин и ребер, а затем вставите несколько таких объектов по сетевому запросу.
В отличие от отправки Gremlin-запросов в базу данных, когда команды оцениваются и выполняются поочередно, при использовании библиотеки исполнителя массовых операций объекты создаются и проверяются локально. После того, как библиотека инициализирует объекты графов, вы сможете последовательно отправлять их в службу базы данных.
С помощью этого метода можно увеличить скорость приема данных в сто раз, что делает его идеальным для выполнения начальных миграций данных или периодических операций перемещения данных.
Библиотека исполнителя массовых операций теперь предоставляется в нескольких вариантах.
.NET
Необходимые компоненты
Прежде чем приступить к работе, убедитесь, что у вас есть следующие необходимые компоненты:
Visual Studio 2019 с рабочей нагрузкой для разработки Azure. Вы можете бесплатно начать работу в выпуске Visual Studio 2019 Community.
Подписка Azure. Если у вас еще нет подписки, создайте бесплатную учетную запись Azure.
Вы также можете создать бесплатную учетную запись Azure Cosmos DB без подписки Azure.
База данных Azure Cosmos DB для Gremlin с неограниченной коллекцией. Чтобы приступить к работе, перейдите в Azure Cosmos DB для Gremlin в .NET.
Git. Для начала перейдите на страницу скачиваний Git.
Клонировать
Для работы с этим примером выполните следующую команду.
git clone https://github.com/Azure-Samples/azure-cosmos-graph-bulk-executor.git
Чтобы получить пример, перейдите к разделу .\azure-cosmos-graph-bulk-executor\dotnet\src\
.
Пример
IGraphBulkExecutor graphBulkExecutor = new GraphBulkExecutor("MyConnectionString", "myDatabase", "myContainer");
List<IGremlinElement> gremlinElements = new List<IGremlinElement>();
gremlinElements.AddRange(Program.GenerateVertices(Program.documentsToInsert));
gremlinElements.AddRange(Program.GenerateEdges(Program.documentsToInsert));
BulkOperationResponse bulkOperationResponse = await graphBulkExecutor.BulkImportAsync(
gremlinElements: gremlinElements,
enableUpsert: true);
Выполнить
Измените параметры, как описано в следующей таблице.
Параметр | Описание |
---|---|
ConnectionString |
Служба строка подключения, которую вы найдете в разделе "Ключи" учетной записи Azure Cosmos DB для Gremlin. Она имеет формат AccountEndpoint=https://<account-name>.documents.azure.com:443/;AccountKey=<account-key>; . |
DatabaseName , ContainerName |
Имена целевой базы данных и контейнера. |
DocumentsToInsert |
Количество создаваемых документов (относится только к искусственным данным). |
PartitionKey |
Гарантирует, что во время приема данных в каждом документе указан ключ секции. |
NumberOfRUs |
Имеет значение только в том случае, если контейнер еще не существует и его придется создавать во время выполнения. |
Скачайте полный пример приложения в .NET.
Java
Пример использования
Следующий пример приложения демонстрирует, как использовать пакет GraphBulkExecutor. В этих примерах используются либо заметки к объекту домена, либо напрямую объекты POJO (старый добрый объект Java). Рекомендуется попробовать оба подхода, чтобы определить, какой из них лучше соответствует требованиям к реализации и производительности.
Клонировать
Чтобы использовать этот пример, выполните следующую команду:
git clone https://github.com/Azure-Samples/azure-cosmos-graph-bulk-executor.git
Чтобы получить пример, перейдите к разделу .\azure-cosmos-graph-bulk-executor\java\
.
Необходимые компоненты
Чтобы запустить этот пример, вам потребуется следующее программное обеспечение:
- OpenJDK 11
- Maven
- учетная запись базы данных Cosmos Azure, настроенная для использования API Gremlin.
Пример
private static void executeWithPOJO(Stream<GremlinVertex> vertices,
Stream<GremlinEdge> edges,
boolean createDocs) {
results.transitionState("Configure Database");
UploadWithBulkLoader loader = new UploadWithBulkLoader();
results.transitionState("Write Documents");
loader.uploadDocuments(vertices, edges, createDocs);
}
Настройка
Чтобы запустить пример, используйте следующую конфигурацию, изменив ее по мере необходимости.
Файл /resources/application.properties определяет данные, необходимые для настройки Azure Cosmos DB. Необходимые значения описаны в следующей таблице.
Свойство | Description |
---|---|
sample.sql.host |
Значение, предоставленное Azure Cosmos DB. Убедитесь, что вы используете URI пакета SDK для .NET, который можно найти в разделе Обзор учетной записи Azure Cosmos DB. |
sample.sql.key |
Первичный или вторичный ключ можно получить в разделе Ключи учетной записи Azure Cosmos DB. |
sample.sql.database.name |
Имя базы данных в учетной записи Azure Cosmos DB, где будет выполняться пример. Если база данных не найдена, ее создаст пример кода. |
sample.sql.container.name |
Имя контейнера в базе данных, где будет выполняться пример. Если контейнер не найден, его создаст пример кода. |
sample.sql.partition.path |
Если необходимо создать контейнер, используйте это значение для определения пути partitionKey . |
sample.sql.allow.throughput |
Контейнер будет обновлен, чтобы использовать определенное здесь значение пропускной способности. Если вы изучаете разные варианты пропускной способности для удовлетворения требований к производительности, обязательно сбросьте пропускную способность контейнера при выполнении исследования. Существуют затраты, связанные с выходом из контейнера, подготовленного с более высокой пропускной способностью. |
Выполнить
После изменения конфигурации в соответствии с вашей средой выполните следующую команду:
mvn clean package
Чтобы обеспечить дополнительную безопасность, можно также запустить тесты интеграции, изменив значение skipIntegrationTests
в файле pom.xml на false
.
После успешного выполнения модульных тестов можно запустить пример кода:
java -jar target/azure-cosmos-graph-bulk-executor-1.0-jar-with-dependencies.jar -v 1000 -e 10 -d
Представленная выше команда выполняет пример с небольшим пакетом данных (1000 вершин и примерно 5000 ребер). Аргументы командной строки, представленные в следующих разделах, позволяют настроить выполняемые тома и версию примера.
Аргументы командной строки
При выполнении этого примера доступны несколько аргументов командной строки, которые описаны в следующей таблице:
Аргумент | Description |
---|---|
--vertexCount (-v ) |
Сообщает приложению, сколько вершин person необходимо создать. |
--edgeMax (-e ) |
Сообщает приложению, какое максимальное число ребер необходимо создать для каждой вершины. Генератор случайным образом выбирает число от 1 до указанного вами значения. |
--domainSample (-d ) |
Сообщает приложению, что нужно выполнить примера со структурами person и relationship вместо объектов POJO GraphBulkExecutors , GremlinVertex и GremlinEdge . |
--createDocuments (-c ) |
Указывает приложению, что нужно использовать операции create . Если этот аргумент не указан, приложение по умолчанию использует операции upsert . |
Подробные сведения о примере
Вершина person
Класс person — это простой объект предметной области, дополненный несколькими заметками для преобразования в класс GremlinVertex
, как описано в следующей таблице:
Заметка к классу | Description |
---|---|
GremlinVertex |
Использует необязательный параметр label для определения всех вершин, создаваемых с помощью этого класса. |
GremlinId |
Используется для определения поля, которое будет использоваться в качестве значения ID . Несмотря на то, что имя поля класса Person является идентификатором, оно не требуется. |
GremlinProperty |
Используется в поле email для изменения имени свойства при хранении в базе данных. |
GremlinPartitionKey |
Используется для определения поля класса, которое содержит ключ секции. Указанное здесь имя поля должно соответствовать значению, определенному путем секции в контейнере. |
GremlinIgnore |
Используется для исключения поля isSpecial из свойства, записываемого в базу данных. |
Класс RelationshipEdge
Класс RelationshipEdge
представляет собой гибкий объект домена. С помощью заметок на уровне поля вы можете создать динамическую коллекцию типов ребер, как показано в следующей таблице.
Заметка к классу | Description |
---|---|
GremlinEdge |
Дополнение GremlinEdge в классе определяет имя поля для указанного ключа секции. При создании пограничного документа назначается значение, созданное на основе исходных сведений о вершинах. |
GremlinEdgeVertex |
Определяются два экземпляра GremlinEdgeVertex : по одному для каждой стороны ребра (начальное и конечное положения). В нашем примере представлен тип данных поля GremlinEdgeVertexInfo . Сведения, предоставляемые классом GremlinEdgeVertex , необходимы для правильного создания ребра в базе данных. Другим вариантом было бы иметь тип данных вершин как класс с аннотациями GremlinVertex . |
GremlinLabel |
Этот пример ребра использует поле для определения значения label . Он позволяет определять различные метки, так как использует один и тот же базовый класс домена. |
Описание выходных данных
Завершая выполнение, консоль возвращает строку в формате JSON, которая описывает времена выполнения примера. Строка JSON содержит следующие сведения.
Строка JSON | Description |
---|---|
startTime | Время System.nanoTime() начала процесса. |
endTime | Значение System.nanoTime() при завершении процесса. |
durationInNanoSeconds | Разница между значениями endTime и startTime . |
durationInMinutes | Значение durationInNanoSeconds , преобразованное в минуты. Значение durationInMinutes представляется в формате числа с плавающей точкой, а не значения времени. Например, значение "2,5" здесь обозначает 2 минуты и 30 секунд. |
vertexCount | Объем сгенерированных вершин, который должен совпадать с тем значением, которое мы передали в процесс выполнения командной строки. |
edgeCount | Объем сгенерированных ребер, который задается не строго, а с некоторым элементом случайности. |
отрисовки | Заполняется только в том случае, если при попытке выполнения возникает исключение. |
Массив состояний
Массив состояний дает представление о том, сколько времени занимает выполнение каждого шага. Они описаны в следующей таблице.
Шаг выполнения | Description |
---|---|
Сборка примеров вершин | Время, необходимое для создания запрошенного объема объектов person. |
Сборка примеров ребер | Время, необходимое для создания объектов relationship. |
Настройка базы данных | Время, необходимое для настройки базы данных с учетом значений, предоставленных в application.properties . |
Запись документов | Время, необходимое на запись документов в базу данных. |
Каждое состояние содержит следующие значения.
Значение состояния | Description |
---|---|
stateName |
Имя сообщаемого состояния. |
startTime |
Значение System.nanoTime() в начале состояния. |
endTime |
Значение System.nanoTime() после завершения состояния. |
durationInNanoSeconds |
Разница между значениями endTime и startTime . |
durationInMinutes |
Значение durationInNanoSeconds , преобразованное в минуты. Значение durationInMinutes представляется в формате числа с плавающей точкой, а не значения времени. Например, значение "2,5" здесь обозначает 2 минуты и 30 секунд. |
Следующие шаги
- Сведения о классах и методах, которые определены в этом пространстве имен, представлены в документации по проекту Java с открытым кодом BulkExecutor.
- См. статью Массовый импорт данных в учетную запись API SQL Azure Cosmos DB с помощью пакета SDK для .NET. Документация по пакетному режиму входит в состав пакета SDK для .NET версии 3.