0.
前面4篇文章咱们聊了clickhouse(以下称CK)的一些基础架构原理,以及本地表、副本表、分片表之间的关联关系。
今天这篇咱再来聊一下如何真正把CK给用起来,所谓真正用起来,就是往里写入业务数据。
按照以往的常规思路,本来想着用spark或者flink来消费kafka的数据,然后往CK里灌的,但是我突然发现官网里面在介绍表引擎中,有个所谓的Integrations引擎,里面有个可以跟kafka进行连接的建表方式。
其实所谓的Integrations引擎,就是对外部数据源建立映射关系,而自己就相当于外部数据源的一个客户端,其实这种玩法,现在好多数据库都支持,比如Hive、HBASE、Elasticsearch等等。

看到这,于是果断准备尝试一下,如果真如官网所说,可以通过在CK上创建kafka的映射表,来消费kafka的数据,那岂不是就省去了我数据导入的步骤了。
1.
但我们需要清楚一点的就是,很多时候官方文档宣称的各种牛逼功能,到底落地到现实中好不好用,是需要打个大大问号的。
既然如此,咱就来试一下,根据文档要求,我创建了这样的一张kafka引擎的表:

至于为啥只有一个字段呢,原因在于,一开始我想通过指定分隔符把业务字段给切出来,但是发现,一番折腾之后切不出来,各种解析不了(暂时懒得折腾了)。
那我就只能退而求其次,因为只是为了验证我们能从CK中直接消费kafka数据,于是把数据中的一行当成一个字段也不是不可以(偷个懒)。
这里面可以看到建表语句也很简单,其中的参数都是kafka常见的配置,只有最后一个参数指的消费kafka的线程数:

这个也比较好理解,它是用来对应消费当前kafka数据topic中的partition数量的,建议这个数字跟partition数量保持一致,给多的话,也会浪费,因为一个CPU核心最多只能分配到一个partition上面。
2.
那么这张表创建成功之后,当我准备用select * 查询的时候呢,给我报了个错:

说什么不允许你直接通过这种流的方式进行查询,如果非得这么干,就得在用户设置中加入一个运行流数据查询的标签。
于是,咱就需要在/eyc/clickhouse-server/user.xml,增加这样一行标签:

一定要注意这行标签的位置,需要放在
修改好之后,重启你的CK server服务,然后再执行查询这张表的语句,当你满心欢喜地以为可以查到数据时,它是这样的:

但是,当我以为可能是建表语句哪里有问题的时候,我再次把这个查询语句执行一遍确认时,它又能查出结果了:

然后我为了验证它真的能查出数据,我又执行第3遍发现,又查不出来了(WTF...):

可是我的kafka明明都是不停在进数据的啊,怎么就时而查的出来,时而又查不出来呢,后续我又试了几次,依然还是不行,但偶尔它又行(此处省略6个字脏话)。
3.
而且还发现一个现象:那就是建的这个kafka引擎表,在对应的数据目录中是没有相关文件夹的,也就是说,即便通过上面的select方式查询到数据了,但是并没有保存到CK中,这张kafka引擎表,更像是一张普通视图。
所以对于CK来说,这张kafka引擎的表,仅仅只能作为一个简单的consumer,关键它还老出问题。
但是,基于这个现象呢,官方文档其实给了解释:

说什么用select的方式,去读这个kafka引擎表的数据并不是一个好的方式,如果想用一种更实用的方式来实现,那么就需要创建物化视图。
于是,我根据官方文档的提升,做了如下操作:
先建一张普通本地表:

然后再基于这张本地表,创建一个刚才那个kafka引擎表的物化视图:

然后,随着这个语句的创建成功,数据就源源不断地从kafka写入到dns_log_real这张表中了。
其实你从名字中就可以看出来,这个dns_log_real才是真正保存kafka数据的,另外2个dns_logs01以及dns_view在CK中只是个空壳表,在数据盘中连目录都没有:

然后我在客户端查询的时候,就可以查询到确定的数据了:

可以看到,无论是通过物化视图的名字来查询,还是根据这张普通的本地表,都能查到一模一样的结果,因为对dns_view的查询,都会转给dns_log_real这张本地表。
既然已经创建了物化视图,那么我现在再查询那张当初创建的kafka引擎表,会怎么样呢?

报错说,这个表已经被创建了物化视图了,就别用这种方式来查询数据了,你应该直接去查你的物化视图才对。
4.
可以看得出来,虽然说CK提供了这种看似简便的外部数据源接入方式,但是要想真正实现起来,且满足业务要求,并没有想象中的那么简单。
从我的角度来看,这种通过创建物化视图来导入数据的方式,可能更适合那些偏爱纯SQL开发的同学,因为如果你用其他方式导入,比如spark或者flink,就要涉及到其他编程语言的编码,就需要另个一维度的技能了。
而对于这种情况,有的同学会很喜欢,而有的则会比较排斥。
如果是你,你更喜欢哪种呢...
