Kettle Table Exists控制元件優化
一、背景
本文是kettle優化的系列文章中的其中一篇。最近在分析一些跑的比較慢的Job,發現一個很詭異的現象:同一個Table Exists控制元件,有的跑的很快、有的很慢,最慢的甚至30分鐘左右。經過進一步分析,瞭解到在判斷hive資料庫時,當表的資料量很大或檢視的查詢邏輯非常複雜,控制元件呼叫就會變得非常耗時。
初步想法是控制元件在執行時,可能是資料庫連線或查詢資料的TEST SQL有問題,導致對大量資料表的判斷沒有進行優化。為了驗證這一想法並進行徹底的優化,只能通過看原始碼實現方式。
二、準備工作
1、下載Kettle原始碼
從githup上下載kettle程式碼並checkout到和自己kettle版本對應的分支上:
git clone git@github.com:pentaho/pentaho-kettle.git
git checkout 6.1.0.1-R
2、下載big-data-plugin原始碼,big-data-plugin是kettle大資料相關的元件
git clone git@github.com:pentaho/big-data-plugin.git
git checkout 6.1.0.1-R
3、前兩步下載的專案匯入到Eclipse
三、程式碼分析
Table Exists控制元件的實現類是 pentaho-kettle專案中的JobEntryTableExists,執行時執行execute方法,該方法首先獲得Database物件、資料庫連線,然後呼叫Database的checkTableExists方法,該方法就是用來判斷資料庫中是否存在指定的表。
checkTableExists根據實際的資料庫例項,設定特定資料庫的SQL,然後執行該sql,基於執行結果判斷表是否存在,如果表不存在會異常。
Mysql執行的sql:
Oracle執行的sql:
可以看到不同的資料庫,查詢sql是不一樣的,這就可以根據資料庫的特點,以最快的效率返回查詢結果。
Hive使用的是預設的Sql:
hive中執行上面的查詢sql時,如果表或檢視的資料量比較大,就會起MR任務,啟動和銷燬MR任務都會浪費時間,這就導致了查詢比較慢。
四、程式碼優化
經過上面的分析,已經能定位到問題,解決方案也很簡單,針對hive資料庫實現特定的getSQLTableExists方法,最大化利用hive特性、以最優方式查詢資料。
在pentaho-big-data-legacy專案的Hive2DatabaseMeta類增加以下程式碼:
編譯big-data-plugin專案下的legacy模組,編譯後的jar包放到$KETTLE_HOME/plugins/pentaho-big-data-plugin目錄下
五、總結
遇到問題首先要分析詳細的Log,找到問題,根據以往經驗瞭解大致原因,然後為了進一步找到問題根源,最好仔細看原始碼、然後優化
本文首發於公眾號:data之道
相關文章
- 對IN & EXISTS NOT IN & NOT EXISTS的優化優化
- MySQL exists 優化 in 效率MySql優化
- Kettle優化就這麼多優化
- exists與in子查詢優化優化
- IN&EXISTS與NOT IN&NOT EXISTS 的優化原則的討論優化
- 【MySQL】NOT EXISTS優化的一個案例MySql優化
- create table if not exists Waiting for table metadata lockAI
- oracle之優化一用group by或exists優化distinctOracle優化
- 使用exists(Semi-Join)優化distinct語句優化
- beego報錯 table name: `xxx` not existsGo
- Query to Check SP/Table/Trigger Exists in Database or notDatabase
- Laravel的unique和exists驗證規則的優化Laravel優化
- 一個NOT EXISTS含有OR條件子查詢的優化優化
- Android效能優化——列表類控制元件卡頓優化Android優化控制元件
- 【DB】Direct Path EXP Corrupts The Dump If An Empty Table Partition Exists
- Oracle優化案例-用left join代替反連線 not in not exists(十)Oracle優化
- Oracle學習系列—資料庫優化—In和Exists的使用Oracle資料庫優化
- table控制元件的基本用法控制元件
- Oracle 'or exists/in'結合使用引起的filter執行計劃 的優化OracleFilter優化
- Mysql優化原則_小表驅動大表IN和EXISTS的合理利用MySql優化
- JS日曆控制元件優化(增加時分秒)JS控制元件優化
- django資料庫同步時報錯“Table 'XXX' already exists”Django資料庫
- Oracle資料泵impdp的table_exists_action引數說明Oracle
- impdp匯入時使用table_exists_action引數的區別
- 【匯出匯入】IMPDP table_exists_action 引數的應用
- [Oracle] exists 和 not existsOracle
- ASP.NET效能優化-頁面及控制元件ASP.NET優化控制元件
- 【效能優化】消除行遷移 table fetch continued row優化
- EXISTS、IN、NOT EXISTS、NOT IN用法區別
- WPF實現html中的table控制元件HTML控制元件
- NOT IN、NOT EXISTS的相關子查詢改用LEFT JOIN--sql2000效能優化SQL優化
- QRowTable表格控制元件(三)-效率優化之-合理使用QStandardItem控制元件優化
- impdp匯入時remap_*引數與table_exists_action的關係REM
- EXISTS、IN、NOT EXISTS、NOT IN的區別(ZT)
- in/exists和not in/not exists執行效率
- sql:delete if exists還是drop if exists?SQLdelete
- Sql最佳化(十八) 調優工具(1)set autotrace和excute plan tableSQL
- mysql-kettle-superset電商視覺化資料分析MySql視覺化