Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:Conector do ClickHouse

Última atualização: Nov 03, 2026

Este tópico descreve como usar o conector do ClickHouse para gravar dados no ClickHouse.

Informações de contexto

O ClickHouse é um sistema de gerenciamento de banco de dados orientado a colunas para processamento analítico online (OLAP). Para mais informações, consulte O que é o ClickHouse?.

A tabela a seguir descreve os recursos do conector do ClickHouse.

Categoria

Detalhes

Tipo suportado

Apenas tabela de resultados

Modo de execução

Modos em lote e de streaming

Formato de dados

Não aplicável

Métricas específicas do conector

  • numRecordsOut

  • numRecordsOutPerSecond

  • currentSendTime

Nota

Para mais informações sobre essas métricas, consulte Monitoring metrics.

Tipo de API

SQL

Suporte para atualizar ou excluir dados em uma tabela de resultados

O conector suporta atualizações e exclusões se você especificar uma chave primária na DDL da tabela de resultados do Flink e definir o parâmetro ignoreDelete como false. No entanto, essa opção reduz significativamente o desempenho.

Recursos

  • Grave dados diretamente nas tabelas locais de uma tabela distribuída do ClickHouse.

  • Obtenha a semântica exactly-once ao gravar no ClickHouse no Alibaba Cloud E-MapReduce (EMR).

Pré-requisitos

  • Crie uma tabela do ClickHouse. Para mais informações, consulte Criar uma nova tabela.

  • Configure uma lista de permissões.

    • Se você usar o ApsaraDB for ClickHouse, consulte Configure a whitelist.

    • Se você usar o ClickHouse no Alibaba Cloud E-MapReduce (EMR), consulte Manage security groups.

    • Se você usar um cluster do ClickHouse autogerenciado em uma instância do ECS, consulte Security group overview.

    • Para todas as outras configurações, configure a lista de permissões na máquina onde o ClickHouse está implantado para permitir o acesso a partir da implantação do Realtime Compute for Apache Flink.

    Nota

    Para visualizar o segmento de rede do vSwitch para o Realtime Compute for Apache Flink, consulte How do I configure a whitelist?.

Limitações

  • O parâmetro sink.parallelism não é suportado.

  • Por padrão, o sink do ClickHouse fornece a semântica at-least-once.

  • O conector do ClickHouse é suportado apenas no Ververica Runtime (VVR) 3.0.2 e versões posteriores.

  • A opção ignoreDelete é suportada apenas no VVR 3.0.3, VVR 4.0.7 e versões posteriores.

  • O tipo de dado Nested do ClickHouse é suportado apenas no VVR 4.0.10 e versões posteriores.

  • Gravações diretas nas tabelas locais de uma tabela distribuída são suportadas apenas no VVR 4.0.11 e versões posteriores.

  • A semântica exactly-once para gravação no ClickHouse no EMR está disponível apenas no VVR 4.0.11 e versões posteriores. No entanto, devido a alterações nas capacidades do product EMR, a semântica exactly-once também não está disponível para o ClickHouse no EMR em versões posteriores a 3.45.1 e 5.11.1.

  • O modo de gravação balance, que distribui dados uniformemente entre os nós da tabela local, está disponível apenas no VVR 8.0.7 e versões posteriores.

  • A gravação em uma tabela local do ClickHouse é suportada apenas para o ApsaraDB for ClickHouse Community-compatible Edition.

  • Ao registrar um catálogo do ClickHouse, o nome do banco de dados padrão não pode conter um hífen (-). Caso contrário, a validação da URL JDBC falhará.

Sintaxe

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

Parâmetros WITH

Parâmetro

Descrição

Tipo

Obrigatório

Padrão

Observações

connector

O tipo da tabela de resultados.

String

Sim

N/D

Defina o valor como clickhouse.

url

A URL JDBC do seu cluster do ClickHouse.

String

Sim

N/D

