背景
如何在clickhouse中实现类似HIVE中外部表的功能,clickhouse-jdbc-bridge是一个比较实用的方式。网上的教程都是人云亦云,只看到问题的表象,而未间其底层原理。今天通过这篇文章,来记录下clickhouse-jdbc-bridge使用过程中踩过的坑。
架构
clickhouse-jdbc-bridge理念比较简单,独立启动一个jdbc-bridge的服务,以http协议对外提供服务,默认端口为:,相应的clickhouse配置下jdbc-bridge代理,指向此服务。然后就可以在clickhouse中,通过Jdbc引擎的方式,来访问外部资源,类似于Hive中外部表。clickhouse-jdbc-bridge局限性很大,其只是提供对远程数据源的查询功能,且数据量不能太大,而且本身性能较差。对于clickhouse数据库,性能无法于remote函数相比。这些暂且不论,我们先看下如何把其搭建起来,最后我们再结合业务场景,思考下我们正确的访问方式。
环境搭建
从官方下载相应的软件包然后解压:
drivers放的是相关的驱动jar,这里需要特别注意的是,有些驱动会有依赖jar,直接丢到同级目录下即可。比如:clickhouse的驱动,依赖就非常多,而mysql驱动无其它依赖。
然后执行如下明确启动clickhouse-jdbc-bridge服务。
java -jar clickhouse-jdbc-bridge-2.1.0-SNAPSHOT-shaded.jar
另外,不建议在bridge进行相关的数据库连接、用户名和密码配置,可以在clickhouse新建jdbc驱动表的时候进行指定。
结论
其实最终我们还是建议将数据存储在本地,在ClickHouse中尽量避免外部表的直接使用。如果你对实时性要求较高,CDC同步的方式,是你的一个非常好的选择。外部表的方式主要有如下几点,
a)JDBC
基于clickhouse-jdbc-bridge ,性能较差不建议使用,万不得已再使用。比如官方不支持的一些国产数据库。
b)MySQL、PostgreSQL表引擎
机制和jdbc方式是类似的,性能没有本质的区别,也是不建议在数据分析层面,直接关联这些引擎表的。一些简单的管理侧的查询,还是可以使用此引擎表的方式的。
c)remote函数
如果外部表是ClickHouse数据库中的表,那么建议可以通过remote函数来进行外部表访问。这块有两种方式,一种是根据remote函数进行动态的拼接查询SQL。第二种是事先建一个视图。
d)数据字典表
对于数据量不大且实时性要求不高的场景,我们可以采用数据字典的方式,进行周期的数据同步。数据字典表为本地表,完全可以在数据分析中进行直接使用。