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方式寫入等。mysql

感受沒過去幾天,在Greenplum技術羣裏據說Greenplum又出新版本了,便想着下週再試試。誰知等我再次準備升級環境測試時,Github上最新的已是6.2.1版本了。再次測試,感受數據寫入速度好像還不如6.0的。因而去Greenplum技術羣組中求助,獲得一位大俠指點,要提升OLTP的寫入性能,須要調整Greenplum的一些默認配置參數,經嘗試,果真很不同。sql

接下來看看個人測試與調參過程吧。數據庫

1、測試過程

測試的數據庫包括Greenplum集羣版本、Oracle單機版本、MySQL單機版本。 併發

一、系統環境dom

二、Greenplum環境工具

  • 軟件版本

greenplum-db-6.0.0-rhel7-x86_64.rpm性能

greenplum-db-6.2.1-rhel7-x86_64.rpm測試

  • 集羣節點

三、Oracle環境大數據

  • 軟件版本

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

  • 單機環境

四、MySQL環境

  • 軟件版本

mysql-5.6.25

  • 部署環境

  • 數據庫驅動 

五、測試過程

  • 測試目標 

用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");
  }

2、測試結果

用上述代碼,基於三種數據庫的配置進行相同代碼過程測試,測試結果以下:

一、第一次測試:

本次測試使用的Greenplum爲6.0版本,並使用默認配置參數 

二、第二次測試:

本次測試使用的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檢查了各個參數確認爲修改爲功。

3、測試總結

從測試結果中明顯發現,經參數調優後的Greenplum數據庫Insert寫入性能有很大程度提高,完成100W數據寫入由每秒780條提高到2252條,寫入速度已經與MySQL相媲美了。雖然與Oracle的差距還很遠,畢竟Greenplum與Oracle的側重場景仍是不一樣的嘛,若是Greenplum採用copy或gpfdist方式灌數據,速度那纔是驚人呢。

聽說,Greenplum 7 在OLTP上還會有大幅度提高,很是期待!!!

得到更多關於Greenpum的技術乾貨,請訪問Greenplum中文社區網站


相關文章
相關標籤/搜索