开源Greenplum数据库insert写入性能测试

一、说在前面的话

      话说搞IT好久了,忙起来好久没写过文章了。这次终于在周末挤出点时间写一篇了。

      近些年,大数据技术在IT界里已经是必提的话题了,甚至朋友圈里经常看到一些先前同事、项目合作公司朋友们等发的大数据相关的各种分享。

      最近工作中也在做一款与数据相关的产品,不幸的是,真正遇到数据量大的时候,发现常用的MySQL等数据库真是顶不住。百度一下,当前流行的Greenplum数据库映入眼帘。网上一查,还开源,查查各大招聘网站和APP,招聘Greenplum要求的还不少。

       后来领导让调研下GP的性能,于是在公司用了四台虚拟机,开始搭建起来,记得当时GP的6.0版本还没发布,就搭建了一个5点几的版本,并用常规的JDBC等操作关系数据库的方式来使用GP,不料发现数据写入真是一个慢啊。网上百度发现不只是我一个人这么认为,试验了一些网上的方法也无济于事。没过几天,在github上搜索gpdb相关时,发现GP发布了6.0版本,同时也查到了GP的中文社区里的一篇文章,文章中说道GP6.0在OLTP上有很大提升,推掉5的环境,当天就将GP改为了6.0的,继续用JDBC来insert数据,发现还是很慢,起初怀疑自己的测试程序有问题,于是先后几次用GP自己的驱动包、kettle的API、datax工具等几种方式测试,仍然如此。无奈继续在网上搜索,好像阿里上有篇文章对GP的数据写入问题有过总结,印象比较深的是insert语句用批量values方式、用copy方式写入等吧。

      感觉没过去几天,在一个Greenplum的群里听说GP出新版本了,想着下周再试试。谁知等我再次准备升级环境测试时,github上最新的已经是6.2.1版本了。再次测试,感觉数据写入速度好像还不如6.0的。后来得到一位大侠指点,要提高OLTP的写入性能,需要调整GP的一些默认配置参数下,经尝试,果然不一样。

    接下来看看我的测试与调参过程吧。

二、我的测试过程

  测试的数据库包括Greenplum集群版本、Oracle单机版本、MySQL单机版本。

  1、系统环境:

操作系统:

CentOS Linux release 7.5.1804

内存大小:

7G

磁盘大小:

76G

CPU型号:

8核(Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz)

 2、Greenplum环境

     (1)软件版本

          greenplum-db-6.0.0-rhel7-x86_64.rpm

          greenplum-db-6.2.1-rhel7-x86_64.rpm

     (2)集群节点

节点

节点类型

备注

mdw

master

独用

smdw

standby

独用

sdw1

segment

独用

Sdw2

segment

独用

 2、Oracle环境

    (1)软件版本

         Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

    (2)单机环境

节点

节点类型

备注

orcl

单机

docker搭建

   3、MySQL环境

   (1)软件版本

          mysql-5.6.25

    (2)部署环境

节点

节点类型

备注

mysql

单机

开发共用(系统空闲时进行的测试)

4、数据库驱动

数据库

驱动包

备注

Greenplum

greenplum-jdbc-5.1.4.jar

官网下载

Oracle

ojdbc7-12.1.0.2.jar

官网下载

MySQL

mysql-connector-java-8.0.16.jar

pom里直接配置

5、测试过程

   测试目标:用JDBC方式测试单表单线程Insert写入100W数据的性能

   测试准备:在GP、Oracle、MySQL三种类型数据库中分别创建名为t_test_tang_1的表,表中包含两个字段:整型的ID和文本型的NAME。

greenplum

oracle

mysql;

create table "t_test_tang_1"

(

"ID" bigint,

"NAME" text

)distributed by("ID");

create table "t_test_tang_1"

(

"ID" NUMBER(22) not null primary key,

"NAME" VARCHAR2(2048)

)

create table `t_test_tang_1`

