自从Impala 4.0发布后,历时近11个月,Impala 4.1终于发布了!新版本在Iceberg集成、Catalog优化、Parquet/ORC读取性能、嵌套类型等方面都有较大进展。限于个人认知和篇幅有限,本文只能挑些重要功能进行介绍,详细更新列表可见 Change Log-4.1.
Impala-4.1开始正式支持Apache Iceberg。Iceberg是开源的table format,具有以下几个特性:
下面的例子演示了如何在Impala中使用Iceberg表:

目前Impala只支持Iceebrg V1类型的DML操作,即insert into/insert overwrite。Iceberg V2类型的操作如行级别的修改(update, delete)仍未支持。更多细节可查看文档:Using Impala with Iceberg Tables
Impala支持多种文件格式,如Parquet、ORC、Avro、Text等,其中Parquet格式的支持是性能最好的,做了比较多的优化,Impala-4.1在这方面又有不少改进。
Parquet Scanner的工作主要包含数据读取、解压、解码和执行下推的谓词等。当有谓词下推时,可以先读取相关列的数据,过滤得到所需要的行号后,再去相应地读取其它列。在谓词选择性高的场景下,可以有数倍的性能提升,具体可查看 IMPALA-9873。
Parquet文件是自解释的文件,包含了schema和索引信息(如各列min-max值),其中的索引就包含可选的Bloom Filter。Impala-4.1开始支持读写Parquet文件中的Bloom Filter,下推的等值谓词能作用在文件的Bloom Filter上。(IMPALA-10640, IMPALA-10642)
Parquet文件的列可以使用字典编码,下推的谓词(Predicate/Filter)会先作用在字典上,以过滤无用的RowGroup,从而减少读取的数据量。Runtime Filter是在运行时生成的谓词,由hash join的hash表生成而来,下推到scanner提前过滤数据。
从Impala-4.1开始,Runtime Filter也会作用在字典上,前提是字典不能太大,超过一定大小将不启用此优化。这个阈值由查询选项PARQUET_DICTIONARY_RUNTIME_FILTER_ENTRY_LIMIT 控制,默认为1024。
支持高精度类型Decimal读取的schema兼容性,即当Parquet文件的Decimal列与表字段定义的precision或scale不一致时,可兼容性地读取。(IMPALA-7087, IMPALA-8131)
Impala在ORC文件的读取方面(即ORC Scanner)集成的是第三方的ORC C++ Reader,虽然易于维护,但不像内建的Parquet Scanner那样更方便做性能优化。Impala-4.1在ORC读取方面做了不少优化,旨在缩小Parquet Scanner和ORC Scanner间的性能差距。比如下推谓词和Runtime IN-list Filter到ORC Reader,ORC Reader的异步数据读取,ORC Scanner和ORC Reader的代码优化等。许多场景下已经能做到接近读Parquet的性能。
下面列出部分JIRA:
IMPALA-6505: Min-Max predicate push down in ORC scanner
IMPALA-10894: Pushing down predicates in reading "original files" of ACID tables
IMPALA-10873: Push down EQUALS, IS NULL and IN-list predicate to ORC reader
IMPALA-6636: Use async IO in ORC scanner
IMPALA-10898: Add runtime IN-list filters for ORC tables
IMPALA-11204: Template implementation for OrcStringColumnReader::ReadValue
IMPALA-11123: Optimize count(star) for ORC scans
更多细节详见Epic: https://issues.apache.org/jira/browse/IMPALA-9040 (登陆JIRA以查看所有item)
Event processor是catalogd中的组件,用来自动同步Hive MetaStore中的元数据更新,让用户不必使用Refresh或Invalidate Metadata <table>语句来手动同步。Impala-4.1中有以下改进
从Impala-4.1开始,SelectList里可以直接使用Struct或Array类型的列,结果将以JSON的形式转换成字符串,表现与Hive兼容。具体可见 IMPALA-9495、IMPALA-9498.
Impala语法不支持Hive中的Lateral View,需要用join来展开array和map。Impala-4.1引入了和Postgresql兼容的UNNEST()函数,以方便进行array的展开(暂未支持map)。具体可见 IMPALA-10920、IMPALA-11038.


CREATE EXTERNAL TABLE test_file (s STRING, i INT)
STORED AS PARQUET
LOCATION 'sfs+hdfs:///tmp/data.paq';
Impala-4.1中的impala-shell支持使用hs2 protocol连接HiveServer2,直接提交Hive查询。命令行参数使用--strict_hs2_protocol,如
impala-shell.sh --strict_hs2_protocol -i hs2-host:10000
详见 IMPALA-10778: Allow impala-shell to connect directly to HS2
Impala在计算内存不足时,会溢写中间数据到本地磁盘中。Impala-4.0开始支持溢写到S3,在云上部署时不需要配置大存储的节点。从Impala-4.1开始,溢写目录可以配置到HDFS上,溢写空间不再受限于本地磁盘容量,更有利于存储计算分离。(IMPALA-10429)
在基数(cardinality)估计方面有不少改进,如
IMPALA-10681: Improve inner join cardinality estimates
IMPALA-7560: Set selectivity of Not-equal
IMPALA-10766: Better selectivity for =,not distinct
也优化了inline view相关的查询计划生成性能
IMPALA-10799: Analysis slowdown with inline views and thousands of column
IMPALA-10806: Create single node plan slowdown when hundreds of inline views are joined
Impala使用快速排序算法对内存里的数据进行排序,当数据重复度较高时,三路快排会更优于传统的两路快排。Impala-4.1开始,排序算子会根据处理的数据自适应地调整排序算法。(IMPALA-10961)
在使用cast(… as string)或 from_unixtime() 将Timestamp类型转换为String类型时,性能有近十倍的提升。(IMPALA-10984)
欢迎加微信号China_Impala进入Impala社区微信群,有任何Impala相关的问题都可以在群里讨论。
最后感谢所有为Impala-4.1贡献过代码的社区开发者!他们是
Abhishek Rawat
Alexander Saydakov
Alexey Serbin
Aman Sinha
Amogh Margoor
Andrew Sherman
Attila Jeges
Bikramjeet Vig
Carolin Chen
Csaba Ringhofer
Daniel Becker
Deepti Sehrawat
Fang-Yu Rao
Fucun Chu
Gabor Kaszab
Gergely Fürnstáhl
Guojing Feng
Joe McDonnell
Kishen Das
Lipeng Lin (LPL)
Liu Yao
Michael Smith
Noemi Pap-Takacs
Norbert Luksa
Pranav Lodha
Qifan Chen
Quanlong Huang (stiga-huang)
Riza Suminto
Shajini Thayasingh
Sheng Wang (skyyws)
Shikha Asrani
Sourabh Goyal
Steve Carlin
Tamas Mate
Vihang Karajgaonkar
Wei-Chiu Chuang
Wenzhe Zhou (wzhou-code)
Xiang Yang (yx91490)
Xianqing He (xqhe)
Yida Wu
Yong Yang
Yu-Wen Lai
Zoltan Borok-Nagy
Zoltan Garaguly
Zoltan Haindrich