背景
最近有个需求,就是需要把hive的数据导入到clickhouse,目前的做法是先用waterdrop把hive的数据导入clickhouse的本地表中,然后再清洗写入分布式表中。手动处理已经是完全可以的,但是想做成定时调度,但是我们这边的大数据集群和clickhouse是分开的,所以需要远程调用执行clickhouse的命令,下面就是我在写脚本的时候遇到的问题以及解决办法,特此记录一下。
步骤
waterdrop搭建以及导数据到clickhouse可以参考:https://blog.csdn.net/anyitian/article/details/115461346
下面就是我在写脚本是的心路历程,原谅我的linux水平菜。
想要远程执行命令,第一时间想到的就是使用ssh命令远程登录到clickhouse服务器上去执行,所以先让我们的运维同学帮我们开通了大数据集群到clickhouse集群的免密登录,当然只是我们需要用到的服务器。
我写的脚本主要分为以下几个步骤:
- 需要可以传日期,因为数据是同步hive日分区的数据
- 导入之前,需要先清空clickhouse本地表的数据,防止失败导致本地表的数据重复
- 使用waterdrop同步hive的数据到clickhouse
- 数据清洗,写入分布式表
- 清空本地表的数据
第一步很简单,脚本如下:
# 日期及参数配置输入,默认当天无参数输入
if [ $# == 0 ];then
daydate=`date +%Y-%m-%d`
elif [ $# == 1 ];then
daydate=$1
else
echo "输入参数出错!"
exit 1
fi
第二步因为sql语句简单,所以也没有什么问题,直接使用ssh远程命令调用即可
ssh root@xxx.xxx.x.xxx 'clickhouse-client -u default --password m8yjvWQ+ --query="truncate table test.bi_player2"'
因为ssh命令也遵循混合使用单双引号,所以只要和clickhouse命令里的引号错开即可。
第三步 同步数据直接使用waterdrop即可。
但是waterdrop的配置文件不能传参,解决办法参考waterdrop配置文件动态赋值
脚本如下:
cat>/opt/waterdrop-1.5.1/job/ods_bi_player2.conf<<!EOF
spark {
spark.sql.catalogImplementation = "hive"
spark.app.name = "hive2clickhosue_player2"
spark.executor.instances = 30
spark.executor.cores = 1
spark.executor.memory = "2g"
}
input {
hive {
pre_sql = "select user_id,level,country,vip,rmb_diamonds,all_diamonds,money,wood,forage,mineral,iron,feats,card_soul,corps_money,treasure_money,official,building,castle_lv,genius,m_power,guide_step,record_time,corps_uid,horseshoe_gold,bi_sid,gather_time,if(record_time is null,dateline,from_unixtime(record_time,'yyyy-MM-dd')) as date