Pelajari cara menggunakan connector StarRocks dalam pekerjaan SQL.
Latar Belakang
StarRocks adalah gudang data Pemrosesan Paralel Masif (MPP) generasi berikutnya yang menawarkan performa sangat cepat di semua skenario serta pengalaman analitik terpadu. StarRocks memiliki keunggulan berikut:
-
StarRocks kompatibel dengan protokol MySQL, sehingga Anda dapat menggunakan klien MySQL dan alat Business Intelligence (BI) umum untuk menghubungkan dan menganalisis data.
-
StarRocks menggunakan arsitektur terdistribusi:
-
Tabel data dipartisi secara horizontal dan disimpan dalam beberapa replika.
-
Kluster dapat diskalakan secara fleksibel dan mampu menganalisis hingga 10 petabyte (PB) data.
-
Menggunakan framework MPP untuk mempercepat komputasi paralel.
-
Mendukung beberapa replika untuk menyediakan toleransi kesalahan.
-
Connector Flink menyimpan data dalam cache dan menggunakan Stream Load untuk menuliskannya secara batch ke tabel sink. Connector ini membaca dari tabel sumber dengan mengambil data secara batch. Tabel berikut mencantumkan kemampuan connector StarRocks.
|
Kategori |
Deskripsi |
|
Jenis yang didukung |
tabel sumber, tabel dimensi, tabel sink, dan target ingesti data |
|
Mode eksekusi |
mode streaming dan mode batch |
|
Format data |
CSV |
|
Metrik khusus connector |
Tidak ada |
|
Jenis API |
DataStream, SQL, dan YAML untuk ingesti data |
|
Dukungan pembaruan/penghapusan pada tabel sink |
Ya |
Prasyarat
Anda harus memiliki kluster StarRocks yang dideploy di EMR atau yang dikelola sendiri di ECS.
Batasan
-
Hanya Ververica Runtime (VVR) 11.1 atau versi lebih baru yang mendukung penggabungan dengan tabel dimensi.
-
Untuk menghindari pembatasan akses jaringan, tambahkan port kluster StarRocks berikut ke daftar putih security group atau firewall: 9030, 8030, 8040, 9060, 8060, 9020.
-
Saat tabel StarRocks target berisi kolom tersembunyi yang di-generate, deklarasikan hanya kolom fisik aktual yang akan ditulis dalam pekerjaan Flink, dan kecualikan bidang kolom yang di-generate. Kolom tersembunyi yang di-generate secara otomatis oleh ekspresi partisi StarRocks (seperti
__generated_partition_column_0) tidak menerima penulisan eksternal. Secara default, connector membuat permintaan tulis berdasarkan skema lengkap, yang menyebabkan pekerjaan gagal. Untuk informasi lebih lanjut tentang kolom yang di-generate di StarRocks, lihat Generated columns.
Fitur
StarRocks pada E-MapReduce mendukung pernyataan CREATE TABLE AS SELECT (CTAS) dan CREATE DATABASE AS SELECT (CDAS). CTAS menyinkronkan skema dan data satu tabel, sedangkan CDAS menyinkronkan seluruh database atau beberapa tabel dalam database yang sama. Untuk informasi lebih lanjut, lihat Gunakan pernyataan CTAS dan CDAS di Realtime Compute for Apache Flink untuk menyinkronkan data dari database MySQL ke StarRocks.
Sintaks
CREATE TABLE USER_RESULT(
name VARCHAR,
score BIGINT
) WITH (
'connector' = 'starrocks',
'jdbc-url'='jdbc:mysql://fe1_ip:query_port,fe2_ip:query_port,fe3_ip:query_port?xxxxx',
'load-url'='fe1_ip:http_port;fe2_ip:http_port;fe3_ip:http_port',
'database-name' = 'xxx',
'table-name' = 'xxx',
'username' = 'xxx',
'password' = 'xxx'
);
Parameter
|
Jenis |
Parameter |
Deskripsi |
Tipe |
Wajib |
Default |
Keterangan |
|
Umum |
connector |
Menentukan connector yang digunakan. |
String |
Ya |
— |
Nilainya harus |
|
jdbc-url |
URL Java Database Connectivity (JDBC). |
String |
Ya |
— |
Tentukan alamat IP dan port JDBC FE dalam format |
|
|
database-name |
Nama database StarRocks. |
String |
Ya |
— |
— |
|
|
table-name |
Nama tabel StarRocks. |
String |
Ya |
— |
— |
|
|
username |
Username untuk menghubungkan ke StarRocks. |
String |
Ya |
— |
— |
|
|
password |
Password untuk menghubungkan ke StarRocks. |
String |
Ya |
— |
— |
|
|
starrocks.create.table.properties |
Menentukan properti untuk pembuatan tabel otomatis. |
String |
Tidak |
— |
Menentukan properti awal tabel, seperti engine dan jumlah replika. Contoh: 'starrocks.create.table.properties' = 'buckets 8' atau 'starrocks.create.table.properties' = 'replication_num=1'. |
|
|
Khusus Sumber |
scan-url |
URL pemindaian data. |
String |
Tidak |
— |
Menentukan alamat IP dan port HTTP FE. Format: Catatan
Untuk menentukan beberapa alamat IP dan port, pisahkan dengan koma (,). |
|
scan.connect.timeout-ms |
Timeout untuk Connector melaporkan error jika koneksi tidak berhasil dibuat dalam batas waktu ini. |
String |
Tidak |
1000 |
Unit: milidetik. |
|
|
scan.params.keep-alive-min |
Durasi keep-alive untuk tugas kueri. |
String |
Tidak |
10 |
— |
|
|
scan.params.query-timeout-s |
Timeout untuk tugas kueri. Jika tidak ada hasil yang dikembalikan dalam periode ini, sistem menghentikan tugas kueri. |
String |
Tidak |
600 |
Unit: detik. |
|
|
scan.params.mem-limit-byte |
Batas memori untuk satu kueri pada node BE. |
String |
Tidak |
1073741824 (1 GB) |
Unit: byte. |
|
|
scan.max-retries |
Jumlah maksimum percobaan ulang untuk kueri yang gagal. Connector melaporkan error jika batas ini terlampaui. |
String |
Tidak |
1 |
— |
|
|
Khusus Sink |
load-url |
URL impor data. |
String |
Ya |
— |
Tentukan alamat IP dan port HTTP FE dalam format Catatan
Untuk menentukan beberapa alamat IP dan port, pisahkan dengan titik koma (;). |
|
sink.semantic |
Semantik pengiriman untuk penulisan. |
String |
Tidak |
at-least-once |
Nilai yang valid:
|
|
|
sink.buffer-flush.max-bytes |
Jumlah maksimum data yang dibuffer sebelum flush. |
String |
Tidak |
94371840 (90 MB) |
Rentang valid: 64 MB hingga 10 GB. |
|
|
sink.buffer-flush.max-rows |
Jumlah maksimum baris yang dibuffer sebelum flush. |
String |
Tidak |
500000 |
Rentang valid: 1.000 hingga 5.000.000. |
|
|
sink.buffer-flush.interval-ms |
Interval flush buffer. |
String |
Tidak |
300000 |
Rentang valid: 1.000 ms hingga 3.600.000 ms. |
|
|
sink.max-retries |
Jumlah maksimum percobaan ulang untuk penulisan yang gagal. |
String |
Tidak |
3 |
Rentang valid: 0 hingga 1000. |
|
|
sink.connect.timeout-ms |
Timeout untuk menghubungkan ke StarRocks. |
String |
Tidak |
1000 |
Rentang valid: 100 hingga 60.000. Unit: milidetik. |
|
|
sink.properties.* |
Properti Stream Load tambahan untuk sink. |
String |
Tidak |
— |
Parameter ini mengontrol perilaku Stream Load. Misalnya, |
|
|
Khusus Dimensi |
lookup.cache.enabled |
Menentukan apakah caching untuk tabel dimensi diaktifkan. |
Boolean |
Tidak |
true |
Nilai yang valid:
Penting
|
Pemetaan tipe data
|
Tipe data StarRocks |
Tipe data Flink |
|
NULL |
NULL |
|
BOOLEAN |
BOOLEAN |
|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INT |
INT |
|
BIGINT |
BIGINT |
|
BIGINT UNSIGNED Catatan
Memerlukan engine Realtime Compute for Apache Flink VVR 8.0.10 dan versi lebih baru. |
DECIMAL(20,0) |
|
LARGEINT |
DECIMAL(20,0) |
|
FLOAT |
FLOAT |
|
DOUBLE |
DOUBLE |
|
DATE |
DATE |
|
DATETIME |
TIMESTAMP |
|
DECIMAL |
DECIMAL |
|
DECIMALV2 |
DECIMAL |
|
DECIMAL32 |
DECIMAL |
|
DECIMAL64 |
DECIMAL |
|
DECIMAL128 |
DECIMAL |
|
CHAR(m) Catatan
|
CHAR(n) |
|
VARCHAR(m) Catatan
|
CHAR(n) |
|
VARCHAR |
STRING |
|
VARBINARY Catatan
Memerlukan engine Realtime Compute for Apache Flink VVR 8.0.10 dan versi lebih baru. |
VARBINARY |
Contoh
Tabel sumber, tabel sink, dan tabel dimensi dalam contoh berikut dapat digunakan bersama. Tabel runoob_tbl_source yang dideklarasikan dalam contoh tabel sumber juga berfungsi sebagai sumber data untuk contoh tabel sink dan tabel dimensi. Sebelum menggunakan contoh-contoh ini, siapkan tabel dengan tipe bidang yang sesuai di StarRocks, lalu ganti titik akhir, nama database dan tabel, serta variabel rahasia.
Tabel sumber
CREATE TEMPORARY TABLE runoob_tbl_source (
runoob_id BIGINT NOT NULL,
runoob_title STRING NOT NULL,
runoob_author STRING NOT NULL,
submission_date DATE,
proc_time AS PROCTIME() --Kolom waktu pemrosesan, digunakan oleh temporal join dalam contoh tabel dimensi
) WITH (
'connector' = 'starrocks',
'jdbc-url' = 'jdbc:mysql://<fe_host>:9030', --Titik akhir protokol MySQL FE. Pisahkan beberapa titik akhir dengan koma (,).
'scan-url' = '<fe_host>:8030', --Titik akhir HTTP FE. Pisahkan beberapa titik akhir dengan koma (,).
'database-name' = '<database_name>',
'table-name' = '<source_table_name>',
'username' = '${secret_values.starrocks_username}', --Gunakan variabel rahasia untuk mencegah kebocoran kredensial
'password' = '${secret_values.starrocks_password}',
'scan.params.query-timeout-s' = '600' --Timeout untuk satu kueri, dalam detik
);
Tabel sumber dibaca dalam mode batch. Setelah pekerjaan dimulai, tabel melakukan pemindaian data saat ini lalu berhenti menghasilkan output. Tabel ini tidak terus-menerus menghasilkan perubahan inkremental.
Tabel sink
StarRocks mengizinkan kolom kunci primer menjadi NULLABLE. Namun, Flink tidak mendukung kunci primer yang berisi kolom nullable. Model konsistensi data Flink mensyaratkan bahwa kunci primer harus unik dan non-nullable. Jika tidak, Flink akan melemparkan error Invalid primary key. Column 'xxx' is nullable. Untuk informasi lebih lanjut, lihat Error "Invalid primary key. Column 'xxx' is nullable.".
VVR 11+
CREATE TEMPORARY TABLE runoob_tbl_sink (
runoob_id BIGINT NOT NULL, --Kolom kunci primer harus dideklarasikan sebagai NOT NULL
runoob_title STRING NOT NULL,
runoob_author STRING NOT NULL,
submission_date DATE,
PRIMARY KEY (runoob_id) NOT ENFORCED
) WITH (
'connector' = 'starrocks',
'jdbc-url' = 'jdbc:mysql://<fe_host>:9030', --Titik akhir protokol MySQL FE. Pisahkan beberapa titik akhir dengan koma (,).
'load-url' = '<fe_host>:8030', --Titik akhir HTTP FE. Pisahkan beberapa titik akhir dengan titik koma (;).
'database-name' = '<database_name>',
'table-name' = '<sink_table_name>',
'username' = '${secret_values.starrocks_username}', --Gunakan variabel rahasia untuk mencegah kebocoran kredensial
'password' = '${secret_values.starrocks_password}',
'sink.version' = 'V2', --Transactional Stream Load. Memerlukan StarRocks 2.4 atau versi lebih baru.
'sink.semantic' = 'at-least-once', --Opsional. exactly-once juga didukung dan memerlukan checkpointing.
'sink.buffer-flush.interval-ms' = '5000' --Interval flush batch, dalam milidetik
);
INSERT INTO runoob_tbl_sink
SELECT runoob_id, runoob_title, runoob_author, submission_date
FROM runoob_tbl_source;
VVR 8+
Pada VVR 8.x, nilai default sink.version adalah V1, dan V1, V2, serta AUTO didukung. Parameter yang hanya tersedia di VVR 11.x, seperti sink.ignore.update-before, tidak didukung:
CREATE TEMPORARY TABLE runoob_tbl_sink (
runoob_id BIGINT NOT NULL, --Kolom kunci primer harus dideklarasikan sebagai NOT NULL
runoob_title STRING NOT NULL,
runoob_author STRING NOT NULL,
submission_date DATE,
PRIMARY KEY (runoob_id) NOT ENFORCED
) WITH (
'connector' = 'starrocks',
'jdbc-url' = 'jdbc:mysql://<fe_host>:9030', --Titik akhir protokol MySQL FE. Pisahkan beberapa titik akhir dengan koma (,).
'load-url' = '<fe_host>:8030', --Titik akhir HTTP FE. Pisahkan beberapa titik akhir dengan titik koma (;).
'database-name' = '<database_name>',
'table-name' = '<sink_table_name>',
'username' = '${secret_values.starrocks_username}', --Gunakan variabel rahasia untuk mencegah kebocoran kredensial
'password' = '${secret_values.starrocks_password}',
'sink.semantic' = 'at-least-once', --Opsional. exactly-once juga didukung dan memerlukan checkpointing.
'sink.buffer-flush.interval-ms' = '5000', --Interval flush batch, dalam milidetik
'sink.max-retries' = '3' --Jumlah percobaan ulang setelah kegagalan Stream Load
);
INSERT INTO runoob_tbl_sink
SELECT runoob_id, runoob_title, runoob_author, submission_date
FROM runoob_tbl_source;
Tabel dimensi
Penggabungan tabel dimensi hanya didukung di VVR 11.1 dan versi lebih baru. Tabel dimensi harus mendeklarasikan kunci primer sebagai kunci gabungan, dan temporal join menggunakan waktu pemrosesan. Contoh berikut membangun tabel runoob_tbl_source dari contoh tabel sumber, yang mencakup kolom waktu pemrosesan proc_time:
CREATE TEMPORARY TABLE sr_dim (
runoob_id BIGINT NOT NULL,
runoob_author STRING,
PRIMARY KEY (runoob_id) NOT ENFORCED --Tabel dimensi harus mendeklarasikan kunci primer sebagai kunci gabungan
) WITH (
'connector' = 'starrocks',
'jdbc-url' = 'jdbc:mysql://<fe_host>:9030', --Titik akhir protokol MySQL FE. Pisahkan beberapa titik akhir dengan koma (,).
'scan-url' = '<fe_host>:8030', --Titik akhir HTTP FE. Pisahkan beberapa titik akhir dengan koma (,).
'database-name' = '<database_name>',
'table-name' = '<dim_table_name>',
'username' = '${secret_values.starrocks_username}', --Gunakan variabel rahasia untuk mencegah kebocoran kredensial
'password' = '${secret_values.starrocks_password}',
'lookup.cache.ttl-ms' = '5000', --TTL cache tabel dimensi, dalam milidetik
'lookup.cache.enabled' = 'true' --Default: true. Atur ke false untuk mengkueri tabel langsung tanpa cache.
);
SELECT o.runoob_id, o.runoob_title, d.runoob_author
FROM runoob_tbl_source AS o
JOIN sr_dim FOR SYSTEM_TIME AS OF o.proc_time AS d --Temporal join yang menggunakan kolom waktu pemrosesan tabel sumber
ON o.runoob_id = d.runoob_id;