基于waterdrop,从oracle直接拉取数据进仓Clickhouse

一、Clickhouse、hive、oracle性能简单对比测试

公司数据分析需求,从市级切换到以省级为单位分析医保数据,原来的oracle数仓完全扛不住了,IT也没解决办法,所以自己动手建了Clickhouse集群,通过两台与oracle数仓配置类似的机器,进行并行数据分析,不得不说Clickhouse真的可以吊打oracle。由于高可用Clickhouse基于zookeeper实现,至少3台机器,资源有限,只有两台,所以我突发奇想,丢弃zookeeper,只用Clickhouse,建立了非高可用Clickhouse集群。分布式数据通过mergetree引擎和disributed引擎实现。部署方案,有需要的伙伴可以留言找我要下。

简单测试了下ch和oracle的性能表现,语句1都是些指标加工+排序,不便贴上,数据量3000W+,表现情况如下:

oracle

hive

clickhouse

8分08秒

1分34秒

0.2s

语句2,是两个2亿左右的大表执行join操作,之后group by,count,相当大的运算量,hive没执行成功,一直没动静,表现如下:

oracle

hive

clickhouse

20分钟52秒

38s

谁说ch不适合做join操作的,明明很强;oracle作为关系型数据库扛把子,还真是稳,慢是慢,起码能成功。

二、数据导入

之前的拉取策略一直是分两阶段:oracle->hive->Clickhouse,一阶段用sqoop,二阶段用waterdrop,两个同步工具的原理很相似,都是通过spark来做ETL;sqoop拉取到hive速度比较慢,waterdrop从hive到ch很快,这跟两套平台在同物理机上有很大关系,数据在机器内移动,没有http网络开销,2亿数据从hive到ch只需要10分钟左右;后来,这种方案遇到了另一个问题,机器存储空间不足了,hive的压缩比不高,而ch的lz4算法压缩比大概为8倍左右,被逼丢弃一阶段入库hive操作,直接从oracle拉取到ch集群,网上还没相关教程,只能自己研究。功夫不负有心人,用了1个小时就搞定了,方案就是通过waterdrop的JDBC拉取方式,调用oracle的jdbc驱动,实施拉取;

首先,需要下载驱动jar包,放到如下目录

cd seatunnel
mkdir -p plugins/my_plugins/lib
cp third-part.jar plugins/my_plugins/lib

这个需要自己去oracle官网下载,把里面的ojdbc8.jar,放到上面lib目录下,这样waterdrop就能自动发现驱动。

 接下来是waterdrop的配置文件,由于oracle中读取出来的列名默认全是大写,而ch中建表的时候用的是小写的,所以在filter中手动转换了一下。记得ch中的表需要提前建好,推荐用dbeaver建,用dbeaver同时连接oracle和ch,执行从oracle导表数据到ch,但不是真的导,直接用dbeaver少量数据可以(1000万以下),大量不建议,复制其ddl语句,用于ch建表。

spark {
  spark.app.name = "seatunnel"
  spark.sql.catalogImplementation = "hive"
  spark.executor.instances = 3
  spark.executor.cores = 2
  spark.executor.memory = "5g"
}

input {
jdbc {
    driver = "oracle.jdbc.driver.OracleDriver"
    url = "jdbc:oracle:thin:@//地址:端口/servicename"
    table = "***setl_doc_info_****"
    result_table_name = "spark_temp"
    user = "*****"
    password = "***"
}
}

filter {
  sql {
    sql = "select  phys_pk,bchno,***** from spark_temp"
  }
}

output {
  # choose stdout output plugin to output data to console
  clickhouse {
  host = "地址:端口"
  database = "xxxxx"
  table = "***setl_doc_info_****"
  username = "****"
  password = "******"
  }
}

 我用的是standalone的client模式提交给spark集群的:

./bin/start-waterdrop.sh --master spark://hadoop-master:7077 --deploy-mode client --config ./config/oracle_to_ch-batch.conf

可以看到,成功执行从oracle直接到ch的数据抽取,同样速度不快,因为oracle和ch集群是分开的,牵扯到http通讯,好处是空间够了,没有hive那一关,两台机器空间足够容纳20亿数据了。lz4能把800G数据压缩到100G,同时平均分布到两台机器,一台机器50G,这压力就小多了。

 有同样需求的数据分析小伙伴,不妨自己动手试试。我的ch集群是基于docker建的,用的最新版的ch,稳定运行,解决了快速分析大量数据的需求,给老毛子点个赞。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值