O formato da URL é jdbc:clickhouse://<yourNetworkAddress>:<port>/<yourDatabaseName>. Ao gravar diretamente em uma tabela local, obtenha o endereço IP do nó executando select * from system.clusters no ClickHouse. Caso não especifique um nome de banco de dados, o banco de dados default será usado.

Nota

Se você quiser gravar dados em uma tabela distribuída do ClickHouse, url deve ser a URL JDBC de um nó no cluster que hospeda a tabela distribuída.

userName

O nome de usuário para acessar o ClickHouse.

String

Sim

N/D

N/D

password

A senha para acessar o ClickHouse.

String

Sim

N/D

N/D

tableName

O nome da tabela do ClickHouse.

String

Sim

N/D

N/D

maxRetryTimes

O número máximo de tentativas após uma falha ao inserir dados na tabela de resultados.

Int

Não

3

N/D

batchSize

O número de registros a serem gravados em um único lote.

Int

Não

100

Se o número de entradas de dados no cache atingir o valor do parâmetro batchSize ou o tempo de espera exceder flushIntervalMs, o sistema grava automaticamente os dados do cache na tabela do ClickHouse.

flushIntervalMs

O intervalo de tempo, em milissegundos, para liberar o buffer.

Long

Não

1000

A unidade é milissegundos.

ignoreDelete

Especifica se as mensagens de exclusão devem ser ignoradas.

Boolean

Não

true

Valores válidos:

  • true (padrão): Ignora mensagens de exclusão.

  • false: Não ignora mensagens de exclusão.

    Se esta opção for definida como false e uma chave primária for definida na DDL, o conector usa uma instrução ALTER para excluir dados no ClickHouse.

Nota

Se você definir ignoreDelete como false, não poderá usar o modo de gravação partition.

shardWrite

Para uma tabela distribuída do ClickHouse, especifica se os dados devem ser gravados diretamente nas tabelas locais subjacentes.

Boolean

Não

false

Valores válidos:

  • false (padrão): O conector grava dados na tabela distribuída, que então roteia os dados para as tabelas locais correspondentes. O parâmetro tableName deve ser o nome da tabela distribuída.

  • true: O conector grava dados diretamente nas tabelas locais, ignorando a tabela distribuída.

    Isso é recomendado para melhorar o throughput de gravação.

    • Se você quiser especificar manualmente em quais tabelas locais gravar na url, o tableName deve ser o nome da tabela local. Exemplo:

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002,192.XX.XX.2:3002/default'
      'tableName' = 'local_table'
    • Se você não quiser especificar manualmente os nós, defina o parâmetro inferLocalTable como true para permitir que o Flink descubra automaticamente os nós da tabela local. Nesse caso, tableName deve ser o nome da tabela distribuída e url deve ser a URL JDBC de um nó no cluster. Exemplo:

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002/default' // The JDBC URL of a node in the cluster.
      'tableName' = 'distribute_table'

inferLocalTable

Ao gravar em uma tabela distribuída do ClickHouse, especifica se as tabelas locais subjacentes devem ser descobertas automaticamente e se a gravação deve ser feita diretamente nelas.

Boolean

Não

false

Valores válidos:

  • false (padrão): Se você estiver gravando em uma tabela distribuída e especificar apenas um nó no parâmetro url, o conector não tentará descobrir as tabelas locais. Ele grava na tabela distribuída, que então roteia os dados para as tabelas locais.

  • true: O Flink tenta descobrir as tabelas locais e grava diretamente nelas. Isso requer que shardWrite seja definido como true, tableName seja o nome da tabela distribuída e url seja a URL JDBC de um nó no cluster.

Nota

Este parâmetro é ignorado ao gravar em uma tabela não distribuída.

writeMode

A estratégia para gravar dados nas tabelas locais de uma tabela distribuída.

Enum

Não

default

