Topik ini menjelaskan penggunaan konektor ClickHouse untuk menulis data ke ClickHouse.
Informasi latar belakang
ClickHouse adalah sistem manajemen database berorientasi kolom untuk Pemrosesan Analitik Online (OLAP). Untuk informasi selengkapnya, lihat Apa Itu ClickHouse?.
Tabel berikut menjelaskan kemampuan konektor ClickHouse.
|
Kategori |
Detail |
|
Jenis yang didukung |
Hanya tabel hasil |
|
Mode eksekusi |
Mode Batch dan streaming |
|
Format data |
Tidak berlaku |
|
Metrik khusus konektor |
Catatan
Untuk informasi selengkapnya tentang metrik ini, lihat Metrik pemantauan. |
|
Jenis API |
SQL |
|
Dukungan untuk memperbarui atau menghapus data di tabel hasil |
Konektor mendukung pembaruan dan penghapusan jika Anda menentukan primary key dalam DDL tabel hasil Flink dan mengatur parameter |
Fitur
-
Menulis data langsung ke tabel lokal dari tabel terdistribusi ClickHouse.
-
Mencapai semantik tepat-sekali saat menulis ke ClickHouse pada Alibaba Cloud E-MapReduce (EMR).
Prasyarat
-
Buat tabel ClickHouse. Untuk informasi selengkapnya, lihat Buat Tabel Baru.
-
Konfigurasikan daftar putih.
-
Jika Anda menggunakan ApsaraDB for ClickHouse, lihat Konfigurasikan daftar putih.
-
Jika Anda menggunakan ClickHouse pada Alibaba Cloud E-MapReduce (EMR), lihat Kelola security group.
-
Jika Anda menggunakan kluster ClickHouse yang dikelola sendiri pada Instance ECS, lihat Ikhtisar security group.
-
Untuk semua konfigurasi lainnya, konfigurasikan daftar putih pada mesin tempat ClickHouse dideploy agar mengizinkan akses dari penerapan Realtime Compute for Apache Flink.
CatatanUntuk melihat segmen jaringan vSwitch untuk Realtime Compute for Apache Flink, lihat Bagaimana cara mengonfigurasi daftar putih?.
-
Batasan
-
Parameter
sink.parallelismtidak didukung. -
Secara default, sink ClickHouse menyediakan semantik at-least-once.
-
Konektor ClickHouse hanya didukung di Ververica Runtime (VVR) 3.0.2 dan versi setelahnya.
-
Opsi
ignoreDeletehanya didukung di VVR 3.0.3, VVR 4.0.7, dan versi setelahnya. -
Tipe data Nested ClickHouse hanya didukung di VVR 4.0.10 dan versi setelahnya.
-
Penulisan langsung ke tabel lokal dari tabel terdistribusi hanya didukung di VVR 4.0.11 dan versi setelahnya.
-
Semantik tepat-sekali untuk menulis ke ClickHouse pada EMR hanya tersedia di VVR 4.0.11 dan versi setelahnya. Namun, karena perubahan kemampuan produk, semantik ini tidak tersedia untuk ClickHouse pada EMR v3.45.1 dan versi setelah v5.11.1.
-
Mode penulisan
balance, yang mendistribusikan data secara merata ke node tabel lokal, hanya tersedia di VVR 8.0.7 dan versi setelahnya. -
Penulisan ke tabel lokal ClickHouse hanya didukung untuk Edisi kompatibel Komunitas ApsaraDB for ClickHouse.
-
Saat Anda mendaftarkan katalog ClickHouse, nama database default tidak boleh mengandung tanda hubung (
-). Jika tidak, validasi URL JDBC akan gagal.
Sintaksis
CREATE TABLE clickhouse_sink (
id INT,
name VARCHAR,
age BIGINT,
rate FLOAT
) WITH (
'connector' = 'clickhouse',
'url' = '<yourUrl>',
'userName' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTablename>',
'maxRetryTimes' = '3',
'batchSize' = '8000',
'flushIntervalMs' = '1000',
'ignoreDelete' = 'true',
'shardWrite' = 'false',
'writeMode' = 'partition',
'shardingKey' = 'id'
);
DENGAN parameter
|
Parameter |
Deskripsi |
Tipe |
Wajib |
Default |
Keterangan |
|
connector |
Jenis tabel hasil. |
String |
Ya |
N/A |
Atur nilainya ke clickhouse. |
|
url |
URL JDBC kluster ClickHouse Anda. |
String |
Ya |
N/A |
Format URL adalah Catatan
Jika Anda ingin menulis data ke tabel terdistribusi ClickHouse, |
|
userName |
Username untuk mengakses ClickHouse. |
String |
Ya |
N/A |
N/A |
|
password |
Password untuk mengakses ClickHouse. |
String |
Ya |
N/A |
N/A |
|
tableName |
Nama tabel ClickHouse. |
String |
Ya |
N/A |
N/A |
|
maxRetryTimes |
Jumlah maksimum percobaan ulang setelah gagal memasukkan data ke tabel hasil. |
Int |
Tidak |
3 |
N/A |
|
batchSize |
Jumlah catatan yang ditulis dalam satu batch. |
Int |
Tidak |
100 |
Jika jumlah entri data dalam cache mencapai nilai parameter batchSize atau waktu tunggu melebihi flushIntervalMs, sistem secara otomatis menulis data dari cache ke tabel ClickHouse. |
|
flushIntervalMs |
Interval waktu, dalam milidetik, untuk membersihkan buffer. |
Long |
Tidak |
1000 |
Unitnya adalah milidetik. |
|
ignoreDelete |
Menentukan apakah pesan penghapusan diabaikan. |
Boolean |
Tidak |
true |
Nilai yang valid:
Catatan
Jika Anda mengatur |
|
shardWrite |
Untuk tabel terdistribusi ClickHouse, menentukan apakah data ditulis langsung ke tabel lokal yang mendasarinya. |
Boolean |
Tidak |
false |
Nilai yang valid:
|
|
inferLocalTable |
Saat menulis ke tabel terdistribusi ClickHouse, menentukan apakah tabel lokal yang mendasarinya ditemukan secara otomatis dan data ditulis langsung ke tabel tersebut. |
Boolean |
Tidak |
false |
Nilai yang valid:
Catatan
Parameter ini diabaikan saat menulis ke tabel non-terdistribusi. |
|
writeMode |
Strategi untuk menulis data ke tabel lokal dari tabel terdistribusi. |
Enum |
Tidak |
default |
Nilai yang valid:
Catatan
Jika Anda mengatur |
|
shardingKey |
Kunci yang digunakan untuk mem-partisi data ke node tabel lokal. |
String |
Tidak |
N/A |
Saat writeMode diatur ke 'partition', parameter shardingKey wajib diisi. Parameter ini dapat berisi beberapa bidang yang dipisahkan koma (,). |
|
exactlyOnce |
Menentukan apakah semantik tepat-sekali diaktifkan. |
Boolean |
Tidak |
false |
Nilai yang valid:
Catatan
|
Pemetaan tipe data
|
Tipe Flink |
Tipe ClickHouse |
|
BOOLEAN |
UInt8 / Boolean Catatan
ClickHouse v21.12 dan versi setelahnya mendukung tipe Boolean. Untuk versi sebelumnya, tipe BOOLEAN Flink dipetakan ke tipe UInt8 ClickHouse. |
|
TINYINT |
Int8 |
|
SMALLINT |
Int16 |
|
INTEGER |
Int32 |
|
BIGINT |
Int64 |
|
BIGINT |
UInt32 |
|
FLOAT |
Float32 |
|
DOUBLE |
Float64 |
|
CHAR |
FixedString |
|
VARCHAR |
String |
|
BINARY |
FixedString |
|
VARBINARY |
String |
|
DATE |
Date |
|
TIMESTAMP(0) |
DateTime |
|
TIMESTAMP(x) |
Datetime64(x) |
|
DECIMAL |
DECIMAL |
|
ARRAY |
ARRAY |
|
Nested |
Konektor ClickHouse tidak mendukung tipe Flink TIME, MAP, MULTISET, dan ROW.
Untuk menggunakan tipe data Nested ClickHouse, Anda harus memetakannya ke tipe ARRAY di Flink. Contohnya:
-- ClickHouse
CREATE TABLE visits (
StartDate Date,
Goals Nested
(
ID UInt32,
OrderID String
)
...
);
Petakan tipe sebagai berikut:
-- Flink
CREATE TABLE visits (
StartDate DATE,
`Goals.ID` ARRAY<LONG>,
`Goals.OrderID` ARRAY<STRING>
);
Pada versi VVR sebelum 6.0.6, penulisan data DateTime64 dengan driver JDBC resmi ClickHouse menyebabkan hilangnya presisi karena pemotongan nilai ke tingkat detik. Akibatnya, hanya data TIMESTAMP dengan presisi tingkat detik, seperti TIMESTAMP(0), yang dapat ditulis dengan sukses. VVR 6.0.6 dan versi setelahnya menyelesaikan masalah ini, sehingga memungkinkan penulisan data DateTime64 secara akurat.
Contoh
-
Contoh 1: Menulis ke tabel single-node.
CREATE TEMPORARY TABLE clickhouse_source ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '50' ); CREATE TEMPORARY TABLE clickhouse_output ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'clickhouse', 'url' = '<yourUrl>', 'userName' = '<yourUsername>', 'password' = '<yourPassword>', 'tableName' = '<yourTablename>' ); INSERT INTO clickhouse_output SELECT id, name, age, rate FROM clickhouse_source; -
Contoh 2: Menulis ke tabel terdistribusi.
Asumsikan tabel terdistribusi bernama distributed_table_test dibuat dari tiga tabel lokal bernama local_table_test, yang berlokasi di node 192.XX.XX.1, 192.XX.XX.2, dan 192.XX.XX.3.
-
Jika Anda ingin Flink menulis data langsung ke tabel lokal dan mem-partisi data berdasarkan kunci, gunakan DDL berikut:
CREATE TEMPORARY TABLE clickhouse_source ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '50' ); CREATE TEMPORARY TABLE clickhouse_output ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'clickhouse', 'url' = 'jdbc:clickhouse://192.XX.XX.1:3002,192.XX.XX.2:3002,192.XX.XX.3:3002/default', 'userName' = '<yourUsername>', 'password' = '<yourPassword>', 'tableName' = 'local_table_test', 'shardWrite' = 'true', 'writeMode' = 'partition', 'shardingKey' = 'name' ); INSERT INTO clickhouse_output SELECT id, name, age, rate FROM clickhouse_source; -
Jika Anda ingin Flink secara otomatis menemukan node tabel lokal alih-alih menentukannya secara manual dalam URL, gunakan DDL berikut:
CREATE TEMPORARY TABLE clickhouse_source ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '50' ); CREATE TEMPORARY TABLE clickhouse_output ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'clickhouse', 'url' = 'jdbc:clickhouse://192.XX.XX.1:3002/default', -- URL JDBC dari salah satu node dalam kluster. 'userName' = '<yourUsername>', 'password' = '<yourPassword>', 'tableName' = 'distributed_table_test', -- Nama tabel terdistribusi. 'shardWrite' = 'true', 'inferLocalTable' = 'true', -- Atur inferLocalTable ke true. 'writeMode' = 'partition', 'shardingKey' = 'name' ); INSERT INTO clickhouse_output SELECT id, name, age, rate FROM clickhouse_source;
-