Hologres adalah mesin gudang data real-time satu atap yang kompatibel dengan protokol PostgreSQL. Mendukung penulisan, pembaruan, dan kueri data dalam jumlah besar secara real-time dan offline dalam skenario terintegrasi. Topik ini menjelaskan cara memilih mode penulisan yang sesuai untuk berbagai skenario penulisan batch berdasarkan hasil pengujian kinerja menggunakan Spark untuk menulis data batch ke Hologres.
Untuk penulisan data real-time dan pembaruan, lihat Praktik Terbaik untuk Pengujian Kinerja pada Penulisan Data, Pembaruan Data, dan Kueri Poin untuk rencana dan hasil pengujian kinerja.
Perbandingan mode penulisan batch
Untuk skenario penulisan data batch, Hologres mendukung mode penulisan yang berbeda, termasuk mode COPY tradisional, mode impor streaming FIXED COPY yang dikembangkan berdasarkan protokol COPY, dan mode INSERT INTO VALUES yang mengonversi impor batch menjadi impor streaming.
Tabel berikut memberikan perbandingan rinci dari tiga mode penulisan.
Item perbandingan | COPY | FIXED COPY | INSERT INTO VALUES | |
Pengenalan | Impor batch berbasis COPY ke tabel tanpa kunci utama | Impor batch berbasis COPY ke tabel dengan kunci utama | Mode impor streaming yang dikembangkan berdasarkan protokol COPY | Mode impor streaming dasar |
Skema tipikal |
|
|
| |
Granularitas kunci | Kunci baris | Kunci tabel | Kunci baris | Kunci baris |
Visibilitas data | Terlihat setelah operasi COPY selesai | Terlihat setelah operasi COPY selesai | Terlihat secara real-time | Terlihat secara real-time |
Kinerja | Tinggi | Tinggi | Sedang | Sedang |
Konsumsi sumber daya Hologres | Rendah | Rendah | Tinggi | Tinggi |
Konsumsi sumber daya klien | Rendah | Tinggi | Rendah | Sedang |
Kebijakan konflik kunci utama | Tidak tersedia |
|
|
|
Pilih mode penulisan batch
Dalam skenario penulisan data batch, karakteristik dari ketiga mode tersebut adalah sebagai berikut:
COPY: Mode COPY tradisional COPY, dengan kinerja penulisan optimal dan konsumsi sumber daya Hologres terendah.
FIXED COPY: Mode impor streaming yang dikembangkan berdasarkan protokol COPY. Mode ini hanya menghasilkan kunci baris, dan data terlihat secara real-time.
INSERT INTO VALUES: Mengonversi impor batch menjadi penulisan streaming tradisional. Mode ini tidak memiliki keunggulan yang jelas dalam skenario penulisan batch.
CatatanMode INSERT INTO VALUES tidak memiliki keunggulan yang jelas hanya dalam skenario penulisan batch. Namun, hanya mode ini yang memiliki kemampuan retraksi data (penghapusan), yang masih diperlukan dalam skenario seperti penulisan data log biner.
Jika Anda tidak memiliki persyaratan khusus untuk visibilitas data real-time, granularitas kunci, atau beban sumber data, Anda dapat memprioritaskan mode COPY untuk penulisan batch. Perlu dicatat bahwa ketika kunci tabel dihasilkan, tabel tidak dapat mendukung beberapa tugas penulisan data secara bersamaan.
Menggunakan Spark untuk penulisan batch: Kami merekomendasikan agar Anda meningkatkan instance Hologres Anda ke V2.2.25 atau lebih baru, dan mengatur parameter penulisan
write.modedari konektor keauto(nilai default). Sistem akan secara otomatis memilih mode penulisan yang optimal.Menggunakan Flink untuk penulisan batch: Anda perlu terlebih dahulu menentukan apakah akan menggunakan mode COPY atau mode FIXED COPY sesuai dengan pohon keputusan di bawah ini, lalu mengonfigurasi parameter berikut:
jdbccopywritemode: Atur parameter ini ke TRUE, yang berarti mode INSERT INTO VALUES tidak digunakan.
bulkload: TRUE menunjukkan mode COPY, dan FALSE menunjukkan mode FIXED COPY. Konfigurasikan parameter ini berdasarkan kebutuhan bisnis Anda.
Anda dapat memilih mode penulisan yang sesuai sesuai dengan pohon keputusan berikut.
Pengujian kinerja penulisan batch
Komponen open-source Hologres-Spark-Connector yang dikembangkan oleh Hologres digunakan dalam proses pengujian.
Persiapan
Siapkan lingkungan dasar
Anda perlu menyiapkan lingkungan berikut:
Instance Hologres dan klaster EMR Spark harus berada di wilayah yang sama dan menggunakan VPC yang sama.
Beli instance Hologres versi V2.2.25 atau lebih baru, dan buat database.
Buat klaster EMR Spark. Versi Spark harus lebih besar dari atau sama dengan 3.3.0. Untuk informasi lebih lanjut, lihat Buat Klaster.
Unduh paket Spark-Connector.
Anda dapat mengunduh paket JAR konektor
hologres-connector-spark-3.x, yang diperlukan untuk Spark membaca data dari dan menulis data ke Hologres, dari Maven Central Repository.
Informasi lingkungan berikut digunakan dalam topik ini.
Layanan | Versi | Spesifikasi |
Hologres | V3.0.30 | 64 core, 256 GB (1 CU = 1 core dan 4 GB) |
EMR Spark | EMR V5.18.1, Spark 3.5.3 | 8 core, 32 GB × 8 (1 node master dan 7 node inti) Penting Anda perlu mengaktifkan layanan OSS-HDFS. |
Spark-Connector | 1.5.2 | Tidak tersedia |
Siapkan data uji
Siapkan data mentah.
Masuk ke node master klaster EMR Spark. Untuk informasi lebih lanjut, lihat Masuk ke Node Master Klaster dengan Menghubungkan ke Instance ECS Tertentu.
Klik TPC-H_Tools_v3.0.0.zip untuk mengunduh alat TPC-H, salin ke instance ECS node master, ekstrak, lalu masuk ke direktori
TPC-H_Tools_v3.0.0/TPC-H_Tools_v3.0.0/dbgen.Jalankan kode berikut untuk menghasilkan file dataset uji
1 TBcustomer.tbldi direktoridbgen. Ukuran file tbl asli adalah 23 GB../dbgen -s 1000 -T cTabel berikut memberikan informasi rinci tentang tabel pelanggan dalam dataset TPC-H 1 TB.
Informasi tabel
Deskripsi
Jumlah bidang
8
Tipe bidang
INT, BIGINT, TEXT, DECIMAL
Jumlah baris data
150.000.000
Jumlah shard tabel
40
Impor data uji ke Spark.
Jalankan perintah berikut untuk mengunggah file customer.tbl ke klaster Spark:
hadoop fs -put customer.tbl <spark_resource>spark_resource menunjukkan jalur yang dikonfigurasikan untuk parameter Root Storage Directory of Cluster saat Anda membuat klaster EMR Spark.
Buat tabel dengan format penyimpanan yang berbeda di Hologres. Contoh pernyataan SQL:
Penyimpanan hibrid baris-kolom
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' );Penyimpanan berorientasi kolom (dengan kunci utama)
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' );Penyimpanan berorientasi kolom (tanpa kunci utama)
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' );Penyimpanan berorientasi baris (dengan kunci utama)
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' );Penyimpanan berorientasi baris (tanpa kunci utama)
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
Topik ini terutama menguji kinerja impor di bawah mode yang berbeda.
Masuk ke node master klaster EMR Spark (untuk metode masuk, lihat Masuk ke Node Master Klaster dengan Menghubungkan ke Instance ECS Tertentu), unggah paket Spark-Connector yang diunduh, lalu jalankan perintah berikut untuk masuk ke antarmuka baris perintah (CLI) spark-sql.
CatatanDengan menyesuaikan nilai parameter
spark.sql.files.maxPartitionBytes, Anda dapat mengontrol konkurensi Spark membaca file HDFS. Konkurensi dalam contoh ini adalah 40.# Masuk ke CLI 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 menunjukkan jalur root tempat paket hologres-connector-spark-3.x-1.5.2-jar-with-dependencies.jar berada.
Jalankan pernyataan SQL berikut di CLI spark-sql untuk menulis data dengan membuat tabel sementara.
Karena parameter perlu disesuaikan berkali-kali selama proses pengujian untuk menguji kinerja penulisan mode yang berbeda, tabel sementara digunakan dalam contoh ini.
CatatanDalam skenario bisnis nyata, Anda dapat langsung menggunakan katalog untuk memuat tabel Hologres, yang lebih nyaman.
-- 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
Deskripsi
spark_resources
Jalur yang dikonfigurasikan untuk parameter Root Storage Directory of Cluster saat Anda membuat klaster EMR Spark.
Anda dapat masuk ke Konsol EMR on ECS, klik ID klaster target, dan dapatkan jalur penyimpanan root klaster di bagian Cluster Information tab Basic Information.
hologres_vpc_endpoint
Endpoint jenis jaringan VPC dari instance Hologres.
Anda dapat masuk ke Konsol Hologres, klik ID instance target, dan dapatkan endpoint VPC di bagian Informasi Jaringan halaman Detail Instance. Sebagai contoh, endpoint VPC di wilayah China (Hangzhou) berformat
<Instance ID>-cn-hangzhou-vpc-st.hologres.aliyuncs.com:80.database_name
Nama database dalam instance Hologres.
accesskey_id
ID AccessKey dengan izin baca pada database Hologres yang sesuai.
accesskey_secret
Rahasia AccessKey dengan izin baca pada database Hologres yang sesuai.
table_name
Nama tabel tujuan Hologres.
write.mode
Mode penulisan. Nilai yang valid:
auto: Nilai default, menunjukkan bahwa konektor secara otomatis memilih mode optimal.insert: Gunakan mode INSERT INTO VALUES.stream: Gunakan mode FIXED COPY untuk penulisan streaming.bulk_load: Gunakan mode COPY untuk impor batch ke tabel tanpa kunci utama.bulk_load_on_conflict: Gunakan mode COPY untuk impor batch ke tabel dengan kunci utama.
write.insert.thread_size
Konkurensi penulisan, hanya efektif saat menggunakan mode INSERT INTO VALUES.
write.insert.batch_size
Ukuran penulisan batch, hanya efektif saat menggunakan mode INSERT INTO VALUES.
write.on_conflict_action
INSERT_OR_REPLACE (default): Perbarui pada konflik kunci utama.
INSERT_OR_IGNORE: Abaikan pada konflik kunci utama.
Untuk informasi parameter lebih lanjut, lihat Parameter.
Skenario pengujian
Skema pengujian | Opsi yang tersedia |
Format penyimpanan tabel |
|
Metode pembaruan data |
|
Metode penulisan data |
|
Hasil pengujian
Hasil pengujian mencakup bidang berikut.
Bidang | Deskripsi |
Durasi total eksekusi pekerjaan | Durasi eksekusi total pekerjaan Spark. Bidang ini menunjukkan waktu yang diperlukan untuk menyelesaikan operasi INSERT di CLI spark-sql pada node master klaster EMR Spark. Gambar berikut menunjukkan cara mendapatkan waktu. |
Durasi rata-rata penulisan data | Rata-rata waktu yang dihabiskan hanya untuk penulisan data, tidak termasuk waktu untuk penjadwalan klaster Spark, pembacaan data, dan redistribusi data. Anda dapat menjalankan pernyataan SQL berikut di HoloWeb Konsol Hologres untuk mendapatkan konkurensi Shard (count) dan durasi rata-rata penulisan data (avg_duration_ms, dalam milidetik). Parameter:
|
Beban Hologres | Pemanfaatan CPU instance Hologres. Anda dapat mendapatkan pemanfaatan CPU di halaman Monitoring Information instance di Konsol Hologres. |
Spark Load | Beban Node EMR. Anda dapat masuk ke Konsol EMR on ECS, klik ID klaster, lalu klik tab Monitoring and Diagnostics. Kemudian, klik tab Metric Monitoring, dan konfigurasikan parameter berikut:
Kemudian kueri metrik CPU utilization, yang merupakan beban Spark. |
Tabel berikut memberikan hasil pengujian rinci.
Format penyimpanan | Kunci utama | Mode penulisan | Durasi total eksekusi pekerjaan | Durasi rata-rata penulisan data | Beban Hologres | Beban Spark |
Penyimpanan berorientasi kolom | Tidak ada kunci utama | 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 kunci utama Abaikan | 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 kunci utama Ganti | 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% | ||
Penyimpanan berorientasi baris | Tidak ada kunci utama | 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 kunci utama Abaikan | 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 kunci utama Ganti | 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% | ||
Penyimpanan hibrid baris-kolom | Dengan kunci utama Abaikan | 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 kunci utama Ganti | 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% |
Pemetaan mode penulisan adalah sebagai berikut:
insert: INSERT INTO VALUES
stream: FIXED COPY
bulk_load: Impor berbasis COPY ke tabel tanpa kunci utama
bulk_load_on_conflict: Impor berbasis COPY ke tabel dengan kunci utama