Valores válidos:

  • default (padrão): Sempre grava na tabela local no primeiro nó especificado na URL.

  • partition: Distribui dados com base em uma chave de shard, garantindo que registros com a mesma chave sejam gravados no mesmo nó da tabela local.

  • random: Grava dados em um nó de tabela local selecionado aleatoriamente.

  • balance: Usa uma estratégia round-robin para distribuir dados uniformemente entre todos os nós da tabela local.

Nota

Se você definir writeMode como partition, deverá definir ignoreDelete como true.

shardingKey

A chave usada para particionar dados entre os nós da tabela local.

String

Não

N/D

Quando writeMode é definido como 'partition', o parâmetro shardingKey é obrigatório. Ele pode conter vários campos separados por vírgulas (,).

exactlyOnce

Especifica se a semântica exactly-once deve ser ativada.

Boolean

Não

false

Valores válidos:

  • true: Ativa a semântica exactly-once.

  • false (padrão): Desativa a semântica exactly-once.

Nota
  • A semântica exactly-once é suportada apenas para gravação no ClickHouse no EMR. Defina este parâmetro como true apenas se o seu sink for um cluster do ClickHouse no EMR.

  • A semântica exactly-once não é suportada para gravação em tabelas locais do ClickHouse com a estratégia partition. Portanto, se exactlyOnce for definido como true, writeMode não poderá ser definido como partition.

Mapeamento de tipos de dados

Tipo Flink

Tipo ClickHouse

BOOLEAN

UInt8 / Boolean

Nota

O ClickHouse v21.12 e versões posteriores suportam o tipo Boolean. Para versões anteriores, o tipo BOOLEAN do Flink é mapeado para o tipo UInt8 do 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

Nota

O conector do ClickHouse não suporta os tipos TIME, MAP, MULTISET e ROW do Flink.

Para usar o tipo de dado Nested do ClickHouse, você deve mapeá-lo para um tipo ARRAY no Flink. Por exemplo:

-- ClickHouse
CREATE TABLE visits (
  StartDate Date,
  Goals Nested
  (
    ID UInt32,
    OrderID String
  )
  ...
);

Mapeie os tipos da seguinte forma:

-- Flink
CREATE TABLE visits (
  StartDate DATE,
  `Goals.ID` ARRAY<LONG>,
  `Goals.OrderID` ARRAY<STRING>
);
Nota

Em versões do VVR anteriores à 6.0.6, a gravação de dados DateTime64 com o driver JDBC oficial do ClickHouse causava perda de precisão ao truncar valores para segundos. Como resultado, apenas dados TIMESTAMP com precisão de nível de segundo, como TIMESTAMP(0), podiam ser gravados com sucesso. O VVR 6.0.6 e versões posteriores resolvem esse problema, permitindo gravações precisas de dados DateTime64.

Exemplos

  • Exemplo 1: Grave em uma tabela de nó único.

    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;
  • Exemplo 2: Grave em uma tabela distribuída.

    Suponha que uma tabela distribuída chamada distributed_table_test seja criada a partir de três tabelas locais chamadas local_table_test, localizadas nos nós 192.XX.XX.1, 192.XX.XX.2 e 192.XX.XX.3.

    • Se você quiser que o Flink grave dados diretamente nas tabelas locais e particione os dados por uma chave, use a seguinte DDL:

      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;
    • Se você quiser que o Flink descubra automaticamente os nós da tabela local em vez de especificá-los manualmente na URL, use a seguinte DDL:

      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', -- The JDBC URL of a node in the cluster.
        'userName' = '<yourUsername>',
        'password' = '<yourPassword>',
        'tableName' = 'distributed_table_test', -- The name of the distributed table.
        'shardWrite' = 'true',
        'inferLocalTable' = 'true', -- Set inferLocalTable to true.
        'writeMode' = 'partition',
        'shardingKey' = 'name'
      );
      
      INSERT INTO clickhouse_output
      SELECT
        id,
        name,
        age,
        rate
      FROM clickhouse_source;

Perguntas frequentes