Menyerap data secara massal di Azure Cosmos DB untuk Gremlin dengan menggunakan pustaka pelaksana massal

BERLAKU UNTUK: Gremlin

Database grafik sering kali perlu menyerap data secara massal untuk me-refresh seluruh grafik atau memperbarui sebagiannya. Azure Cosmos DB, database terdistribusi dan tulang punggung Azure Cosmos DB untuk Gremlin, dimaksudkan untuk melakukan yang terbaik ketika beban didistribusikan dengan baik. Pustaka eksekutor massal di Azure Cosmos DB dirancang untuk mengeksploitasi kemampuan unik Azure Cosmos DB ini dan memberikan performa optimal. Untuk informasi selengkapnya, lihat Memperkenalkan dukungan massal di .NET SDK.

Dalam tutorial ini, Anda mempelajari cara menggunakan pustaka pelaksana massal Azure Cosmos DB untuk mengimpor dan memperbarui objek grafik ke dalam kontainer Azure Cosmos DB for Gremlin. Selama proses ini, Anda menggunakan pustaka untuk membuat objek vertex dan edge secara terprogram, kemudian menyisipkan beberapa objek per permintaan jaringan.

Alih-alih mengirim kueri Gremlin ke database, tempat perintah dievaluasi kemudian dieksekusi satu per satu, gunakan pustaka eksekutor massal untuk membuat dan memvalidasi objek secara lokal. Setelah pustaka menginisialisasi objek grafik, pustaka tersebut memungkinkan Anda untuk mengirim objek grafik ke layanan database secara berurutan.

Dengan menggunakan metode ini, Anda dapat meningkatkan kecepatan penyerapan data sebanyak seratus kali lipat, yang menjadikannya cara ideal untuk melakukan migrasi data awal atau operasi pergerakan data berkala.

Pustaka eksekutor massal kini hadir dalam variasi berikut.

.NET

Prasyarat

Sebelum memulai, pastikan Anda memiliki hal-hal berikut:

Kloning

Untuk menggunakan sampel ini, jalankan perintah berikut:

git clone https://github.com/Azure-Samples/azure-cosmos-graph-bulk-executor.git

Untuk mendapatkan sampel, buka .\azure-cosmos-graph-bulk-executor\dotnet\src\.

Sampel


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);

Jalankan

Modifikasi parameter, seperti yang dijealskan dalam tabel berikut:

Parameter Deskripsi
ConnectionString String koneksi layanan Anda, yang akan Anda temukan di bagian Kunci akun Azure Cosmos DB for Gremlin Anda. Titik akhir ini diformat sebagai AccountEndpoint=https://<account-name>.documents.azure.com:443/;AccountKey=<account-key>;.
DatabaseName, ContainerName Nama database dan kontainer target.
DocumentsToInsert Jumlah dokumen yang akan dihasilkan (hanya relevan untuk data sintetis).
PartitionKey Memastikan bahwa kunci partisi ditentukan dengan setiap dokumen selama penyerapan data.
NumberOfRUs Relevan hanya jika kontainer belum ada dan perlu dibuat selama eksekusi.

Unduh aplikasi sampel lengkap di .NET.

Java

Penggunaan sampel

Aplikasi sampel berikut mengilustrasikan cara menggunakan paket GraphBulkExecutor. Sampel tersebut menggunakan anotasi objek domain atau objek POJO (objek Java lama biasa) secara langsung. Disarankan untuk mencoba kedua pendekatan tersebut untuk menentukan mana yang lebih memenuhi tuntutan implementasi dan performa Anda.

Kloning

Untuk menggunakan sampel, jalankan perintah berikut:

git clone https://github.com/Azure-Samples/azure-cosmos-graph-bulk-executor.git

Untuk mendapatkan sampel, buka .\azure-cosmos-graph-bulk-executor\java\.

Prasyarat

Untuk menjalankan sampel ini, Anda harus memiliki perangkat lunak berikut:

  • OpenJDK 11
  • Maven
  • Akun Azure Cosmos DB yang dikonfigurasi untuk menggunakan Gremlin API

