Greenplum6 JDBC insert性能媲美MySQL

近些年,大数据技术在IT界里已经是必提的话题了,朋友圈里经常看到一些同事们、项目合作公司朋友们转发的大数据相关文章。最近工作中也在做一款与数据相关的产品,不幸的是,真正遇到数据量大的时候,发现常用的MySQL等数据库真是顶不住。百度一下,当前流行的Greenplum数据库映入眼帘。仔细一查,发现Greenplum还是个开源数据库,再去各大招聘网站和APP查看了一下,招聘Greenplum相关人才的还真不少。在一番调研后,经测试发现,参数调优后的Greenplum数据库Insert写入性能有很大程度提升,完成100W数据写入由每秒780条提升到2252条,写入速度已经与MySQL相媲美了。用这篇文章来记录一下我的测试与调参过程。

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

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

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

一、测试过程

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

1、系统环境

2、Greenplum环境

  • 软件版本

greenplum-db-6.0.0-rhel7-x86_64.rpm

greenplum-db-6.2.1-rhel7-x86_64.rpm

  • 集群节点

3、Oracle环境

  • 软件版本

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

  • 单机环境

4、MySQL环境

  • 软件版本

mysql-5.6.25

  • 部署环境
  • 数据库驱动 

5、测试过程

  • 测试目标 

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

  • 测试准备

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

  • 测试代码
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");
  }

二、测试结果

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

1、第一次测试:

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

2、第二次测试:

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

 Greenplum调整的参数如下:

(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数据库Insert写入性能有很大程度提升,完成100W数据写入由每秒780条提升到2252条,写入速度已经与MySQL相媲美了。虽然与Oracle的差距还很远,毕竟Greenplum与Oracle的侧重场景还是不同的嘛,如果Greenplum采用copy或gpfdist方式灌数据,速度那才是惊人呢。

据说,Greenplum 7 在OLTP上还会有大幅度提升,非常期待!!!

四、结束语

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

介绍详见:

https://blog.csdn.net/inrgihc/article/details/103739629

作者简介

汤一波,目前任职于锐捷网络,JAVA架构设计与开发工程师,当前工作主要从事:基于Greenplum数据库的数据产品建设,主要兴趣集中在异构数据转换、数据同步、数据处理等领域。


关注微信公众号

VMware 中国研发中心