Hue的Impala模組沒有釋放連線的問題解決

piny發表於2021-09-09

最近在研究Impala的准入控制這塊,其中一個引數是限制一個池中的最大並行執行的查詢數,假設這個值是20,那麼當提交一個查詢到impala,而叢集中已經有20個查詢正在執行了,那麼這個新加入的查詢就會被加入到一個等待佇列中,直到正在執行的查詢執行完畢,並釋放資源。

這個引數可以有效的緩解Impala的Memory Limit Exceeded問題。但是有一個問題,有兩種情況hue會長時間佔用查詢資源,導致其他查詢不得不等待。

圖片描述

我們用的Hue版本是3.11.0,如上圖所示:

第一個查詢是hue進行配置校驗的時候發起的,查詢執行成功,但沒有取出結果並關閉連線。

第二個是在hue中執行impala查詢時,介面上先載入100條,當我們向下滾動到底部時候繼續載入剩下的資料。資料沒拿完,查詢不關閉似乎也說的過去。

接著做了一個實驗,在hue上執行 SELECT 'hello' ,可以看到頁面傳送了一個execute請求,和三個fetch_result_data請求,其中後面兩次fetch_result_data的返回都是空的,並且has_more為false,因為我們的查詢只有一行返回。

圖片描述

圖片描述

現在我們在同一個視窗在執行一遍剛才的查詢,發現比上次多傳送了一個close_statement請求。hue會保證一個會話視窗只建立一個impala連線,當同一個視窗提交新的查詢時會強制關閉上一個查詢。

當查詢結果沒有拿完之前不關閉連線是可以理解的,但是為什麼我的結果都已經拿完了,還不釋放連線呢,其實是hue有一個資料下載功能要複用當前連線。如果關閉連線的話,會導致下載失敗。即便

如此,我還是希望fetch完所有資料後立即關閉連線,因為大多數查詢都只會返回少量資料,並且不需要下載的。當有大量資料需要下載時,只有不把頁面滑動到資料的最末端對下載是沒有影響的。

圖片描述

經過以上實驗,我們總結出hue的兩個問題

1.配置校驗沒有釋放連線,是bug 還是 我們自己的環境問題?

2.能否在fetch完所有資料後關閉impala連線?

帶著這兩個問題,下載了hue的原始碼

看到hue/apps/impala/src/impala/conf.py 檔案發現確實沒有fetch和close這樣的操作

圖片描述

這個問題在最新的版本中已經修正了。

圖片描述

現在我希望在fetch_result_data返回所有資料後(及result.has_more 為false時)自動發起一次close_statement請求。透過一番搜尋找到fetch_result_data請求的處理函式

在 hue/desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js 檔案,修改如下:

圖片描述

修改過我們再次執行 SELECT 'hello',可以看到第二fetch_result_data之後跟了一個close_statement請求。並且在impala後臺可以看到連線已經成功釋放了。雖然後面還跟了一個錯誤的fetch_result_data,但是無傷大雅。

圖片描述



作者:Caoyun
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3034/viewspace-2818315/,如需轉載,請註明出處,否則將追究法律責任。

相關文章