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源創計劃”,歡迎正在閲讀的你也加入,一起分享。