如何在一个kafka主题中使用所有有效数据

时间:2019-12-25 06:43:10

标签: apache-kafka clickhouse

在我们的项目中,我们希望特定主题中存在的所有数据都可以被Kafka引擎使用,但是我们尝试了两种方法,但是它们都不起作用。

  1. 在创建如下所示的kafka引擎表时,尝试输入关键字[auto_offset_reset]。创建表时没有错误返回,但是通过这种方式只消耗了主题中的增量数据。
CREATE TABLE xx.yyy (
`shop_id` String,
 `last_updated_at` String
) ENGINE = Kafka('XXX', 'shop_price_center.t_sku_shop_price', 'xxx', 'JSONEachRow', '', '', 1, 0, 0, 20000, 
auto_offset_reset='earliest')
  1. 更改xml文件中的配置,仍然无效
<kafka>
  <debug>cgrp</debug>
  <auto_offset_reset>earliest</auto_offset_reset>
</kafka>

任何一位大师都可以向我展示一个完整的示例来说明解决方案吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

数据只能从Kafka读取一次(每次读取后,消费者的偏移量将向前移动,因此,不可能重复读取相同的数据),因此需要使用实例化视图来监听Kafka主题并将数据放到普通的-表格:

/* ordinary table */
CREATE TABLE xx.yyy (
  shop_id String,
  last_updated_at String
)
ENGINE = MergeTree()
PARTITION BY tuple() /* just demo settings */
ORDER BY (last_updated_at, shop_id); /* just demo settings */

/* Kafka 'queue' */
CREATE TABLE xx.yyy_queue (
  shop_id String,
  last_updated_at String
)
ENGINE = Kafka SETTINGS
  kafka_broker_list = '..',
  kafka_topic_list = 'topic',
  kafka_group_name = '..',
  kafka_format = 'JSONEachRow',
  kafka_row_delimiter = '\n',
  kafka_skip_broken_messages = 1,
  kafka_num_consumers = 1,
  kafka_max_block_size = 1000;

/* materialized view: it transfers data from topic to sql-table */
CREATE MATERIALIZED VIEW xx.yyy_consumer TO xx.yyy AS 
SELECT
 shop_id,
 last_updated_at 
FROM xx.yyy_queue;

Kafka特定的设置(例如 auto_offset_reset )应在 /etc/clickhouse-server/config.d 目录中的xml文件中定义,而不是在表定义中:

<?xml version="1.0"?>
<yandex>
    <kafka>
        <auto_offset_reset>earliest</auto_offset_reset>
    </kafka>
</yandex>

仅从 xx.yyy -普通表中选择数据,而不从 xx.yyy_queue 中选择数据:

SELECT *
FROM xx.yyy;