一. 引言
hadoop生態中的nosql資料分析三劍客hive、hbase、impala分別在海量批處理分析、大資料列式儲存、實時互動式分析各有所長。尤其是impala,自從加入hadoop大家庭以來,憑藉其各個特點鮮明的優點博取了廣大大資料分析人員的歡心。
impala通過主節點生成執行計畫樹並分發執行計畫至各節點並行執行的拉式獲取資料的工作方式,替代了hadoop中傳統的mapreduce推式獲取資料的工作方式,計算的中間結果不寫入磁碟,及時通過網路以stream的方式傳遞,互動性和實時性更強;impala不花費額外的精力管理元資料,而是使用hive的metastore進行元資料管理,能夠直接訪問儲存在hadoop的hdfs和hbase中的pb級大資料;impala採用塊的方式將元資料載入到記憶體進行運算,相比hive、hbase而言運算效能有了較大的提公升;impala提供sql語義,相比hbase對於使用者而言使用方便快捷並且簡單實用,無需其他程式語言,只需使用sql語句即可完成複雜的資料分析任務;impala還繼承了hadoop的靈活性、伸縮性和經濟性,具有分布式本地化處理的特性以避免網路瓶頸。
說了impala這麼多優點,難道它真是一點缺點沒有的一款「完美」的分析工具嗎?
非也!在一年以上的impala海量資料分析、web應用開發實戰經驗中,impala也陸陸續續暴露出了一些致命的問題:
不是所有的sql語句都能觸發,例如union關鍵字還是會觸發記憶體溢位錯誤;
各個節點的記憶體峰值限制不能過低,低於運算所需分配給各個節點的最小記憶體;
運算explain輸出的各個節點預估記憶體不能過分高於各個節點的實際物理記憶體;
當觸發「spill to disk」功能時有其他併發查詢,仍會觸發記憶體溢位錯誤;
對磁碟的空間有一定的要求,磁碟運算的資料會寫入到impala各個節點的臨時目錄下,增加了磁碟i/o,並且會引發不可控制的磁碟占用。
無論是官方建議,還是實際使用經驗而言,「spillto disk」不是乙個長遠之計。還是應該通過優化sql查詢、修改系統引數、提高硬體配置等方式來解決記憶體溢位的發生。
sql優化不僅是乙個成熟的分析、開發團隊需要具備的基本素質,更能最大限度的挖掘impala集群的效能,在資料分析時達到事半功倍的效果。下面介紹一下impala sql優化的四**寶:
使用profile語句可以輸出最近執行的sql查詢的更詳細更底層的資訊。在查詢執行完成後,無論查詢成功與否,輸入profile命令即可輸出查詢的詳細資訊。它包括了執行該查詢每個節點讀取的物理位元組數,使用的最大記憶體量等資訊。通過這些資訊,我們可以判斷查詢是ip消耗型的、cpu消耗型的、網路消耗型的,或者受效能低下節點的影響,從而可以檢查某些推薦的配置是否生效等。
profile輸出的查詢資訊內容包括:
(1)執行查詢的查詢狀態、查詢起始時間、查詢語句、提交查詢任務的impala節點等基礎資訊:
(2)查詢的執行計畫和步驟:
(3)各個步驟執**況的統計資訊,包括各節點的執行平均時長、最大時長、讀取資料量、記憶體峰值等資訊:
(4)各個步驟執**況的詳細資訊及每個步驟分配到各個節點執行的詳細資訊(由於該部分資訊過多,截圖省略)。
在執行乙個查詢之後,使用profile命令從底層確認該查詢的io、記憶體消耗、網路頻寬占用、cpu使用率等資訊是否在我們期望的範圍之內,若不是最優方案,則有的放矢通過對sql語句進行調優、調整節點配置等方式進行優化。
法寶四:結構優化
在使用了上述三個法寶之後若impala記憶體溢位問題還是沒有解決的話,那麼就有必要從結構方面考慮一下優化措施了。
(1)parquet表儲存
為impala中源資料、中間表、結果表選擇合適的儲存結構。impala預設是建立text格式的表儲存,而對於海量資料的儲存,優選parquet格式的儲存方式。在建表時顯示的指定以parquet格式建表,並且避免使用inser...values語句向parquet表中插入資料。因為這種方式每插入一行資料就會在hdfs上產生單獨的乙個小資料檔案,會降低資料查詢的並行度從而影響查詢速度。
(2)分割槽技術
當表的資料量非常龐大或者表總是按照某些特定的列進行查詢時,通過分割槽技術能極大的提公升impala的查詢速度。在分割槽時分區列要有一定的區分度,也就是要包含一定資料的非重複值。根據實際情況選擇分割槽的粒度,盡量保證每個分割槽的資料都大於1gb或者是1gb的倍數。只有分割槽的粒度使資料檔案的大小合適,才能充分利用hdfs的io批處理效能和impala的分布式查詢。
(3)sql語句
sql語句效能對最終任務的執行效率有著直接的影響。以下是sql優化的一些「經驗之談」:
優化集群系統資源
除了從sql查詢方面進行優化之外,還可以通過對impala集群系統在資源配置方面加以優化,做到「雙管齊下」。impala的准入控制功能是乙個輕量級的、分布式資源控制機制,它可以限制查詢使用的記憶體段大小,並行執行的查詢數量等。利用該功能對系統配置進行優化視具體集群環境而定,優化的思路包括:
impala作為一款開源的大資料分析引擎,其自身存在的一些缺陷是可以接受的。通過採用一些合理的優化方案,挖掘它的潛力,當真正「玩轉」之後,impala一定會帶給你意想不到的驚喜。
Impala效能優化
不多說,直接上乾貨!執行計畫 查詢sql執行之前,先對該sql做乙個分析,列出需要完成這一項查詢的詳細方案 命令 explain sql profile 要點 1 sql優化,使用之前呼叫執行計畫 2 選擇合適的檔案格式進行儲存 3 避免產生很多小檔案 如果有其他程式產生的小檔案,可以使用中間表 4...
Impala效能優化
執行計畫 查詢sql執行之前,先對該sql做乙個分析,列出需要完成這一項查詢的詳細方案 命令 explain sql profile 要點 1 sql優化,使用之前呼叫執行計畫 2 選擇合適的檔案格式進行儲存 3 避免產生很多小檔案 如果有其他程式產生的小檔案,可以使用中間表 4 使用合適的分割槽技...
Impala實踐之十五 Impala使用文件
由於前期大家使用impala的時候都比較隨意,再加上對impala的原理不清楚,因此在使用的過程中對impala帶來了很大的壓力。經過前段時間的研究和實驗。我整理了乙份impala使用文件,供組內小夥伴使用。只有通過hdfs增加或刪除分割槽中檔案後,才需要人為更新元資料,其餘情況依賴impala自帶...