最近在研究Impala的準入控制這塊掷匠,其中一個參數(shù)是限制一個池中的最大并行執(zhí)行的查詢數(shù)榜苫,假設這個值是20,那么當提交一個查詢到impala,而集群中已經(jīng)有20個查詢正在執(zhí)行了,那么這個新加入的查詢就會被加入到一個等待隊列中,直到正在執(zhí)行的查詢執(zhí)行完畢宏榕,并釋放資源。
這個參數(shù)可以有效的緩解Impala的Memory Limit Exceeded問題侵佃。但是有一個問題麻昼,有兩種情況hue會長時間占用查詢資源,導致其他查詢不得不等待馋辈。
我們用的Hue版本是3.11.0抚芦,如上圖所示:
第一個查詢是hue進行配置校驗的時候發(fā)起的,查詢執(zhí)行成功,但沒有取出結(jié)果并關閉連接叉抡。
第二個是在hue中執(zhí)行impala查詢時尔崔,界面上先加載100條,當我們向下滾動到底部時候繼續(xù)加載剩下的數(shù)據(jù)褥民。數(shù)據(jù)沒拿完季春,查詢不關閉似乎也說的過去。
接著做了一個實驗轴捎,在hue上執(zhí)行 SELECT 'hello' ,可以看到頁面發(fā)送了一個execute請求鹤盒,和三個fetch_result_data請求,其中后面兩次fetch_result_data的返回都是空的侦副,并且has_more為false侦锯,因為我們的查詢只有一行返回。
現(xiàn)在我們在同一個窗口在執(zhí)行一遍剛才的查詢秦驯,發(fā)現(xiàn)比上次多發(fā)送了一個close_statement請求尺碰。hue會保證一個會話窗口只創(chuàng)建一個impala連接,當同一個窗口提交新的查詢時會強制關閉上一個查詢译隘。
當查詢結(jié)果沒有拿完之前不關閉連接是可以理解的亲桥,但是為什么我的結(jié)果都已經(jīng)拿完了,還不釋放連接呢固耘,其實是hue有一個數(shù)據(jù)下載功能要復用當前連接题篷。如果關閉連接的話,會導致下載失敗厅目。即便
如此番枚,我還是希望fetch完所有數(shù)據(jù)后立即關閉連接,因為大多數(shù)查詢都只會返回少量數(shù)據(jù)损敷,并且不需要下載的葫笼。當有大量數(shù)據(jù)需要下載時,只有不把頁面滑動到數(shù)據(jù)的最末端對下載是沒有影響的拗馒。
經(jīng)過以上實驗路星,我們總結(jié)出hue的兩個問題
1.配置校驗沒有釋放連接,是bug 還是 我們自己的環(huán)境問題诱桂?
2.能否在fetch完所有數(shù)據(jù)后關閉impala連接洋丐?
帶著這兩個問題,下載了hue的源碼https://github.com/cloudera/hue
看到hue/apps/impala/src/impala/conf.py 文件發(fā)現(xiàn)確實沒有fetch和close這樣的操作
這個問題在最新的版本中已經(jīng)修正了挥等。
現(xiàn)在我希望在fetch_result_data返回所有數(shù)據(jù)后(及result.has_more 為false時)自動發(fā)起一次close_statement請求垫挨。通過一番搜索找到fetch_result_data請求的處理函數(shù)
在 hue/desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js 文件,修改如下:
修改過我們再次執(zhí)行 SELECT 'hello',可以看到第二fetch_result_data之后跟了一個close_statement請求触菜。并且在impala后臺可以看到連接已經(jīng)成功釋放了。雖然后面還跟了一個錯誤的fetch_result_data哀峻,但是無傷大雅涡相。