无法从 Kafka 获取数据以进行分布式 table

Can't get data from Kafka to distributed table

我需要从 Kafka 队列(用我的脚本填充它)获取数据到 ClickHouse (CH) 集群中的每个副本。

我创建了:

  1. 'queue' table (Kafka 引擎)在每个副本上;
  2. 'consumer' 每个副本上的实体化视图(从 'queue' 获取数据到分布式 table);
  3. 'data'分布table;

当我将数据放入 Kafka 时,我很确定 tables 接受数据(简单 select count(*) from data),但我总是得到这个:

"Progress: 1.55 thousand rows, 1.24 MB (297.46 rows/s., 237.18 KB/s.) Received exception from server (version 18.14.17): Code: 159. DB::Exception: Received from host:port. DB::Exception: Failed to claim consumer: . 0 rows in set. Elapsed: 5.313 sec. Processed 1.55 thousand rows, 1.24 MB (291.94 rows/s., 232.78 KB/s.)"

当我停止填充 Kafka 时,我有很短的时间 window 可以完成我的查询。但几秒钟后我收到 - 我创建的每个 table 计数为 0。

问题出在我这边:实体化视图中的列无效 'consumer'。 顺便说一句,如果有人需要在此处执行相同的任务,请查看数据图:

  1. 在群集中的所有主机上创建 'local' table;
  2. 在集群中的所有主机上创建分布式 table;
  3. 在一台主机上创建 Kafka 引擎 table 'queue' + 物化视图 'consumer'

虽然 Keyzj 共享的方法有效并且在您想要使用分布式 table 控制分片时很有用,但还有另一种方法可以提高吞吐量和可靠性。

您可以在集群中的所有机器上创建 Kafka tables,并在每个主机上使用单独的实体化视图提供本地 table。只要在 Kafka table 定义中使用相同的消费者组名称,Kafka 内部将确保每个主机都从唯一的分区消费。您必须确保 Kafka 分区的数量是主机数量的 2-3 倍。例如,如果您的集群中有 4 台主机,则每台主机将像这样设置:

  • Kafka table 和 num_consumers = 1
  • 本地合并树table
  • 从 Kafka table
  • 提供本地 table 的物化视图

如果此方法不能为您提供所需的吞吐量,您可以在同一主机上引入额外的 Kafka table 和物化视图。关键是始终使用相同的消费者组名称。