Apache kafka Clickhouse不通过复杂物化视图使用卡夫卡消息

Apache kafka Clickhouse不通过复杂物化视图使用卡夫卡消息,apache-kafka,materialized-views,clickhouse,Apache Kafka,Materialized Views,Clickhouse,TLDR摘要:单击House Kafka引擎,物化视图无法处理复杂的select语句。 较长版本: 我试图通过使用JSONEachRow的卡夫卡引擎向Clickhouse发送大量JSON数据点。但是物化视图不能正确地使用流。 我有一个用go编写的kafka生成器,它从多个tcp流中获取数据,并异步写入kafka队列 因此,数据流: TCP源->制作人->卡夫卡->点击房屋(卡夫卡引擎)->物化视图-> 目的表 到目前为止,所有这些都很有效 当我提高输入数据的速度(400000点/秒)时,我第一次

TLDR摘要:单击House Kafka引擎,物化视图无法处理复杂的select语句。

较长版本:

我试图通过使用JSONEachRow的卡夫卡引擎向Clickhouse发送大量JSON数据点。但是物化视图不能正确地使用流。 我有一个用go编写的kafka生成器,它从多个tcp流中获取数据,并异步写入kafka队列

因此,数据流:

TCP源->制作人->卡夫卡->点击房屋(卡夫卡引擎)->物化视图-> 目的表

到目前为止,所有这些都很有效

当我提高输入数据的速度(400000点/秒)时,我第一次遇到了瓶颈。我的制作人无法足够快地向卡夫卡写入数据,连接也堆积如山。所以我希望尝试批处理数据,但Clickhouse似乎无法将json数组作为输入()

因此,我想到了在数据点的源处对其进行批处理,并在物化视图中转换消息的想法,因此在此之前我有很多单独的消息:

{“t”:1547457441651445401,“i”:“device_2”,“c”:20001,“v”:56454654}

现在我有了一条消息,它是上述消息的倍数,并且经过了字符串化,在点之间有新行分隔符

{“实时”:“{”t\”:1547458266855015791,“i\”:“设备2\”,“c\”:20001,“v\”:56454654}\n{“t\”:1547458266855015791,“i\”:“设备2\”,“c\”:20001,“v\”:56454654}

这里的目的是在物化视图的select语句中使用visitParamExtract将字符串解析并转换为多个值

物化视图:

CREATE MATERIALIZED VIEW ltdb_mat_view TO default.ltdb AS SELECT 
    visitParamExtractInt(x, 't') AS timestamp, 
    visitParamExtractString(x, 'i') AS device_id, 
    visitParamExtractInt(x, 'v') AS value FROM  (
    SELECT arrayJoin(*) AS x
    FROM 
    (
        SELECT splitByChar('\n', realtimes)
        FROM kafka_stream_realtimes 
    )  )
它似乎在做些什么,因为当它运行kafka_stream_realtimes时,它被清除了,我无法手动查询它,得到一个错误“DB::Exception:Failed to claim consumer:”

摘要:

CREATE MATERIALIZED VIEW ltdb_mat_view TO default.ltdb AS SELECT 
    visitParamExtractInt(x, 't') AS timestamp, 
    visitParamExtractString(x, 'i') AS device_id, 
    visitParamExtractInt(x, 'v') AS value FROM  (
    SELECT arrayJoin(*) AS x
    FROM 
    (
        SELECT splitByChar('\n', realtimes)
        FROM kafka_stream_realtimes 
    )  )
  • 数据到达clickhouse,它就消失了,而且似乎永远不会消失 到达最后一桌
  • 如果我删除物化视图,我可以看到数据在 卡夫卡流实时
  • 如果我将物化视图查询作为INSERT INTO语句运行 然后是select,它将把数据从流传送到 最后一张桌子
  • 我意识到我可能只是把瓶颈推到了clickhouse 这可能永远不会奏效,但我想把这件事坚持到底 完整性
完整性: 卡夫卡的真实时间:

CREATE TABLE IF NOT EXISTS kafka_stream_realtimes(realtimes String)
  ENGINE = Kafka('kafka:9092', 'realtimes', 'groupTest', 'JSONEachRow');
ltdb:

但Clickhouse似乎无法将json数组作为输入

其动机似乎是在制作人端进行批量提交。为什么不将一堆JSON行分组并一次性提交?ClickHouse将接收这些多行消息并为您解析。您可能还需要向卡夫卡引擎提供
kafka_行分隔符
设置,因为大多数卡夫卡制作人不附加行d在每条消息的末尾添加elimiter

所以一条信息变成了

{ "t": 1547457441651445401,"i": "device_2","c": 20001,"v": 56454654}
{ "t": 1547457441651445402,"i": "device_2","c": 20001,"v": 56454654}
{ "t": 1547457441651445403,"i": "device_2","c": 20001,"v": 56454654}
...

是的,我正在将它们分组在一起。它应该如何格式化为点的json数组,或者只是带有分隔符的单个点?不,我的意思是将多行消息提交给Kafkatis似乎是可行的。我认为我对消息字符串进行编码使事情变得过于复杂&没有意识到kafka只会自己处理新行。谢谢。Whil它解决了我的用例我想问题仍然围绕着为什么我的问题中的物化视图将流消耗成一些空白,但我接受你的答案。