从二进制文件导入到GaussDB(DWS)

举报
你怎么这么好看 发表于 2021/05/27 13:57:28 2021/05/27
【摘要】 使用copymanager接口,读取二进制文件流,将二进制文件中的数据导入到数据库中

1.1   现网业务场景

源数据推送二进制流-->解析二进制-->解析后的数据导入数据库

为了模拟生产的业务场景,客户提供了一个二进制文件及二进制文件的解析程序,需要我们解析二进制文件后导入数据库。

1.2   测试方案

由于客户给出的解析程序是单条解析,为了提升数据导入的性能,需要微批导入的方式,在内存中积攒一定量的数据后,再调用copymanager接口导入数据库中。最终测试方案的整体流程如下所示:


1.3   测试过程

从上图可以看出,一批数据的耗时由三部分组成:

  • 解析二进制文件
  • 积攒一批数据
  • 数据导入数据库

1)解析二进制文件

这是客户提供的Java程序,按行读取二进制文件中的数据,每行解析成一个String对象。

2)积攒数据

积攒的数据最终是要通过copymanager接口导入数据库中的,因此其对象类型需要是copymanager接口可以调用的。从下图中可以看出,其对象类型为InputSream


初步采用的解决方案是将解析后的String对象拼接起来,然后在copymanager接口中将String转为InputStream。在测试过程中发现,由于String类型在处理这种大对象的时候效率较低随着积攒数据的增多,这部分耗时越来越久,因此,最终方案是将解析后的数据存放到StringBuffer对象中。

3)调用copymanager接口

Java中引用GaussDBDWS)安装包中的JDBC驱动后,需要import CopyManager及BaseConnection

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

在创建copymanager对象的时候,需要将Connection对象转为BaseConnection,如下所示:

CopyManager copyManager = new CopyManager((BaseConnection)conn); 


1.4   测试结果

在单连接的情况下,解析+入库可处理10.1W/S,导入性能可达到64.5W/S

255并发情况下,解析+入库可处理1252.1 W/S,导入性能可达到4132.4W/S

1.5   总结

  • 在本地执行测试代码

在本地用idle调试中需要一个二进制文件,可以从客户给出的文件中执行head –n 1000 ***.dat>1.dat 截取一部分文件内容放在本地。

  • 各个时间收集

为了更好的给客户展现我们数据库的强大性能,需要把数据库导入的时间单独列出来,给客户一个更加直观的感受。

  • 高并发的设计

首先,将并发程序布置在集群外的服务器上, 然后为了避免单盘IO性能瓶颈,在每块盘上存放一份数据文件及解析程序。由于是把一批数据积攒到内存中的,因此在启动并发时需要注意内存的使用情况。

在客户端服务器并发75、内存已经饱和的情况下,查看集群的cpu及内存使用率仍然不高,因此,在集群内部的所有节点上每个增加30并发,达到最大并发数。

注意事项:

  • JDBC连接时,把所有并发平均分配到各个CN节点上;
  • 集群内部节点JDBC连接时可能会报gss错误,需要修改conf配置文件,将本地ip的连接方式由gss改为sha256。

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。