一、背景
? ? 本文是kettle優(yōu)化的系列文章中的其中一篇。最近在分析一些跑的比較慢的Job,發(fā)現(xiàn)一個(gè)很詭異的現(xiàn)象:同一個(gè)Table Exists控件侍筛,有的跑的很快、有的很慢撒穷,最慢的甚至30分鐘左右匣椰。經(jīng)過(guò)進(jìn)一步分析,了解到在判斷hive數(shù)據(jù)庫(kù)時(shí)端礼,當(dāng)表的數(shù)據(jù)量很大或視圖的查詢邏輯非常復(fù)雜禽笑,控件調(diào)用就會(huì)變得非常耗時(shí)。
? ?初步想法是控件在運(yùn)行時(shí)蛤奥,可能是數(shù)據(jù)庫(kù)連接或查詢數(shù)據(jù)的TEST SQL有問(wèn)題佳镜,導(dǎo)致對(duì)大量數(shù)據(jù)表的判斷沒(méi)有進(jìn)行優(yōu)化。為了驗(yàn)證這一想法并進(jìn)行徹底的優(yōu)化凡桥,只能通過(guò)看源代碼實(shí)現(xiàn)方式蟀伸。
二、準(zhǔn)備工作
? ? 1缅刽、下載Kettle源碼
? 從githup上下載kettle代碼并checkout到和自己kettle版本對(duì)應(yīng)的分支上:
? git clone git@github.com:pentaho/pentaho-kettle.git
? git checkout 6.1.0.1-R
????2啊掏、下載big-data-plugin源碼,big-data-plugin是kettle大數(shù)據(jù)相關(guān)的組件 ????
? ?git clone git@github.com:pentaho/big-data-plugin.git
? ?git checkout 6.1.0.1-R
3拷恨、前兩步下載的項(xiàng)目導(dǎo)入到Eclipse
三脖律、代碼分析
? ? Table Exists控件的實(shí)現(xiàn)類是 pentaho-kettle項(xiàng)目中的JobEntryTableExists谢肾,運(yùn)行時(shí)執(zhí)行execute方法腕侄,該方法首先獲得Database對(duì)象、數(shù)據(jù)庫(kù)連接芦疏,然后調(diào)用Database的checkTableExists方法冕杠,該方法就是用來(lái)判斷數(shù)據(jù)庫(kù)中是否存在指定的表。
? ? checkTableExists根據(jù)實(shí)際的數(shù)據(jù)庫(kù)實(shí)例酸茴,設(shè)置特定數(shù)據(jù)庫(kù)的SQL分预,然后執(zhí)行該sql,基于執(zhí)行結(jié)果判斷表是否存在薪捍,如果表不存在會(huì)異常笼痹。
????Mysql執(zhí)行的sql:
Oracle執(zhí)行的sql:
可以看到不同的數(shù)據(jù)庫(kù)配喳,查詢sql是不一樣的,這就可以根據(jù)數(shù)據(jù)庫(kù)的特點(diǎn)凳干,以最快的效率返回查詢結(jié)果晴裹。
????Hive使用的是默認(rèn)的Sql:
hive中執(zhí)行上面的查詢sql時(shí),如果表或視圖的數(shù)據(jù)量比較大救赐,就會(huì)起MR任務(wù)涧团,啟動(dòng)和銷毀MR任務(wù)都會(huì)浪費(fèi)時(shí)間,這就導(dǎo)致了查詢比較慢经磅。
四泌绣、代碼優(yōu)化
? ? 經(jīng)過(guò)上面的分析,已經(jīng)能定位到問(wèn)題预厌,解決方案也很簡(jiǎn)單阿迈,針對(duì)hive數(shù)據(jù)庫(kù)實(shí)現(xiàn)特定的getSQLTableExists方法,最大化利用hive特性轧叽、以最優(yōu)方式查詢數(shù)據(jù)仿滔。
? ? 在pentaho-big-data-legacy項(xiàng)目的Hive2DatabaseMeta類增加以下代碼:
編譯big-data-plugin項(xiàng)目下的legacy模塊,編譯后的jar包放到$KETTLE_HOME/plugins/pentaho-big-data-plugin目錄下
五犹芹、總結(jié)
? ? 遇到問(wèn)題首先要分析詳細(xì)的Log崎页,找到問(wèn)題,根據(jù)以往經(jīng)驗(yàn)了解大致原因腰埂,然后為了進(jìn)一步找到問(wèn)題根源飒焦,最好仔細(xì)看源代碼、然后優(yōu)化
本文首發(fā)于公眾號(hào):data之道