Apache Impala 4.0概览
历经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的话也可以,启动参数要加上 --enable_legacy_avx_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节省内存空间,该功能用查询选项 PREAGG_BYTES_LIMIT 设置 (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 等对他们工作的支持,期待更多来自国内社区的贡献!
关于如何参与社区,参见《如何参与Impala社区的讨论》