摘要:应用copymanager接口,读取二进制文件流,将二进制文件中的数据导入到数据库中。

本文分享自华为云社区《从二进制文件导入到GaussDB(DWS)》,作者:你怎么这么难看。

1.1 现网业务场景

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

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

1.2 测试计划

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

1.3 测试过程

从上图能够看出,一批数据的耗时由三局部组成:

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

1)解析二进制文件

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

2)积攒数据

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

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

3)调用copymanager接口

在Java中援用GaussDB(DWS)安装包中的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级数仓黑科技,后盾还可获取泛滥学习材料~

点击关注,第一工夫理解华为云陈腐技术~