【问题标题】:Clickhouse Kafka topic join :Clickhouse Kafka 主题加入:
【发布时间】:2019-07-27 22:58:15
【问题描述】:

我有两个(或更多)Kafka 主题,我需要加入它们。 我在 blogs/StackOverflow 上读到的问题......两个选项:

1) 将它们(Clickhouse Kafka 引擎/火花流)流式传输到单独的表,然后运行在 Clickhouse 中不推荐的连接?

2) 用所有列建一张表,并使用 Clickhouse Engine/spark streaming 更新同一个入口?

任何建议

【问题讨论】:

    标签: apache-kafka clickhouse


    【解决方案1】:

    与往常一样,这实际上取决于您导入的数据类型以及您将如何使用它,但我会说,在大多数情况下,最好将 2 个主题导入到一个表中(所以选项 2)。从那里您将能够快速过滤和汇总记录。根据您要执行的查询,您应该使用适当的ORDER BY 列导入数据,这将使您的查询更快。

    如果您提供有关要加入的数据架构的更多详细信息,我可以更具体地提供答案。

    【讨论】:

    • 感谢重播:如果我有两个主题 A{x,y,z,ts} 和主题 B{w,x,v,ts} ,我创建了一个表:列 x, y,z,w,v,A_ts,B_ts CH 是否用 x 值更新同一记录?这意味着如果我们首先从主题 A 收到一条消息,然后在 5-10 分钟后从主题 B 收到一条在 x 字段具有相同值的消息,CH 是否会更新第一个插入?
    • @Arnon Rodman 在 CH 是不可能的。要合并来自不同主题的事件,需要使用一些基于 Kafka Streams 或 Spark 的预处理,然后将合并的事件传递给 CH。我建议询问 Kafka Stream/Spark 社区。​​span>
    • @vladimirG Thx 对于重播,我的想法/想法是手动创建“upsert/update”,这意味着从两个 Kafka 主题(火花或其他 CH Kafka 引擎)读取并创建 CH sink 但使用 SQL更新命令。我的 CH 表将有 x,y,z,w,v..
    • @ArnonRodman 您可以使用 ReplacingMergeTree 并在 ORDER BY 中指定 x。还有一个ver 参数,它允许您指定一个版本列,该列将用于保存具有最大版本的记录。请记住,不会立即删除重复项。如果您运行OPTIMIZE TABLE ... FINAL,则会删除重复项,但完成优化可能需要一些时间。
    【解决方案2】:

    在 ClickHouse 中从 Kafka 获取数据的标准方法是使用 Engine=Kafka 和 Materialized 视图创建“源”表,该表将使用 ReplicatedMergeTree 引擎将数据复制到最终表。

    您可以创建多个将写入同一个目标表的物化视图,就像那样。

    
    CREATE TABLE kafka_topic1 ( ... ) Engine=Kafka ...;
    
    CREATE TABLE kafka_topic2 ( ... ) Engine=Kafka ...;
    
    CREATE TABLE clickhouse_table ( ... ) Engine=MergeTree ...;
    
    CREATE MATERIALIZED VIEW kafka_topic1_reader
      TO clickhouse_table
      AS SELECT * FROM kafka_topic1;
    
    CREATE MATERIALIZED VIEW kafka_topic2_reader
      TO clickhouse_table
      AS SELECT * FROM kafka_topic2;
    

    【讨论】:

    • 感谢重播,最终表 clickhouse_table 是否将包含来自两个 Kafakn 引擎的数据?具有相同密钥的“raws”将被合并,或者我需要创建自己的手动作业来“加入/合并”?
    • 默认情况下,常规 MergeTree 只存储所有插入的原始数据,无论它是否有重复,也不管数据是如何插入的(通过物化视图或直接插入)。因此,您将拥有来自这两个主题的所有行(如果它们出现,则会出现重复)。重复数据删除是另一个(相当大的)主题。
    • 创建表 kafka_topic1 (x,y,z ... ) Engine=Kafka ...;创建表 kafka_topic2 ( x,w,f... ) Engine=Kafka ...; CREATE TABLE clickhouse_table (x,y,z,w Nullable(Int64),f ... ) Engine=MergeTree ...;创建实体化视图 kafka_topic1_reader TO clickhouse_table AS SELECT * FROM kafka_topic1; CREATE MATERIALIZED VIEW kafka_topic2_reader TO clickhouse_table AS SELECT * FROM kafka_topic2;
    • 当我创建第一个“CREATE MATERIALIZED VIEW kafka_topic1_reader”时,我在“w”字段中收到错误消息“预期列 w:同时推动查看 tmp1.clickhouse_table”。是否可以使用来自 kafka 主题的 cloumns 创建 clickhouse_table,并且每个不同的“MATERIALIZED VIEW”都将使用其主题 cloumns 创建原始数据
    • 这很奇怪(我的意思是将具有不同列的数据放在一个表中)。但可以肯定,你可以。
    猜你喜欢
    • 2020-12-08
    • 2019-10-11
    • 1970-01-01
    • 2018-08-19
    • 2019-04-23
    • 2020-05-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多