无法将数据从Kafka获取到分布式表

时间:2019-02-23 19:36:41

标签: java apache-kafka bigdata clickhouse

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

我创建了:

    每个副本上的
  1. 'queue'表(Kafka引擎);
  2. 每个副本上的
  3. “消费者”实例化视图(从“队列”到已分发表中获取数据);
  4. “数据”分发表;

当我将数据放入Kafka时,我很确定表可以接受数据(简单的select count(*) from data),但是我总是这样:

  

“进度:15.5万行,1.24 MB(297.46行/秒,237.18 KB /秒)   从服务器(版本18.14.17)接收到的异常:代码:159。   DB :: Exception:从host:port接收。 DB :: Exception:无法声明   消费者:。设置0行。耗时:5.313秒。已处理1.55   一千行,1.24 MB(291.94行/秒,232.78 KB /秒。)”

当我停止填充Kafka时,我会在很短的时间内完成查询。但是几秒钟后,我收到了-我创建的每个表都有0个计数。

2 个答案:

答案 0 :(得分:2)

尽管Keyzj共享的方法行之有效,并且在您要使用分布式表控制分片时非常有用,但是还有另一种方法可以提高吞吐量和可靠性。

您可以在群集中的所有计算机上创建Kafka表,并使用单独的实例化视图为每个主机上的本地表提供数据。只要在Kafka表定义中使用相同的使用者组名称,Kafka内部成员就可以确保每个主机都使用唯一的分区。您必须确保Kafka分区的数量是主机数量的2-3倍。例如,如果您的群集中有4个主机,则每个主机的设置如下:

  • 具有num_consumers = 1的卡夫卡表
  • 本地合并树表
  • 从Kafka表中获取本地表的材料化视图

如果这种方法不能满足您的需求,则可以在同一主机上引入其他Kafka表和实例化视图。关键是在整个过程中使用相同的使用者组名称。

答案 1 :(得分:1)

问题就在我这边:物化视图“消费者”中的无效列。 顺便说一句,如果有人需要执行相同的任务,请参见以下数据图:

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