(

`ID` bigint not null primary key,

`NAME` text

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

  测试代码:

	public static void test(PropertiesConfig config)	throws Exception {
	       long begin = System.currentTimeMillis();
	        try {
	            Class.forName(config.driverClassName);  
	            try (Connection conn = DriverManager.getConnection(config.jdbcUrl, config.username, config.password);) {
	                String sql = "insert into \"t_test_tang_1\" (\"ID\",\"NAME\") values (?,?)"; 
	                if (config.jdbcUrl.indexOf("mysql") > 0) {
	                	sql = "insert into t_test_tang_1 (ID,NAME) values (?,?)"; 
	                }
	                try(PreparedStatement ps = conn.prepareStatement(sql);){  
	                    conn.setAutoCommit(false);  
	                    System.out.println("Opened database successfully");  

	                    long id = 1;
	                    String namePrefix = RandomStringUtils.randomAlphanumeric(1024);
	                    for(int i=0; i<1000; i++) {             
	                        for(int j=0; j<1000; j++) {
	                            ps.setLong(1, id);
	                            ps.setString(2, namePrefix);
	                            ps.addBatch();
	                            id++;
	                        }
	                        ps.executeBatch();
	                        conn.commit();
	                    }
	                } catch (Exception e) {  
	                    conn.rollback();
	                    System.err.println(e.getClass().getName() + ": " + e.getMessage());
	                }
	            }
	        } catch (Exception e) {
	            e.printStackTrace();
	        }

	        long end = System.currentTimeMillis();
	        System.out.println("total elipse = " + (end - begin)+" ms");
	}

  代码地址:https://gitee.com/inrgihc/GpdbTester/blob/master/src/main/java/com/weishao/jdbctester/TestInsert01Application.java

  三、测试结果

  用上述代码,基于三种数据库的配置进行相同代码过程测试,测试结果如下:

1、第一次测试:

     本次测试使用的GP为6.0版本,并使用默认配置参数

Greenplum(6.0版本)

Oracle11g

Mysql5.6

1282323 ms  (780条/秒)

92910 ms (10752条/秒)

519324 ms (1926条/秒)

2、第二次测试:

      本次测试使用的GP为6.2.1版本,分别为默认参数下测试和参数调整后测试,结果如下:

默认参数的数据库

测试次数

测试结果

Greenplum(6.2.1版本)

第一次

3206731 ms(312条/秒)

 

 

    GP调整的参数如下:

(1)全局死锁检测开关
在Greenplum 6中其默认关闭,需要打开它才可以支持并发更新/删除操作;
gpconfig -c gp_enable_global_deadlock_detector -v on

(2) 禁用GPORCA优化器(据说GPDB6默认的优化器为:GPORCA)
gpconfig -c optimizer -v off

(3)关闭日志
此GUC减少不必要的日志,避免日志输出对I/O性能的干扰。
gpconfig -c log_statement -v none

注意:参数配置修改后,我使用gpstop -u重新加了配置,并用gpconfig -s检查了各个参数确为修改成功。

参数调整后的数据库

测试次数

测试结果

Greenplum(6.2.1版本)

第一次

442371 ms(2262条/秒)

第二次

444364 ms(2252条/秒)

四、测试总结

     从测试结果中明显发现,经参数调优后的GP数据库Insert写入性能有很大程度提升,完成100W数据写入由每秒780条提升到2252条,写入速度已经与MySQL相媲美了。虽然与Oracle的差距还很远,毕竟GP与Oracle的侧重场景还是不同的嘛,如果GP采用copy或gpfdist方式灌数据,速度那才是惊人呢。

    据说,Greenplum7在OLTP上还会有大幅度提升,期待中!!!

五、几句尾话

    基于copy方式,本人编写了一个oracle/SqlServer/mysql/PostgreSQL表结构及数据向Greenplum数据库的离线同步小工具,希望给个star哦。多谢了!

   介绍详见:https://blog.csdn.net/inrgihc/article/details/103739629

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Greenplum数据库是一种高性能的分布式数据库系统,它基于开源的PostgreSQL数据库,专为大规模数据分析和处理而设计。Greenplum具备横向扩展能力,可以在多个节点上分布式存储和处理数据,以提供更好的性能和可扩展性。 Greenplum数据库的特点包括: 1. 并行处理:Greenplum可以将大数据集分成多个片段,然后在多个节点上同时处理和分析,从而提高处理速度。 2. 列存储:Greenplum使用列存储技术来优化查询性能。它将每个列存储在独立的文件中,可以更快地访问和查询特定的列数据。 3. 数据压缩:Greenplum可以对数据进行压缩,以减少存储空间,并提高查询性能。 4. 数据分片:Greenplum数据集分成多个片段,并在不同的节点上存储,以实现数据的并行处理。 5. 多维数据分析:Greenplum内置了许多用于多维数据分析的功能和工具,使得用户可以轻松地进行复杂的数据查询和分析操作。 Greenplum数据库适用于大规模数据分析和处理的场景,如数据仓库、商业智能、大数据分析等。它可以处理PB级别的数据,并且提供了强大的查询和分析能力。同时,Greenplum还提供了丰富的功能和工具,以帮助用户进行数据的导入、导出和转换,使得数据的处理变得更加简单和高效。 总之,Greenplum数据库是一种强大的分布式数据库系统,它通过并行处理、列存储等技术,提供了高性能和可扩展的数据分析和处理能力。如果您需要处理大规模数据集并进行复杂的数据分析操作,Greenplum数据库是一个值得考虑的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值