Sampel

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);
    }

Konfigurasi

Untuk menjalankan sampel, lihat konfigurasi berikut dan modifikasi sesuai kebutuhan.

File /resources/application.properties menentukan data yang diperlukan untuk mengonfigurasi Azure Cosmos DB. Nilai yang diperlukan yang dijelaskan dalam tabel berikut:

Properti Deskripsi
sample.sql.host Nilai yang disediakan oleh Azure Cosmos DB. Pastikan Anda menggunakan URI .NET SDK, yang akan Anda temukan di bagian Gambaran Umum akun Azure Cosmos DB.
sample.sql.key Anda bisa mendapatkan kunci utama atau sekunder dari bagian Kunci akun Azure Cosmos DB.
sample.sql.database.name Nama database dalam akun Azure Cosmos DB untuk menjalankan sampel. Apabila database tidak ditemukan, kode sampel akan membuatnya.
sample.sql.container.name Nama kontainer dalam database untuk menjalankan sampel. Jika kontainer tidak ditemukan, kode sampel akan membuatnya.
sample.sql.partition.path Apabila Anda perlu membuat kontainer, gunakan nilai ini untuk menentukan jalur partitionKey.
sample.sql.allow.throughput Kontainer akan diperbarui untuk menggunakan nilai throughput yang ditentukan di sini. Apabila Anda menjelajahi berbagai opsi throughput untuk memenuhi tuntutan performa, pastikan untuk mereset throughput pada kontainer setelah selesai dengan eksplorasi Anda. Ada biaya yang terkait dengan meninggalkan kontainer yang disediakan dengan throughput yang lebih tinggi.

Jalankan

Setelah Anda memodifikasi konfigurasi sesuai dengan lingkungan Anda, jalankan perintah berikut:

mvn clean package 

Untuk keamanan tambahan, Anda juga dapat menjalankan pengujian integrasi dengan mengubah nilai skipIntegrationTests di file pom.xml menjadi false.

Setelah berhasil menjalankan pengujian unit, Anda dapat menjalankan kode sampel:

java -jar target/azure-cosmos-graph-bulk-executor-1.0-jar-with-dependencies.jar -v 1000 -e 10 -d

Menjalankan perintah sebelumnya menjalankan sampel dengan batch kecil (1.000 simpul dan sekitar 5.000 tepi). Gunakan argumen baris perintah di bagian berikut untuk mengubah volume yang dijalankan dan versi sampel mana yang akan dijalankan.

Argumen baris perintah

Beberapa argumen baris perintah tersedia saat Anda menjalankan sampel ini, seperti yang dijelaskan dalam tabel berikut:

Argumen Deskripsi
--vertexCount (-v) Memberi tahu aplikasi berapa banyak simpul orang yang akan dihasilkan.
--edgeMax (-e) Memberi tahu aplikasi berapa jumlah maksimum tepi yang akan dihasilkan untuk setiap simpul. Generator secara acak memilih angka dari 1 hingga nilai yang Anda berikan.
--domainSample (-d) Memberi tahu aplikasi untuk menjalankan sampel menggunakan struktur domain orang dan hubungan alih-alih POJO GraphBulkExecutors, GremlinVertex, dan GremlinEdge.
--createDocuments (-c) Memberi tahu aplikasi untuk menggunakan operasi create. Apabila argumen tidak ada, aplikasi kembali ke default yang menggunakan operasi upsert.

Informasi sampel terperinci

Simpul orang

Kelas orang adalah objek domain sederhana yang telah dihiasi dengan beberapa anotasi untuk membantu transformasi ke kelas GremlinVertex, seperti yang dijelaskan dalam tabel berikut:

