Hologres adalah mesin gudang data real-time terpadu yang kompatibel dengan protokol PostgreSQL. Layanan ini mendukung penulisan, pembaruan, dan kueri data dalam jumlah besar baik dalam skenario real-time maupun offline. Topik ini menjelaskan cara memilih mode penulisan optimal untuk penulisan batch ke Hologres berdasarkan pengujian kinerja dan hasil penulisan data dari Spark ke Hologres.
Untuk informasi mengenai rencana dan hasil pengujian kinerja penulisan dan pembaruan data real-time, lihat Praktik terbaik untuk uji stres dalam skenario penulisan data, pembaruan, dan kueri titik.
Perbandingan mode penulisan batch
Hologres mendukung berbagai mode penulisan data batch, termasuk mode COPY tradisional, mode impor stream FIXED COPY berbasis protokol COPY, serta mode INSERT INTO VALUES yang mengonversi impor batch menjadi penulisan stream.
Tabel berikut memberikan perbandingan mendetail ketiga mode penulisan tersebut.
Item perbandingan | COPY | FIXED COPY | INSERT INTO VALUES | |
Pengantar | Impor batch ke tabel tanpa primary key menggunakan COPY | Impor batch ke tabel dengan primary key menggunakan COPY | Mode impor stream yang dikembangkan berdasarkan protokol COPY | Mode impor stream dasar |
Skenario khas |
|
|
| |
Granularitas kunci | Kunci baris | Kunci tabel | Kunci baris | Kunci baris |
Visibilitas data | Tampak setelah operasi COPY selesai | Tampak setelah operasi COPY selesai | Visibilitas real-time | Visibilitas real-time |
Kinerja | Tinggi | Tinggi | Bahasa Tiongkok | Sedang |
Konsumsi resource Hologres | Rendah | Rendah | Tinggi | Tinggi |
Konsumsi resource klien | Rendah | Tinggi | Rendah | Sedang |
Kebijakan yang didukung untuk konflik primary key | Tidak berlaku |
|
|
|
Memilih mode penulisan batch
Daftar berikut menjelaskan fitur-fitur ketiga mode penulisan data batch:
Mode COPY: Mode COPY tradisional memberikan kinerja penulisan terbaik dan konsumsi resource Hologres terendah.
Mode FIXED COPY: Ini adalah mode impor stream berbasis protokol COPY. Mode ini hanya membuat kunci baris dan menyediakan visibilitas data real-time.
Mode INSERT INTO VALUES: Mode ini mengonversi impor batch menjadi penulisan stream tradisional dan tidak lagi memiliki keunggulan signifikan dalam skenario penulisan batch.
CatatanKurangnya keunggulan signifikan pada mode INSERT bersifat spesifik untuk skenario penulisan batch. Namun, karena hanya mode INSERT yang mendukung retraksi data (penghapusan), mode ini tetap diperlukan untuk skenario seperti penulisan data binary logging.
Jika Anda tidak memiliki persyaratan khusus terkait visibilitas data real-time, granularitas kunci (kunci tabel mencegah penulisan konkuren dari beberapa tugas), atau beban pada sumber data, prioritaskan mode COPY untuk penulisan batch.
Untuk penulisan batch Spark, upgrade instans Hologres Anda ke V2.2.25 atau versi yang lebih baru. Atur parameter
write.modepenulisan konektor keauto, yang merupakan nilai default. Sistem akan secara otomatis memilih mode penulisan optimal.Untuk penulisan batch Flink, gunakan pohon keputusan di bawah ini untuk menentukan apakah akan menggunakan mode COPY atau mode FIXED COPY, lalu konfigurasikan parameter berikut.
jdbccopywritemode: Atur parameter ini ke TRUE untuk mencegah penggunaan mode INSERT.
bulkload: Atur parameter ini ke TRUE untuk mode COPY atau FALSE untuk mode FIXED COPY sesuai kebutuhan Anda.
Gunakan pohon keputusan berikut untuk memilih mode penulisan yang sesuai untuk skenario penulisan batch Anda.
Pengujian kinerja penulisan batch
Pengujian ini menggunakan konektor open source Hologres-Spark-Connector yang dikembangkan oleh Hologres.
Persiapan
Siapkan lingkungan dasar
Siapkan lingkungan berikut:
Instans Hologres dan kluster EMR-Spark harus berada di wilayah yang sama dan menggunakan VPC yang sama.
Aktifkan instans Hologres V2.2.25 atau versi yang lebih baru dan buat database.
Buat kluster EMR-Spark yang menjalankan Spark V3.3.0 atau versi yang lebih baru. Untuk informasi selengkapnya, lihat Buat kluster.
Unduh paket Spark-Connector.
Anda dapat mengunduh paket JAR konektor
hologres-connector-spark-3.xdari Maven Central Repository. Paket ini diperlukan agar Spark dapat membaca dan menulis data ke Hologres.
Konteks lingkungan untuk topik ini adalah sebagai berikut:
Layanan | Versi | Spesifikasi |
Hologres | V3.0.30 | 64 Core, 256 GB (1 CU = 1 core dan 4 GB memori) |
EMR-Spark | EMR-5.18.1, Spark-3.5.3 | 8 Core, 32 GB × 8 (1 Node master, 7 node core) Penting Anda harus mengaktifkan layanan OSS-HDFS. |
Spark-Connector | 1.5.2 | Tidak berlaku |
Siapkan data uji
Siapkan data mentah.
Login ke node master kluster EMR-Spark. Untuk informasi selengkapnya, lihat Metode untuk menghubungkan ke instans ECS.
Klik TPC-H_Tools_v3.0.0.zip untuk mengunduh tool TPC-H. Salin paket tersebut ke instans ECS pada node master kluster, ekstrak paketnya, lalu navigasikan ke direktori
TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgen.Jalankan kode berikut untuk menghasilkan file set data uji
customer.tblberukuran1 TBdi direktoridbgen. Ukuran file .tbl mentah adalah 23 GB../dbgen -s 1000 -T cTabel berikut menjelaskan tabel customer dalam dataset uji TPC-H 1 TB.
Informasi tabel
Deskripsi
Volume data suatu bidang
8
Tipe bidang
INT, BIGINT, TEXT, DECIMAL
Jumlah baris
150.000.000
Jumlah shard tabel
40
Impor data uji ke Spark.
Jalankan perintah berikut untuk mengunggah file customer.tbl ke kluster Spark.
hadoop fs -put customer.tbl <spark_resource>spark_resource adalah Root Path of Cluster Storage yang Anda tentukan saat membuat kluster EMR-Spark.
Buat tabel dengan format penyimpanan berbeda di Hologres. Perintah SQL-nya adalah sebagai berikut:
Columnar dan row-oriented
CREATE TABLE test_table_mixed ( C_CUSTKEY BIGINT PRIMARY KEY, C_NAME TEXT, C_ADDRESS TEXT, C_NATIONKEY INT, C_PHONE TEXT, C_ACCTBAL DECIMAL(15, 2), C_MKTSEGMENT TEXT, C_COMMENT TEXT ) WITH ( orientation = 'column,row' );Columnar (dengan primary key)
CREATE TABLE test_table_column ( C_CUSTKEY BIGINT PRIMARY KEY, C_NAME TEXT, C_ADDRESS TEXT, C_NATIONKEY INT, C_PHONE TEXT, C_ACCTBAL DECIMAL(15, 2), C_MKTSEGMENT TEXT, C_COMMENT TEXT ) WITH ( orientation = 'column' );Columnar (tanpa primary key)
CREATE TABLE test_table_column_no_pk ( C_CUSTKEY BIGINT, C_NAME TEXT, C_ADDRESS TEXT, C_NATIONKEY INT, C_PHONE TEXT, C_ACCTBAL DECIMAL(15, 2), C_MKTSEGMENT TEXT, C_COMMENT TEXT ) WITH ( orientation = 'column' );Row-oriented (dengan primary key)
CREATE TABLE test_table_row ( C_CUSTKEY BIGINT PRIMARY KEY, C_NAME TEXT, C_ADDRESS TEXT, C_NATIONKEY INT, C_PHONE TEXT, C_ACCTBAL DECIMAL(15, 2), C_MKTSEGMENT TEXT, C_COMMENT TEXT ) WITH ( orientation = 'row' );Row-oriented (tanpa primary key)
CREATE TABLE test_table_row_no_pk ( C_CUSTKEY BIGINT, C_NAME TEXT, C_ADDRESS TEXT, C_NATIONKEY INT, C_PHONE TEXT, C_ACCTBAL DECIMAL(15, 2), C_MKTSEGMENT TEXT, C_COMMENT TEXT ) WITH ( orientation = 'row' );
Pengujian kinerja
Konfigurasi pengujian
Pengujian ini terutama mengukur kinerja impor dalam mode berbeda.
Login ke node master kluster EMR-Spark. Untuk informasi selengkapnya, lihat Metode untuk menghubungkan ke instans ECS. Kemudian, unggah paket Spark-Connector yang telah diunduh dan jalankan perintah berikut untuk masuk ke antarmuka interaktif spark-sql.
CatatanAnda dapat menyesuaikan parameter
spark.sql.files.maxPartitionBytesuntuk mengontrol konkurensi Spark saat membaca file HDFS. Dalam pengujian ini, konkurensi diatur ke 40.# Masuk ke antarmuka interaktif spark-sql spark-sql --jars <path>/hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar \ --conf spark.executor.instances=40 \ --conf spark.executor.cores=1 \ --conf spark.executor.memory=4g \ --conf spark.sql.files.maxPartitionBytes=644245094path adalah path root tempat file hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar berada.
Di antarmuka interaktif spark-sql, jalankan pernyataan SQL berikut untuk menulis data dengan membuat tabel sementara.
Tabel sementara dibuat karena Anda perlu menyesuaikan parameter beberapa kali untuk menguji kinerja penulisan dalam mode berbeda.
CatatanDalam praktiknya, Anda dapat langsung menggunakan Catalog untuk memuat tabel Hologres, yang menyederhanakan proses.
-- Buat tabel sementara dalam format CSV. CREATE TEMPORARY VIEW csvtable ( c_custkey BIGINT, c_name STRING, c_address STRING, c_nationkey INT, c_phone STRING, c_acctbal DECIMAL(15, 2), c_mktsegment STRING, c_comment STRING) USING csv OPTIONS ( path "<spark_resources>/customer.tbl", sep "|" ); CREATE TEMPORARY VIEW hologresTable ( c_custkey BIGINT, c_name STRING, c_address STRING, c_nationkey INT, c_phone STRING, c_acctbal DECIMAL(15, 2), c_mktsegment STRING, c_comment STRING) USING hologres OPTIONS ( jdbcurl "jdbc:postgresql://<hologres_vpc_endpoint>/<database_name>", username "<accesskey_id>", password "<accesskey_secret>", table "<table_name>", direct_connect "false", write.mode "auto", write.insert.thread_size "3", write.insert.batch_size "2048" ); INSERT INTO hologresTable SELECT * FROM csvTable;Tabel berikut menjelaskan parameter-parameter tersebut.
Nama Parameter
Deskripsi
spark_resources
Root Path of Cluster Storage yang Anda konfigurasi saat membuat kluster EMR-Spark.
Anda dapat masuk ke Konsol EMR pada ECS, mengklik ID kluster tujuan, lalu memperoleh jalur akar penyimpanan kluster di bagian Cluster Information pada halaman Basic Information.
hologres_vpc_endpoint
Domain Name VPC instans Hologres.
Anda dapat login ke Konsol Manajemen Hologres, klik ID instans tujuan, lalu dapatkan nama domain untuk VPC yang ditentukan di bagian informasi jaringan halaman produk. Misalnya, format VPC Endpoint di wilayah China (Hangzhou) adalah
<ID Instans>-cn-hangzhou-vpc-st.hologres.aliyuncs.com:80.database_name
Nama database di instans Hologres.
accesskey_id
ID AccessKey yang memiliki izin baca pada database Hologres yang sesuai.
accesskey_secret
Rahasia AccessKey yang memiliki izin baca pada database Hologres yang sesuai.
table_name
Nama tabel tujuan di Hologres tempat Anda ingin menulis data.
write.mode
Mode penulisan. Nilai yang valid:
auto: Nilai default. Konektor memilih mode optimal.insert: Menulis data menggunakan metode INSERT INTO VALUES.stream: Menulis data dalam mode stream menggunakan FIXED COPY.bulk_load: Impor batch data ke tabel tanpa primary key menggunakan mode COPY.bulk_load_on_conflict: Impor batch data ke tabel dengan primary key menggunakan mode COPY.
write.insert.thread_size
Konkurensi penulisan. Parameter ini hanya berlaku saat Anda menggunakan mode INSERT.
write.insert.batch_size
Ukuran batch penulisan. Parameter ini hanya berlaku saat Anda menggunakan mode INSERT.
write.on_conflict_action
INSERT_OR_REPLACE (default): Memperbarui data jika terjadi konflik primary key.
INSERT_OR_IGNORE: Mengabaikan data jika terjadi konflik primary key.
Untuk informasi selengkapnya, lihat Deskripsi parameter.
Skenario pengujian
Skenario pengujian | Skenario yang tersedia |
Format penyimpanan tabel |
|
Metode pembaruan data |
|
Metode penulisan |
|
Hasil pengujian
Hasil pengujian mencakup bidang-bidang berikut:
Bidang | Deskripsi |
Total durasi pekerjaan | Waktu proses total pekerjaan Spark. Ini adalah waktu yang diperlukan untuk mengeksekusi operasi penulisan data INSERT di antarmuka interaktif spark-sql pada node kluster EMR-Spark. Gambar berikut menunjukkan cara mendapatkan nilai ini: |
Durasi rata-rata penulisan data | Durasi rata-rata hanya untuk pekerjaan penulisan, tidak termasuk waktu penjadwalan kluster Spark, pembacaan data, atau redistribusi data. Anda dapat menjalankan perintah SQL berikut di halaman HoloWeb pada Konsol Manajemen Hologres untuk mendapatkan konkurensi shard (jumlah) dan durasi rata-rata penulisan data (avg_duration_ms, dalam milidetik). Tabel berikut menjelaskan parameter-parameter tersebut.
|
Beban Hologres | Pemanfaatan CPU instans Hologres. Anda dapat melihat pemanfaatan CPU di halaman Monitoring Information instans di Konsol Manajemen Hologres. |
Beban Spark | Beban node EMR. Anda dapat membuka Konsol EMR pada ECS, klik ID kluster tujuan, lalu buka tab Monitoring and Diagnostics > Metric Monitoring. Pilih parameter berikut:
Kemudian, kueri metrik CPU utilization. Inilah beban Spark. |
Tabel berikut menunjukkan hasil pengujian secara detail.
Format penyimpanan | Primary key | Mode penulisan | Total durasi pekerjaan | Durasi rata-rata penulisan data | Hologres load | Spark load |
Columnar | Tanpa primary key | insert | 241,61 detik | 232,70 detik | 92% | 15% |
stream | 228,11 detik | 222,34 detik | 100% | 36% | ||
bulk_load | 88,72 detik | 57,16 detik | 97% | 47% | ||
Dengan primary key ignore | insert | 190,96 detik | 172,60 detik | 90% | 14% | |
stream | 149,60 detik | 142,16 detik | 100% | 14% | ||
bulk_load_on_conflict | 115,96 detik | 42,92 detik | 60% | 75% | ||
Dengan primary key replace | insert | 600,40 detik | 574,31 detik | 91% | 5% | |
stream | 550,29 detik | 540,32 detik | 100% | 5% | ||
bulk_load_on_conflict | 188,05 detik | 109,77 detik | 93% | 78% | ||
Row-oriented | Tanpa primary key | insert | 132,38 detik | 123,79 detik | 94% | 22% |
stream | 114,41 detik | 103,81 detik | 100% | 17% | ||
bulk_load | 68,20 detik | 41,22 detik | 98% | 32% | ||
Dengan primary key ignore | insert | 190,48 detik | 170,49 detik | 89% | 15% | |
stream | 185,46 detik | 172,48 detik | 85% | 14% | ||
bulk_load_on_conflict | 117,81 detik | 47,69 detik | 58% | 75% | ||
Dengan primary key replace | insert | 177,97 detik | 170,78 detik | 93% | 15% | |
stream | 142,44 detik | 130,16 detik | 100% | 20% | ||
bulk_load_on_conflict | 137,69 detik | 65,18 detik | 92% | 78% | ||
Columnar dan row-oriented | Dengan primary key ignore | insert | 172,19 detik | 158,74 detik | 86% | 16% |
stream | 150,63 detik | 149,76 detik | 100% | 12% | ||
bulk_load_on_conflict | 128,83 detik | 42,09 detik | 59% | 79% | ||
Dengan primary key replace | insert | 690,37 detik | 662,00 detik | 92% | 5% | |
stream | 625,84 detik | 623,08 detik | 100% | 4% | ||
bulk_load_on_conflict | 202,07 detik | 121,58 detik | 93% | 80% |
Mode penulisan berkorespondensi dengan hal berikut:
insert: INSERT INTO VALUES
stream: FIXED COPY
bulk_load: Impor COPY ke tabel tanpa primary key
bulk_load_on_conflict: Impor COPY ke tabel dengan primary key
