教你如何将二进制文件导入到数据库
摘要:使用 copymanager 接口,读取二进制文件流,将二进制文件中的数据导入到数据库中。
本文分享自华为云社区《从二进制文件导入到GaussDB(DWS)》,作者:你怎么这么好看。
1、现网业务场景
源数据推送二进制流-->解析二进制-->解析后的数据导入数据库
为了模拟生产的业务场景,客户提供了一个二进制文件及二进制文件的解析程序,需要我们解析二进制文件后导入数据库。
2、测试方案
由于客户给出的解析程序是单条解析,为了提升数据导入的性能,需要微批导入的方式,在内存中积攒一定量的数据后,再调用 copymanager 接口导入数据库中。最终测试方案的整体流程如下所示:
![](https://static001.geekbang.org/infoq/bb/bb4a7c98b47a5bb9c56f08ff18fe014f.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
3、测试过程
从上图可以看出,一批数据的耗时由三部分组成:
解析二进制文件
积攒一批数据
数据导入数据库
1)解析二进制文件
这是客户提供的 Java 程序,按行读取二进制文件中的数据,每行解析成一个 String 对象。
2)积攒数据
积攒的数据最终是要通过 copymanager 接口导入数据库中的,因此其对象类型需要是 copymanager 接口可以调用的。从下图中可以看出,其对象类型为 InputSream。
![](https://static001.geekbang.org/infoq/2a/2af2d6d6f76071c16a2a154aca811448.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
初步采用的解决方案是将解析后的 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 = newCopyManager((BaseConnection)conn);
4、测试结果
在单连接的情况下,解析+入库可处理 10.1W/S,导入性能可达到 64.5W/S;
在 255 并发情况下,解析+入库可处理 1252.1 W/S,导入性能可达到 4132.4W/S。
5、总结
在本地执行测试代码
在本地用 idle 调试中需要一个二进制文件,可以从客户给出的文件中执行 head –n1000 ***.dat>1.dat 截取一部分文件内容放在本地。
各个时间收集
为了更好的给客户展现我们数据库的强大性能,需要把数据库导入的时间单独列出来,给客户一个更加直观的感受。
高并发的设计
首先,将并发程序布置在集群外的服务器上, 然后为了避免单盘 IO 性能瓶颈,在每块盘上存放一份数据文件及解析程序。由于是把一批数据积攒到内存中的,因此在启动并发时需要注意内存的使用情况。
在客户端服务器并发 75、内存已经饱和的情况下,查看集群的 cpu 及内存使用率仍然不高,因此,在集群内部的所有节点上每个增加 30 并发,达到最大并发数。
注意事项:
JDBC 连接时,把所有并发平均分配到各个 CN 节点上;
集群内部节点 JDBC 连接时可能会报 gss 错误,需要修改 conf 配置文件,将本地 ip 的连接方式由 gss 改为 sha256。
想了解 GuassDB(DWS)更多信息,欢迎微信搜索“GaussDBDWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技,后台还可获取众多学习资料~
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/e8a49f0952608ede2e66db93f】。文章转载请联系作者。
评论