【问题标题】:Can't get data from Kafka to distributed table无法从 Kafka 获取数据到分布式表
【发布时间】:2019-07-17 15:08:26
【问题描述】:
我需要从 Kafka 队列(用我的脚本填充它)获取数据到 ClickHouse (CH) 集群中的每个副本。
我已经创建了:
- 每个副本上的“队列”表(Kafka 引擎);
- 每个副本上的“消费者”物化视图(从“队列”获取数据到分布式表);
- 'data'分布式表;
当我将数据放入 Kafka 时,我很确定表接受数据(简单的 select count(*) from data),但我总是得到这个:
“进度:1.55 万行,1.24 MB(297.46 行/秒,237.18 KB/秒。)
从服务器收到异常(版本 18.14.17):代码:159。
DB::Exception:从主机:端口接收。 DB::Exception: 申请失败
消费者: 。集合中的 0 行。经过:5.313 秒。已处理 1.55
千行,1.24 MB(291.94 行/秒,232.78 KB/秒)"
当我停止填写 Kafka 时,我有一个很短的时间窗口可以完成我的查询。但几秒钟后,我收到 - 我创建的每个表的计数为 0。
【问题讨论】:
标签:
java
apache-kafka
clickhouse
【解决方案1】:
问题就在我这边:物化视图“消费者”中的列无效。
顺便说一句,如果有人需要做同样的任务,这里的数据地图:
- 在集群中的所有主机上创建“本地”表;
- 在集群中的所有主机上创建分布式表;
- 在一台主机上创建 Kafka 引擎表“队列”+物化视图“消费者”
【解决方案2】:
虽然 Keyzj 共享的方法有效并且在您想要使用分布式表来控制分片时很有用,但还有另一种方法可以提高吞吐量和可靠性。
您可以在集群中的所有机器上创建 Kafka 表,并为每个主机上的本地表提供单独的物化视图。只要在 Kafka 表定义中使用相同的消费者组名称,Kafka 内部将确保每个主机都从唯一的分区消费。您必须确保 Kafka 分区的数量是主机数量的 2-3 倍。例如,如果您的集群中有 4 台主机,则每台主机的设置方式如下:
- num_consumers = 1 的 Kafka 表
- 本地合并树表
- 从 Kafka 表提供本地表的物化视图
如果这种方法无法为您提供所需的吞吐量,您可以在同一主机上引入额外的 Kafka 表和物化视图。关键是始终使用相同的消费者组名称。