天天看點

Apache Impala總結

Impala

​ 基于hive,使用記憶體計算,提供對HDFS、Hbase資料的高性能、低延遲的互動式SQL查詢功能。Impala适合用來處理輸出資料适中或比較小的查詢。

元件簡紹

Impala Statestore :檢查叢集各個節點上Impala daemon的健康狀态,同時不間斷地将結果回報給各個Impala daemon

Impala Catalog :分發hive 的中繼資料資訊到 Impala Daemon,接收來自Statestore的所有請求,一個叢集中隻需要 一個節點上有這個守護程序,

Impala Daemon :Impalad接收client請求,負責讀寫資料檔案,基于記憶體運作Sql

部署注意事項:

​ 如果Impalad與 Catalog安裝到一塊,當記憶體消耗很大時會影響中繼資料的同步,是以要部署到不同的機器上,Catalog與StateStore 需要進行通信,是以最好部署到同一機器

常遇問題:

1.記憶體消耗過大導緻分析任務異常的BUG

2.impala通常與MR等離線任務運作在一個叢集上, 通過YARN統一管理資源, 如何同時滿足互動式查詢和離線查詢兩種需求具有較大挑戰性。 YARN通過全局唯一的Resource Mananger排程資源, 好處是RM擁有整個叢集全局資訊,能做出更好排程決策, 缺點是資源配置設定的性能不足。 Impala每個查詢都需要配置設定資源, 當每秒查詢數上千時, YARN資源配置設定的響應時間變的很長, 影響到查詢性能。

3.一個使用者執行大量的insert操作,其實這些任務本身是能正常執行的,但是當這種任務大量地執行時,很有可能會對整個叢集的io造成一定的影響,這時候正好又有一定數量複雜查詢的反複送出,綜合起來會使叢集在某個時間段内出現io或者某些表被鎖住。

4.大量的insert操作或者select操作,會導緻對impala的中繼資料庫進行大量的讀寫,這種頻繁的讀寫操作會造成mysql的鎖表。

5.如果在同一個shell腳本中,先執行了ddl操作,然後又對相應的庫執行查詢,會出現中繼資料同步延遲導緻無法讀取資訊的操作。

記憶體溢出問題

Impala從Impala 1.4 for CDH4、CDH5.1版本開始新增了“SQL Operations that Spill to Disk”功能,即當Impala記憶體運算溢出時轉移到磁盤進行運算,雖然在計算時需要占用臨時的磁盤空間,增加了磁盤I/O,導緻運算時間遠高于純記憶體運算,但至少解決了記憶體溢出時分析任務直接失敗這一“0”容錯的緻命問題。

在impalashell中執行“setDISABLE_UNSAFE_SPILLS=0”或者“setDISABLE_UNSAFE_SPILLS=FALSE”指令即可。當設定DISABLE_UNSAFE_SPILLS參數的值為0(FALSE)時,記憶體運算瀕臨溢出時轉為磁盤運算;設定為1(TRUE)時,當記憶體溢出時直接報記憶體溢出“Memory limit exceeded”錯誤

建議使用者盡可能的規避觸發“Spill to Disk”功能。該功能目前存在的限制包括:

  1. 不是所有的SQL語句都能觸發,例如union關鍵字還是會觸發記憶體溢出錯誤;
  2. 各個節點的記憶體峰值限制不能過低,低于運算所需配置設定給各個節點的最小記憶體;
  3. 運算explain輸出的各個節點預估記憶體不能過分高于各個節點的實際實體記憶體;
  4. 當觸發“Spill to Disk”功能時有其他并發查詢,仍會觸發記憶體溢出錯誤;
  5. 對磁盤的空間有一定的要求,磁盤運算的資料會寫入到impala各個節點的臨時目錄下,增加了磁盤I/O,并且會引發不可控制的磁盤占用。

優化:

1.分區不能超過1w多,否則嚴重影響查詢性能

2.join時,把小表寫前面,會把小表廣播到其他節點。

3.引入快速、非集中式的查詢準入機制, 控制查詢并發度。

4.LLAM(low latency application master)通過緩存資源, 批量配置設定,增量配置設定等方式實作降低資源配置設定延時

5.為Impala中源資料、中間表、結果表選擇合适的存儲結構。Impala預設是建立TEXT格式的表存儲,而對于海量資料的存儲,優選Parquet格式的存儲方式。在建表時顯示的指定以Parquet格式建表,并且避免使用INSER…VALUES語句向Parquet表中插入資料。因為這種方式每插入一行資料就會在HDFS上産生單獨的一個小資料檔案,會降低資料查詢的并行度進而影響查詢速度。

6.在Impala的分析任務中,無論是資料庫中的原始表、中間表、結果表還是查詢用到的海量資料表或者影響性能的關鍵表,建議在生成表之後執行COMPUTE STATS table_name指令對表的相關資訊進行統計,叢集會根據統計資訊自動選擇優化的查詢方案。越是規模大的表(GB、TB級以上)統計指令執行時間越長,統計完成後的查詢優化效果越是明顯

注:壓縮資料帶來cpu額外耗時,但是減少了io耗時。

中繼資料操作優化

1.隻有通過hdfs增加或删除分區中檔案後,才需要人為更新中繼資料,其餘情況依賴impala自帶更新機制即可。

2.通過hdfs增加或删除分區中檔案後一律使用refresh tablename操作,性能損耗最低。

3.日常查詢操作一律不加-r參數。如果出現提示中繼資料過期,可斷開重連或者使用refresh操作。

繼續閱讀