Apache Impala 4.0 釋出了!

語言: CN / TW / HK

Apache Impala is the open source, native analytic database for Apache Hadoop.

歷經15個月,Apache Impala 4.0終於釋出了!本次釋出一共包含700多個JIRA,本文將帶大家快速瞭解4.0的主要改動,參考自社群Release Notes:http://impala.apache.org/docs/release-notes-4.0.html

非相容性改動

大版本一般會有非相容性的改動,主要是拋棄掉一些歷史負擔,讓整個程式碼庫更簡潔更易於維護。本次4.0帶來的非相容性改動有:

  • 不再支援Hive 2.x 

  • 不再支援Sentry

    • 由於Sentry專案已停止更新,從Impala-4.0開始,Impala的授權只支援Ranger。

  • 不再支援Impala-lzo

    • 由於LZO是GPL協議開源的,跟Impala的Apache協議不相容。Impala的LZO支援一直是獨立出來放在另一個程式碼庫(Impala-lzo)中的。但這塊跟Impala程式碼耦合得很深,很容易因為版本不匹配而出問題。考慮到LZO在業界使用不多,並且有其它的壓縮演算法可替代,Impala 4.0刪除了對LZO的支援以及對Impala-lzo的依賴。

  • CPU指令集的最低要求從SSSE3提升為AVX

    • 實際上最低要求是AVX2,但如果CPU只支援AVX的話也可以,啟動引數要加上 --enablelegacyavx_support。

最後還有幾個應該沒怎麼被使用過的功能調整,影響應該小很多:

  • 不支援沒有日期的Timestamp資料 (IMPALA-9531)

  • "||" 操作符在左分支是String型別時表示字串的拼接(concat)操作。在這之前,"||"只表示Bool型別的OR操作。(IMPALA-452)

  • 不支援HAVING語句塊裡使用1、2這樣的數字下標 (IMPALA-7844)

新功能

  • 所有operator支援多執行緒加速

    • MT_DOP查詢選項可以設定多執行緒執行的並行度。預設情況下一個plan fragment在一臺機器上只會有一個例項(執行緒),設定MT_DOP後可以指定並行的例項數目,以加速cpu-bound的查詢。

    • 在4.0之前只有scan和aggregate完全支援,並在執行Parquet表的compute stats時預設設定MT_DOP=4。

    • 在4.0之後,任何型別的查詢都可以設定MT_DOP來指定fragment instance在一臺機器上的參考並行度。

  • 新的profile格式 (profile-v2)

    • Impala profile裡其實有大量的冗餘,比如當fragment instance數目多時,同樣的counter key字串會被重複多次。現有的profile在大叢集啟用MT_DOP>1時會佔用coordinator大量的記憶體空間。

    • 4.0帶來了一種新的更緊湊的profile格式,以聚合的方式顯示各種counter的值,具體見 IMPALA-9378。這個功能雖然打著experimental(實驗性)的標記,但其實只差相關上下游系統如CM、WXM的集成了。

    • 在啟動引數里加 --gen_experimental_profile=true 來啟用

  • 支援所有TPC-DS 99個查詢的語法,查詢不再需要重寫就可以在Impala上執行。新增的語法主要有

    • GroupBy語句裡支援 ROLLUP、CUBE 和 GROUPING SETS (IMPALA-7204)

    • SelectList中支援非關聯子查詢 (IMPALA-8954)

    • 支援 INTERSET 和 EXCEPT 集合操作 (IMPALA-9943、IMPALA-4974)

  • 透明的查詢重試 (IMPALA-9124)

    • 因節點故障失敗的查詢可以被coordinator透明地重試,可用查詢選項 retry_failed_queries 來啟用。

  • 支援按Z-Order寫入資料 (IMPALA-8755)

    • 建表時可以指定按Z-Order排序的列,用Impala寫入資料時就會以Z-Order排序。

  • 支援非同步Codegen (IMPALA-5444)

    • 執行時程式碼生成(Codegen)能優化執行效率,但會帶來額外的執行時編譯時間。如果查詢本身執行時間就很短,開啟Codegen反而會增加耗時。Impala 4.0引入了非同步Codegen的功能,當Codegen未完成時使用原函式,Codegen完成後無縫切換成優化後的函式程式碼。

    • 該功能用查詢選項 ASYNC_CODEGEN 來啟用。

  • 支援讀取Hive full-ACID ORC表的資料 (IMPALA-9042)

    • Hive3開始支援事務型別的表,在4.0之前,Impala只能讀取insert-only的事務表。Impala-4.0開始支援讀取完整事務功能的表(Hive當前只支援ORC格式)。

  • 基於Apache DataSketches支援了更多的函式 (IMPALA-9593, IMPALA-10281, IMPALA-10439)

    • 可以基於這些函式建立中間資料的聚合表,供需要估算count-distinct、quantile之類的查詢使用來加速。

  • 支援Apache Iceberg (IMPALA-10149)

    • 部分功能還處於實驗階段,語法可能會改,如建表語句中partition的定義。詳見社群dev郵件列表的討論。

  • 支援溢寫到S3 (IMPALA-9867)

    • Impala在記憶體不足時會溢寫資料到本地磁碟(spill to disk)。從4.0開始,Impala支援溢寫到遠端的S3儲存。該功能在雲上部署Impala時特別有用,因為雲上例項的本地儲存空間可能很小。

  • 提供了docker叢集供快速試用 (IMPALA-9793)

  • 支援aarch64 (ARM)平臺 (IMPALA-9376)

  • 支援更多的儲存,如Ozone、GCS(Google雲端儲存)等

  • 鑑權和授權方面的新功能

    • 支援與Apache Knox的整合

    • 支援SAML(SSO)認證

    • 更多的LDAP功能 (IMPALA-2563, IMPALA-10161)

    • 支援Ranger row-filtering (IMPALA-9234)

    • 支援Ranger上基於role的授權 (IMPALA-10211)

    • 支援Kudu表的owner功能 (IMPALA-9990)

  • compute incremental stats支援只統計指定列的資訊 (IMPALA-10435)

  • 關於 ndv() 函式的新功能

    • 提供新引數指定精度 (IMPALA-2658)

    • 提供查詢選項 DEFAULT_NDV_SCALE 以設定 ndv() 的預設精度 (IMPALA-10445)

