Impala 3.4的新功能和社区进展

Impala 3.4的新功能和社区进展

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。还有若干正在进展中的项目,也将在最后介绍。

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