Impala 3.4的新功能和社区进展
知名的大数据中台技术分享基地,涉及大数据架构(hadoop/spark/flink等),数据平台(数据交换、数据服务、数据治理等)和数据产品(BI、AB测试平台)等,也会分享最新技术进展,大数据相关职位和求职信息,大数据技术交流聚会、讲座以及会议等。
Apache Impala是一个高性能的SQL查询引擎,主要面向SQL on Hadoop中的交互式查询场景。Impala社区在四月底发布了3.4版本。这是时隔半年后的又一个新版本,也是最后一个3.x版本。之后将进入4.x时代,为的是接受一系列 breaking changes,如删除对过时操作系统(Centos6、Ubuntu14等)的支持、删除对Sentry的支持、删除对lzo的支持等。具体的 breaking changes 还在讨论之中,感兴趣的同学可以订阅邮件列表参与讨论。本文主要介绍 3.4 版本带来的新功能以及新的提升,概括起来有这么几个方面:Result Spooling, Column Masking,Apache ORC, Apache Hudi。还有若干正在进展中的项目,也将在最后介绍。
Impala 3.4 的新功能
Result Spooling
要解释 Result Spooling 解决的问题,先要介绍下 Impala 的执行机制。Impala 的执行引擎遵从 volcano 模型设计,整个执行计划树流水线式地自上而下抽取数据,数据以batch的形式在operator间传递。当用户获取到第一行数据时,只代表第一个batch的计算完成了。虽然后续batch的计算还会异步的进行,但总有堆满buffer的时候,这时所有执行实例就会停下来,直到用户拉取下一个batch或者关闭查询为止。此时各个执行实例还会继续占用着内存资源,从而挤占其它查询的可用内存空间。
这个问题在支持分页的客户端(如HUE)里比较常见,以往的解决办法是设置 --idle_query_timeout,如果客户端长时间不拉取数据,Impala coordinator 会主动关闭session,从而关闭查询并释放其占用的内存资源。
Result Spooling 提供了另一个解决办法:让 coordinator 帮客户端拉取并缓存查询结果,然后关闭查询、释放内存资源。这个操作对客户端是透明的,客户端仍旧从 coordinator 拉取下一个 batch 的结果,不同的是 coordinator 直接从结果缓存中读取并返回。相关的 query option 有:SPOOL_QUERY_RESULTS、MAX_RESULT_SPOOLING_MEM、MAX_SPILLED_RESULT_SPOOLING_MEM、DEFAULT_SPILLABLE_BUFFER_SIZE。
Ranger Integration
支持 Ranger Column Masking Policy,包括 resource based 和 tag based 的 policy。传统的数据脱敏方式是通过对不同类型的用户建立视图(View)来实现,视图数目多时维护成本很高。Ranger 提供了 column masking policy 来描述一列数据对不同用户(组)的不同脱敏规则,从而不再需要建立视图。Impala 从 3.4 版本开始支持 Column Masking,共享 Hive 的 Ranger policy。
支持 Ranger 的 Object ownership 功能,即能识别 Ranger policy 中的 {OWNER} 字段.
支持 Ranger 2.x
ORC 读取方面的若干提升
支持读取 ORC 文件的 DATE 类型数据。
支持以 ORC 文件的 schema 创建表:CREATE TABLE table_name LIKE ORC '/path/to/file'
优化 ORC 文件的读取,包括 code generation、物化时的向量化、字符串的内存分配等,测试单结点 TPC-H 性能提升 5% ~ 28%
集成 Apache Hudi
Apache Hudi 是一个开源的,支持插入、更新、删除的增量数据湖处理框架,可助力构建企业级数据湖。Impala 3.4 开始支持读取 Hudi Read Optimized 格式的表,具体实现见 IMPALA-8778.
其它
EventProcessor默认使用Refresh而不是Invalidate Metadata来处理Hive发生的事件(如AlterTable),以及更精确地检测Impala集群发起的事件(Self Event),相关修复:IMPALA-9101、IMPALA-9357、IMPALA-9095 等
支持 db/table 级别的黑名单,黑名单上的 db/table 将对 Impala 用户不可见 (IMPALA-8797)。默认用来屏蔽 sys、information_schema 这两个 Hive 自带的 db,也可以用来禁用一些 Impala 无法处理的大表。
支持读取 Avro 文件的 DATE 类型数据。
支持 SQL:2016 标准 datetime 模式,即 CAST(... AS ... FORMAT <template>) 语法里的 template 部分支持更多关键字 (IMPALA-4018)
Admission Control 关于查询内存估计的更新:IMPALA-7351
LocalCatalog相关更新:支持 global invalidation (IMPALA-7506)
Planner方面的若干修复:IMPALA-7027, IMPALA-7604, IMPALA-7784, IMPALA-8647, IMPALA-8718, IMPALA-9023, IMPALA-9025, IMPALA-9162, IMPALA-9358, IMPALA-9429
更多细节可查看:https://impala.apache.org/docs/changelog-3.4.html
社区进展
以下工作正在进行之中:
执行实例支持多线程计算
Impala在IO层是多线程的,每个executor(impalad)多线程地从多个磁盘以及网络读取数据。但在计算层仍是每个fragment instance只有一个线程在执行。支持多线程计算能有效提高CPU bound类型查询的执行效率,具体可追踪 IMPALA-3902 下的 issue(登陆可见).
Hive3 ACID表的支持
现在Impala支持Hive3中insert-only transactional表的读写,目前正在支持full ACID表的读取操作,具体可追踪 IMPALA-9042.
Query retry and fault tolerance (IMPALA-9124)
更全面的嵌套类型支持,如允许嵌套类型出现在SelectList、函数参数/返回值等(IMPALA-9494, IMPALA-9518, IMPALA-9514, IMPALA-9516, IMPALA-9521)
Catalogd 细粒度元数据加载和缓存 (IMPALA-8937)
支持 Kudu Bloom Filter (IMPALA-3741)
支持 Iceberg (IMPALA-9621)
支持 aarch64 (IMPALA-9376)
实现 Robin Hood Hash Table (IMPALA-9434)
Impala-shell 支持 Python3 (IMPALA-3343)
欢迎感兴趣的同学参与到社区的开发中来!具体步骤可参考:https://cwiki.apache.org/confluence/display/IMPALA/Contributing+to+Impala