工作中我们遇到了把Hive数据同步到Clickhouse的业务需求,一开始我们写Spark任务,用SparkSQL读Hive,再用JDBC写入到Clickhouse。
后来,随着要同步的表越来越多,每次都写Spark任务,成本就显得有些高了。于是,写了一个通用的Spark任务,指定Hive表、字段,指定Clickhouse表、字段,每次指定不同的参数。
再后来,业务越来越复杂,不仅是简单的同步,而是要支持更复杂的SQL,结果进行数据类型转换、值转化等,然后再插入Clickhouse。
这不是ETL要干的事儿吗?!
当然,继续增强之前的Spark,完全可以实现这个功能。但是说到ETL,不是有专业强大的Logstash吗,为什么要重复造轮子?
经过一番调研,还真有人写了Logstash插件,用来导出数据到Clickhouse: logstash-output-clickhouse
输出端搞定了,输入端怎么搞呢?很建达,用JDBC插件就可以了。
如上,配置jdbc连接信息即可。
需要说明的是,相关的jar包比较多,需要给全了,否则会有各种ClassNotFoundException。完整的jar列表为:
这些jar最好与hive环境版本一致,我们用的是CDH版,所以都是从CDH目录下找到的jar。
Clickhouse插件使用说明参考: https://github.com/mikechris/logstash-output-clickhouse
主要说下安装过程。
说明文档里说的 bin/logstash-plugin install logstash-output-clickhouse 方式,没有安装成功,所以只能自己编译安装。
先clone源码,然后进入源码根路径:
编译:
此时,若没有安装ruby环境,按照提示安装一下,再编译。
编译成功后,会多出一个文件
安装:
logstash的安装就不多说了,按照logstash官方文档安装就可以了。
此时,如果logstash版本是5.x,可能会遇到一个错误:
按照提示,修改gemfile:
修改logstash-mixin-http_client的版本:
原来是>6且<7,改成>5且<6。
然后,再次编译、安装,就可以了。
按照文档中的使用说明,配置Clickhouse连接信息即可:
这部分工作可以放在filter里处理,各种filter插件就不说了,参考logstash官方文档吧。