更多功能無法一一列舉,請參見Change Log: http://impala.apache.org/docs/changelog-4.0.html

新提升

  • Planner/Optimizer/效能

    • rank()相關優化,如rank()的謂詞下推(IMPALA-2783),新加TopN operator以優化帶limit的rank計算 (IMPALA-9979)等。

    • 支援範圍謂詞(如 BETWEEN)相關的常量傳播 (IMPALA-10064)

    • 優化只涉及分割槽列的查詢 (IMPALA-8834)

    • Parquet表的runtime filter新增min-max filter (IMPALA-10325)。在這之前,min-max runtime filter只用在kudu表中,Parquet等其它表只有bloom filter形式的runtime filter。

  • 元資料

    • Catalogd元資料廣播時跳過鎖定(即正在更新/載入)的表 (IMPALA-6671)

      • 在這之前,元資料廣播可能被大表上的元資料更新(如refresh、recover partition、compute stats等)卡住,其它無關查詢可能因為等待元資料廣播也被卡住。Impala 4.0開始,元資料廣播只會在這種鎖定的大表上等待固定的時間,超時則跳過採集其它的元資料。具體配置見JIRA。

    • Partition級別的元資料廣播 (IMPALA-3127)

      • Impala的元資料有兩種模式:傳統模式中每個coordinator同步catalogd的元資料,LocalCatalog模式中每個coordinator按需快取元資料,且不再需要全量的元資料廣播。

      • 在4.0之前,傳統模式中元資料以表級別廣播。即使只有一個分割槽有改動,整個表的元資料也會被廣播。Impala 4.0開始,元資料以分割槽級別廣播。這將極大降低廣播大表元資料時array超過2GB引起JVM OOM的可能。注:DDL/DML RPC任以表級別返回元資料,將在 IMPALA-9937 中解決。但社群的重點會放在 LocalCatalog 模式。

      • 在4.0之前,當一個表被更新時,LocalCatalog模式中的coordinator會把其所有分割槽元資料都廢棄掉。Impala 4.0開始,只有更新的分割槽元資料會被廢棄。

    • LocalCatalog模式中優化了Partition元資料的記憶體表示 (IMPALA-7501)

      • LocalCatalog模式中的元資料快取將佔用更少的記憶體,快取的效能也有所提升。

  • Kudu整合

    • 支援下推bloom filter形式的runtime filter到Kudu表中 (IMPALA-3741)

    • 在Kudu表中支援 Timestamp 和 Date 型別的 bloom filter (IMPALA-9691)

    • 支援 Date 型別的 min-max filter (IMPALA-9294)

    • 下推到Kudu中的謂詞涉及到的列可以不被物化(如果查詢其它部分不需要用到) (IMPALA-10406)

  • 溢寫(Spilling)

    • 支援溢寫資料前進行壓縮 (IMPALA-3766)

    • 支援限制preaggregate階段的記憶體使用,從而為merge aggregate節省記憶體空間,該功能用查詢選項 PREAGGBYTESLIMIT 設定 (IMPALA-9530)

  • 執行時程式碼生成(Codegen)

    • 新增排序中部分關鍵程式碼的Codegen (IMPALA-3816)

  • ORC scanner

    • 為ORC scanner增加Codegen支援 (IMPALA-6506)

    • 優化ORC scanner中的字串分配 (IMPALA-9226)

    • 列式地處理ORC scanner中的資料(IMPALA-9228)

  • Data cache

    • 新增cache驅逐演算法LIRS (IMPALA-8690)

    • 增加更多cache相關的指標 (IMPALA-9435, IMPALA-9472, IMPALA-9473)

  • 節點黑名單,Coordinator會將問題節點加入黑名單,防止後續查詢因其失敗

    • 將有磁碟錯誤的節點加入黑名單 (IMPALA-9224)

    • 將DataStreamService RPC失敗的節點加入黑名單 (IMPALA-9137)

  • 可見性方面

    • Catalogd網頁顯示當前的DDL (IMPALA-6663)

    • Catalogd網頁提供json形式的元資料檢視 (IMPALA-10168)

更多改進詳見Change Log: http://impala.apache.org/docs/changelog-4.0.html

致謝

Impala-4.0的貢獻者有很多來自國內社群:汪勝(skyyws)、趙仁海、黃填華、褚福存、何獻青(xqhe)、劉垚、田紅瀚(abeltian)、馮國敬、蔡政(fifteencai)、鄧威(wesleydeng)、高小青、何李夫、吳昌、陳極(jchen)、黃權隆(stigahuang)。

感謝他們的付出以及他們所在公司,華為、騰訊、神策、網易、搜狐暢遊、Hulu、Cloudera 等對他們工作的支援,期待更多來自國內社群的貢獻!

本文分享自微信公眾號 - Hadoop實操(gh_c4c535955d0f)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。