Anotasi kelas Deskripsi
GremlinVertex Menggunakan parameter label opsional untuk menentukan semua simpul yang Anda buat menggunakan kelas ini.
GremlinId Digunakan untuk menentukan bidang mana yang akan digunakan sebagai nilai ID. Nama bidang pada kelas orang adalah ID, tetapi ini tidak diperlukan.
GremlinProperty Digunakan pada bidang email untuk mengubah nama properti saat disimpan dalam database.
GremlinPartitionKey Digunakan untuk menentukan bidang mana pada kelas yang berisi kunci partisi. Nama bidang yang disediakan harus cocok dengan nilai yang ditentukan oleh jalur partisi pada kontainer.
GremlinIgnore Digunakan untuk mengecualikan bidang isSpecial dari properti yang ditulis ke database.

Kelas RelationshipEdge

Kelas RelationshipEdge merupakan objek domain yang serbaguna. Dengan menggunakan anotasi label tingkat bidang, Anda dapat membuat kumpulan dinamis jenis tepi, seperti yang diperlihatkan dalam tabel berikut:

Anotasi kelas Deskripsi
GremlinEdge Dekorasi GremlinEdge pada kelas menentukan nama bidang untuk kunci partisi yang ditentukan. Saat Anda membuat dokumen tepi, nilai yang ditetapkan berasal dari informasi simpul sumber.
GremlinEdgeVertex Dua instans GremlinEdgeVertex ditentukan, satu untuk setiap sisi tepi (sumber dan tujuan). Sampel kami memiliki jenis data bidang yaitu GremlinEdgeVertexInfo. Informasi yang diberikan oleh kelas GremlinEdgeVertex diperlukan agar tepi dibuat dengan benar dalam database. Opsi lain adalah dengan memiliki jenis data simpul menjadi kelas yang telah dihiasi dengan anotasi GremlinVertex.
GremlinLabel Sampel tepi menggunakan bidang untuk menentukan nilai label. Hal ini memungkinkan berbagai label untuk didefinisikan, karena menggunakan kelas domain dasar yang sama.

Penjelasan output

Konsol menyelesaikan eksekusinya dengan string JSON yang menjelaskan durasi sampel. String JSON berisi informasi berikut:

String JSON Deskripsi
startTime System.nanoTime() ketika proses dimulai.
endTime System.nanoTime() ketika proses selesai.
durationInNanoSeconds Perbedaan antara nilai endTime dan startTime.
durationInMinutes Nilai durationInNanoSeconds, dikonversi menjadi menit. Nilai durationInMinutes direpresentasikan sebagai angka float, bukan nilai waktu. Misalnya, nilai 2,5 merepresentasikan 2 menit dan 30 detik.
vertexCount Volume simpul yang dihasilkan yang harus cocok dengan nilai yang diteruskan ke eksekusi baris perintah.
edgeCount Volume tepi yang dihasilkan yang tidak statis dan dibangun dengan elemen keacakan.
exception Diisi hanya jika pengecualian dilemparkan saat Anda berusaha menjalankannya.

Array status

Array status memberikan wawasan tentang berapa lama setiap langkah dalam eksekusi berlangsung. Langkah-langkah tersebut dijelaskan dalam tabel berikut:

Langkah eksekusi Deskripsi
Membangun sampel simpul Waktu yang diperlukan untuk membuat volume objek orang yang diminta.
Membangun sampel tepi Waktu yang diperlukan untuk membuat objek hubungan.
Konfigurasikan database Jumlah waktu yang diperlukan untuk mengonfigurasi database, berdasarkan nilai yang disediakan di application.properties.
Menulis dokumen Jumlah waktu yang diperlukan untuk menulis dokumen ke database.

Setiap status berisi nilai berikut:

Nilai status Deskripsi
stateName Nama status yang sedang dilaporkan.
startTime Nilai System.nanoTime() ketika status dimulai.
endTime Nilai System.nanoTime() ketika status selesai.
durationInNanoSeconds Perbedaan antara nilai endTime dan startTime.
durationInMinutes Nilai durationInNanoSeconds, dikonversi menjadi menit. Nilai durationInMinutes direpresentasikan sebagai angka float, bukan nilai waktu. Misalnya, nilai 2,5 merepresentasikan 2 menit dan 30 detik.

Langkah berikutnya