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源创计划”,欢迎正在阅读的你也加入,一起分享。