公司数据分析需求,从市级切换到以省级为单位分析医保数据,原来的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,稳定运行,解决了快速分析大量数据的需求,给老毛子点个赞。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)