前言
最近在使用waterdrop读取hive的数据,并写入clickhouse。但是hive是按照天来分区的,所以同步数据的时候需要动态的选择分区。但是waterdrop的配置文件是conf文件,没法动态赋值。特此记录一下这个解决办法。
解决办法
我们可以使用cat <<!EOF把变量传进去,并且把脚本生成在文件夹中,然后再使用waterdrop的命令调用即可。demo如下:
#!/bin/bash
# 日期及参数配置输入,默认当天无参数输入
if [ $# == 0 ];then
daydate=`date +%Y-%m-%d`
elif [ $# == 1 ];then
daydate=$1
else
echo "输入参数出错!"
exit 1
fi
echo "当日:$daydate"
# 打印数据传输脚本并赋值
cat>test.conf<<!EOF
spark {
spark.sql.catalogImplementation = "hive"
spark.app.name = "hive2clickhouse"
spark.executor.instances = 30
spark.executor.cores = 1
spark.executor.memory = "2g"
spark.yarn.queue = "spark_flink"
}
input {
hive {
pre_sql = "select * from test.test where dateline = '$daydate'"
table_name = "test"
}
}
filter {}
output {
clickhouse {
host = "xxx.xx.x.xxx:8123"
database = "test"
table = "test"
fields = [ "id","user_id"]
username = "default"
password = "m8yjvWQ+"
clickhouse.socket_timeout = 50000
retry_codes = [209, 210]
retry = 3
bulk_size = 100000
}
}
!EOF
/opt/waterdrop-1.5.1/bin/start-waterdrop.sh --master yarn --deploy-mode client --config ./test.conf
cat EOF
必须要说明的是EOF在这里没有特殊的含义,你可以使用FOE或OOO等(当然也不限制在三个字符或大写字符)。但是大多数都是使用大写、
cat 有常见以下三种使用方式:
- cat<<EOF,以EOF输入字符为标准输入结束
- cat>filename,创建文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束
- cat>filename<<EOF,以EOF作为输入结束,和ctrl+d的作用一样
注意:EOF必须顶行写,前面不能用制表符或者空格。