客户业务数据库oracle 11g r2,同步至apache doris,java的应用连doris数据仓库展示报表。
用flinkcdc 同步,分成批和流的两种同步。
这次就说流的方式,flink slot有限于,改 flink-conf.yaml的
taskmanager.numberOfTaskSlots: 参数好像也受限于硬件配置,不能想要多少就改成多少。
我们把几个表分成一组,用
BEGIN STATEMENT SET;
END; 语句快把 insert select 包起来,这样几个表同步可以共享一个slot。
但实际效果还是不好,因为会反复jdbc方式连接oracle业务数据库,扫描。尤其cdc2.3.0连接多到业务库崩溃。
那怎么办呢?就开始研究dinky的CDCSOURCE 整库同步.
版本是0.7.2下下来搞到idea中,这样能调试好更快二开。
这个项目mysqlcdc能同步数据,但是oracle不能,如果表的字段都是字符就能。
那只能研究代码改代码了,拧过来 让ta能为止。
我改了很多点块,我就列下关键的几个
1报错 string 不能cast 数字,
找到OracleCDCBuilder,
sourceBuilder.deserializer(new JsonDebeziumDeserializationSchema(false,configa));
改成这样。
Map configa = new HashMap(); configa.put(JsonConverterConfig.DECIMAL_FORMAT_CONFIG, DecimalFormat.NUMERIC.name()); sourceBuilder.deserializer(new JsonDebeziumDeserializationSchema(false,configa));
这时又报 数字不能cast string错误
找到 SQLSinkBuilder
else if (logicalType instanceof DecimalType) {
return new BigDecimal((String) value);
改成
else if (logicalType instanceof DecimalType) {
return new BigDecimal(value +"");
然后就能同步数据到doris里面了。至于下游自动建表,甚至表字段变化,下游也跟着改,这个我真没弄懂,如果下游想要收到数据必须提前建好表。