All Products
Search
Document Center

Realtime Compute for Apache Flink:Konektor ClickHouse

Last Updated:May 23, 2026

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

  • numRecordsOut

  • numRecordsOutPerSecond

  • currentSendTime

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 ignoreDelete ke false. Namun, opsi ini secara signifikan menurunkan performa.

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.

    Catatan

    Untuk melihat segmen jaringan vSwitch untuk Realtime Compute for Apache Flink, lihat Bagaimana cara mengonfigurasi daftar putih?.

Batasan

  • Parameter sink.parallelism tidak 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 ignoreDelete hanya 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 jdbc:clickhouse://<yourNetworkAddress>:<port>/<yourDatabaseName>. Saat menulis langsung ke tabel lokal, Anda dapat memperoleh alamat IP node dengan menjalankan select * from system.clusters di ClickHouse. Jika Anda tidak menentukan nama database, database default akan digunakan.

Catatan

Jika Anda ingin menulis data ke tabel terdistribusi ClickHouse, url harus berupa URL JDBC dari salah satu node dalam kluster yang menghosting tabel terdistribusi tersebut.

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:

  • true (default): Mengabaikan pesan penghapusan.

  • false: Tidak mengabaikan pesan penghapusan.

    Jika opsi ini diatur ke false dan primary key didefinisikan dalam DDL, konektor menggunakan pernyataan ALTER untuk menghapus data di ClickHouse.

Catatan

Jika Anda mengatur ignoreDelete ke false, Anda tidak dapat menggunakan mode penulisan partition.

shardWrite

Untuk tabel terdistribusi ClickHouse, menentukan apakah data ditulis langsung ke tabel lokal yang mendasarinya.

Boolean

Tidak

false

Nilai yang valid:

  • false (default): Konektor menulis data ke tabel terdistribusi, yang kemudian mengarahkan data ke tabel lokal yang sesuai. Parameter tableName harus berupa nama tabel terdistribusi.

  • true: Konektor menulis data langsung ke tabel lokal, melewati tabel terdistribusi.

    Ini direkomendasikan untuk meningkatkan throughput penulisan.

    • Jika Anda ingin menentukan secara manual tabel lokal mana yang akan ditulis dalam url, tableName harus berupa nama tabel lokal. Contoh:

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002,192.XX.XX.2:3002/default'
      'tableName' = 'local_table'
    • Jika Anda tidak ingin menentukan node secara manual, Anda dapat mengatur parameter inferLocalTable ke true agar Flink secara otomatis menemukan node tabel lokal. Dalam kasus ini, tableName harus berupa nama tabel terdistribusi, dan url harus berupa URL JDBC dari salah satu node dalam kluster. Contoh:

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002/default' // URL JDBC dari salah satu node dalam kluster.
      'tableName' = 'distribute_table'

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:

  • false (default): Jika Anda menulis ke tabel terdistribusi dan hanya menentukan satu node dalam parameter url, konektor tidak mencoba menemukan tabel lokal. Data ditulis ke tabel terdistribusi, yang kemudian mengarahkan data ke tabel lokal.

  • true: Flink mencoba menemukan tabel lokal dan menulis langsung ke tabel tersebut. Ini memerlukan shardWrite diatur ke true, tableName berupa nama tabel terdistribusi, dan url berupa URL JDBC dari salah satu node dalam kluster.

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:

  • default (default): Selalu menulis ke tabel lokal pada node pertama yang ditentukan dalam URL.

  • partition: Mendistribusikan data berdasarkan kunci sharding, memastikan catatan dengan kunci yang sama ditulis ke node tabel lokal yang sama.

  • random: Menulis data ke node tabel lokal yang dipilih secara acak.

  • balance: Menggunakan strategi round-robin untuk mendistribusikan data secara merata ke semua node tabel lokal.

Catatan

Jika Anda mengatur writeMode ke partition, Anda harus mengatur ignoreDelete ke true.

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:

  • true: Mengaktifkan semantik tepat-sekali.

  • false (default): Menonaktifkan semantik tepat-sekali.

Catatan
  • Semantik tepat-sekali hanya didukung untuk menulis ke ClickHouse pada EMR. Atur parameter ini ke true hanya jika sink Anda adalah kluster ClickHouse pada EMR.

  • Semantik tepat-sekali tidak didukung untuk menulis ke tabel lokal ClickHouse dengan strategi partition. Oleh karena itu, jika exactlyOnce diatur ke true, writeMode tidak boleh diatur ke partition.

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

Catatan

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

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;

FAQ