思路:
- 1.從presto 中找出查詢慢的sql(>10s) 大約1.4w條,放入mysql 中(具體問什麼會放入mysql 後面說該問題)
- 2.使用Jmeter 連接配接 presto 進行查詢 ,查詢sql從mysql中随機擷取 ;
遇到的問題:
- 将sql放入csv檔案,presto 的查詢sql從csv檔案中擷取,發現Jmeter自帶的${__CSVRead(,)} 是按行讀取的 ,因為查詢sql有換行,我就把csv檔案中的每條sql 拉成了1行,結果又發現sql 中有注釋符("--") ,這樣又會有問題 注釋符導緻sql抛錯,解決方案:就放入mysql 當中了 (當然放入excel中也是可以的,這樣的話就的使用python/java 寫讀取excel方法了 然後打包再放入Jmeter 的lib 比較麻煩 我就懶得寫了 );
- Jmeter 擷取到 從mysql 中的sql 後 傳回的是"[{query_sql=select ...}]" 這種結果,而且sql 中有 雙引号(")和 換行符号(\n)在Jmeter 的BeanShell 中都會抛錯 ,然後我就通過sql 将這些字元給進行了處理 (因為在Jmeter 中無法直接通過beanshell 處理sql中的換行符和雙引号,就選擇直接處理原始SQL了 );
- 同樣的sql 通過 DBeaver 連接配接 presto 是可以查詢成功的,但在 Jmeter 中的 JDBC Request 元件中查詢提示 : "Error executing query " ,後來通過百度 得知是 presto-jdbc jar 包的版本不比對導緻的 ;
- presto 查詢時部分sql 傳回結果集比較大 導緻 jmeter 記憶體溢出,為了解決這個問題,使用dml 語句批量在末尾添加 limit 10,如果在csv 、excel 檔案中這種批量操作就不好進行 ;
将csv檔案寫入mysql:
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 中的換行符和雙引号處理掉:
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 select 壓力測試 :
1.添加Jmeter JDBC Connection Configuration 元件;
>a.下載下傳驅動: (https://prestodb.github.io/docs/current/installation/jdbc.html) 注意:要和 presto 的版本對應 ;我的版本是338 我用的是(presto-jdbc-338.jar)
>b.連接配接參數 和 可選參數 , 檢視截圖 ;