天天看點

jmeter presto 查詢壓測

思路:

  • 1.從presto 中找出查詢慢的sql(>10s) 大約1.4w條,放入mysql 中(具體問什麼會放入mysql 後面說該問題)
  • 2.使用Jmeter 連接配接 presto 進行查詢 ,查詢sql從mysql中随機擷取 ;

遇到的問題:

  1. 将sql放入csv檔案,presto 的查詢sql從csv檔案中擷取,發現Jmeter自帶的${__CSVRead(,)} 是按行讀取的 ,因為查詢sql有換行,我就把csv檔案中的每條sql 拉成了1行,結果又發現sql 中有注釋符("--") ,這樣又會有問題 注釋符導緻sql抛錯,解決方案:就放入mysql 當中了 (當然放入excel中也是可以的,這樣的話就的使用python/java 寫讀取excel方法了 然後打包再放入Jmeter 的lib 比較麻煩 我就懶得寫了 );
  2. Jmeter 擷取到 從mysql 中的sql 後 傳回的是"[{query_sql=select ...}]" 這種結果,而且sql 中有 雙引号(")和 換行符号(\n)在Jmeter 的BeanShell 中都會抛錯 ,然後我就通過sql 将這些字元給進行了處理 (因為在Jmeter 中無法直接通過beanshell 處理sql中的換行符和雙引号,就選擇直接處理原始SQL了 );
  3. 同樣的sql 通過 DBeaver 連接配接 presto 是可以查詢成功的,但在 Jmeter 中的 JDBC Request 元件中查詢提示 : "Error executing query " ,後來通過百度 得知是 presto-jdbc jar 包的版本不比對導緻的 ;
  4. presto 查詢時部分sql 傳回結果集比較大 導緻 jmeter 記憶體溢出,為了解決這個問題,使用dml 語句批量在末尾添加 limit 10,如果在csv 、excel 檔案中這種批量操作就不好進行 ;

将csv檔案寫入mysql:

jmeter presto 查詢壓測
jmeter presto 查詢壓測
1 import com.opencsv.CSVReader;
 2 import java.io.FileInputStream;
 3 import java.io.InputStreamReader;
 4 import java.nio.charset.StandardCharsets;
 5 import java.sql.*;
 6 public class prestoRl {
 7     static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
 8     static final String DB_URL = "jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai";
 9     static final String USER = "root";
10     static final String PASS = "123";
11     public static void main(String[] args) {
12         Connection conn = null;
13         Statement stmt = null;
14         try{
15             Class.forName(JDBC_DRIVER);
16             conn = DriverManager.getConnection(DB_URL,USER,PASS);
17             conn.setAutoCommit(false);
18              stmt = conn.createStatement();
19             String str = "INSERT t_prestoRl VALUES (?,?,?,?,?,?,?)";
20             PreparedStatement ps = null;
21             ps = conn.prepareStatement(str);
22 
23             FileInputStream fis = new FileInputStream("D:/linbo.yang/bigData/prestoLR/aa/20210924.csv");
24             InputStreamReader isr = new InputStreamReader(fis,StandardCharsets.UTF_8);
25             CSVReader reader = new CSVReader(isr);
26             String[] nextLine;
27             int i =0 ;
28             int index=0 ;
29             while ((nextLine = reader.readNext()) != null) {
30 
31                 i++ ;
32                 index++;
33                 String query_user=nextLine[0] ;
34                 String start_time=nextLine[1] ;
35                 String query_sql=nextLine[2] ;
36                 String  elapsed_time_s=nextLine[3] ;
37 //                System.out.println(query_user+'|'+start_time+'|'+query_sql+'|'+elapsed_time_s);
38                 ps.setString(1,String.valueOf(index));
39                 ps.setString(2,query_user);
40                 ps.setString(3,start_time);
41                 ps.setString(4,query_sql);
42                 ps.setString(5,elapsed_time_s);
43                 ps.setString(6,null);
44                 ps.setString(7,null);
45                 ps.addBatch();
46                 if (i == 1000) {
47                     i=0;
48                     ps.executeBatch();
49                     conn.commit();
50                 }
51             }
52             conn.commit();
53             stmt.close();
54             ps.close();
55             conn.close();
56         }catch(SQLException se){
57             se.printStackTrace();
58         }catch(Exception e){
59             e.printStackTrace();
60         }finally{
61             try{
62                 if(stmt!=null) stmt.close();
63             }catch(SQLException se2){
64             }
65             try{
66                 if(conn!=null) conn.close();
67             }catch(SQLException se){
68                 se.printStackTrace();
69             }
70         }
71         
72     }
73 
74 }      

View Code

将 SQL 中的換行符和雙引号處理掉:

jmeter presto 查詢壓測
jmeter presto 查詢壓測

1 UPDATE t_prestoRl
2 SET query_sql=REPLACE(query_sql,'\n','\\n ')
3  WHERE instr(query_sql,'\n')>0
4 
5 
6  UPDATE t_prestoRl
7 SET query_sql=REPLACE(query_sql,'"','\\" ')
8  WHERE instr(query_sql,'"')>0      

jmeter presto 查詢壓測
jmeter presto 查詢壓測
jmeter presto 查詢壓測

通過jmeter 測試presto select 壓力測試 :

  1.添加Jmeter JDBC Connection Configuration 元件;

    >a.下載下傳驅動: (https://prestodb.github.io/docs/current/installation/jdbc.html) 注意:要和 presto 的版本對應 ;我的版本是338  我用的是(presto-jdbc-338.jar)

    >b.連接配接參數 和 可選參數 , 檢視截圖 ;

jmeter presto 查詢壓測
jmeter presto 查詢壓測