共计 1500 个字符,预计需要花费 4 分钟才能阅读完成。
摘要 :应用 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 级数仓黑科技,后盾还可获取泛滥学习材料~
点击关注,第一工夫理解华为云陈腐技术~