无法从 Kafka 获取数据以进行分布式 table
Can't get data from Kafka to distributed table
我需要从 Kafka 队列(用我的脚本填充它)获取数据到 ClickHouse (CH) 集群中的每个副本。
我创建了:
- 'queue' table (Kafka 引擎)在每个副本上;
- 'consumer' 每个副本上的实体化视图(从 'queue' 获取数据到分布式 table);
- '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'。
顺便说一句,如果有人需要在此处执行相同的任务,请查看数据图:
- 在群集中的所有主机上创建 'local' table;
- 在集群中的所有主机上创建分布式 table;
- 在一台主机上创建 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 和物化视图。关键是始终使用相同的消费者组名称。
我需要从 Kafka 队列(用我的脚本填充它)获取数据到 ClickHouse (CH) 集群中的每个副本。
我创建了:
- 'queue' table (Kafka 引擎)在每个副本上;
- 'consumer' 每个副本上的实体化视图(从 'queue' 获取数据到分布式 table);
- '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'。 顺便说一句,如果有人需要在此处执行相同的任务,请查看数据图:
- 在群集中的所有主机上创建 'local' table;
- 在集群中的所有主机上创建分布式 table;
- 在一台主机上创建 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 和物化视图。关键是始终使用相同的消费者组名称。