Impala性能調優最佳實踐

Impala性能調優最佳實踐概覽

1選擇合適的文件格式

一般對於大數據集而言(每一個分區或者表的大小爲幾個G或者更大),推薦使用Parquet文件格式。由於它按列存儲,單詞IO能夠請求更多的數據,另外它支持更好的壓縮算法對二進制文件進行壓縮。算法

對於小表而言(每一個分區或者表的大小小於幾個G或者更小),不一樣的存儲格式之間沒有明顯的性能差異。在小數據量時,能夠經過減小並行執行的機會(使用壓縮文件格式),來減小的I / O。在規劃生產部署或執行基準測試時,始終使用實際數據量來得到性能和擴展性的真實狀況。shell

2避免數據處理過程當中產生過多小文件

對於外部的存儲數據,一般的格式爲文本格式或者Avro格式,這樣能夠按照行來構建數據文件。一旦數據要加載到Impala的表中,能夠將其轉換爲更高效的Parquet格式,並使用單個INSERT ... SELECT語句拆分爲多個數據文件。網絡

使用insert…select在表與表之間拷貝數據。避免對海量數據或者影響性能的關鍵表使用insert…values插入數據,由於每條這樣的insert語句都會產生單個的小文件。app

若是在數據處理過程當中產生了上千個小文件,須要使用insert…select來說數據複製到另一張表,在複製的過程當中也解決了小文件過多的問題。分佈式

3選擇合適的分區粒度

分區是一種基於一個或多個列的值物理劃分數據的技術,例如按年,月,日,地區,城市等。當查詢指定了具體的分區列或者分區列範圍時,Impala能夠避免讀取不相關的數據,從而可能大大節省磁盤I / O。函數

在肯定分區列時,要選擇合適的分區粒度。例如,是按照年、月、日進行分區,仍是僅按照年、月進行分區。選擇分區的策略是,要保證每一個分區的數據至少爲256 MB,這樣能夠更好地利用HDFS的IO批處理性能和Impala的分佈式查詢。oop

過分分區還可能致使查詢計劃花費的時間超過必要的時間,由於Impala會修剪沒必要要的分區。理想狀況下,將表中的分區數保持在3萬如下。性能

在準備每一個分區目錄的數據文件時,應當使用幾個大文件而不是許多小文件。若是存在的數據原本就是以許多小文件的形式存在的,而且沒法控制文件的格式,那麼,建議使用INSERT ... SELECT語法將數據從一個表或分區複製到另外一個表或分區,這樣操做會合並文件從而減小文件的數量。測試

          若是一個包含上千個分區的parquet表,每一個分區的數據都小於1G,就須要採用更大的分區粒度,只有分區的粒度使文件的大小合適,才能充分利用HDFS的IO批處理性能和Impala的分佈式查詢。大數據

4對分區鍵列使用最小的適當整數類型

一般,人們更喜歡使用字符串做爲分區鍵列,由於這些值都變成了HDFS目錄名。可是,建議使用數值類型的值做爲分區鍵,好比年、月、日,由於這樣能夠減小內存的使用。一般狀況下,月和日的數據類型爲TINYINT,年的類型爲SMALLINT。使用該EXTRACT()函數從TIMESTAMP值中提取單個日期和時間字段,並使用CAST()函數將返回值轉換成適當的整數類型。

5選擇合適的Parquet塊大小

默認狀況下,經過INSERT ... SELECT語句建立的Parquet文件的塊大小爲256 MB。(此默認值在Impala 2.0中已更改。之前限制爲1 GB,但Impala對壓縮作出了保守估計,致使文件小於1 GB。)

6收集統計信息

使用compute stats收集鏈接查詢中海量數據表或者影響性能的關鍵表的統計信息。

7最大限度地減小將結果傳回客戶端的開銷

能夠考慮使用以下技術:

(1)聚合。若是須要計算知足條件的記錄行數,求匹配到的行中某列的和、最大值、最小值等,不要將整個結果集發送到客戶端由客戶端應用來處理這些數據,而是能夠調用像 COUNT()、SUM()、MAX()等彙集函數來處理,若是將整個未彙集過的數據集發送到客戶端,單單將數據傳送到客戶端這一個動做就須要消耗很大的網絡開銷。

(2)過濾。使用不一樣的謂詞條件儘量的縮小結果集的大小,而不是把整個結果集發送到應用端,由應用來處理過濾邏輯。使用WHERE查詢子句中的全部適用測試來消除不相關的行,而不是生成大的結果集並使用應用程序邏輯對其進行過濾。

(3)LIMIT子句。若是您只須要查看結果集中的不多的樣本數據,或查詢使用ORDER BY以後產生的最大值或者最小值,可使用LIMIT子句來最大限度的減小結果集的大小。

(4)避免對結果集進行美化輸出:當經過impala-shell查詢數據時,能夠指定-B--output_delimiter選項輸出原始的結果集,而不須要impala對輸出的格式進行美化,或者直接將結果集重定向到文件中。上述的狀況也能夠考慮使用 INSERT ... SELECT將結果直接寫入HDFS上。

8檢查查詢計劃

在實際運行一個查詢以前,使用explain查看執行計劃是否以高效合理的方式運行

9查看查詢的性能特徵

在運行一個查詢以後,使用profile命令查看IO,內存消耗,網絡帶寬佔用,CPU使用率等信息是否在指望的範圍以內。

10使用適當的操做系統設置

有關影響Impala性能的操做系統設置,請參閱Apache Hadoop發行版的文檔。好比,將vm.swappiness設置爲非零值能夠提升總體性能。