在特性配置前,请先了解OmniOperator算子加速特性的使用限制。
- 当前UDF插件仅支持Simple UDF,用于执行基于Hive UDF框架编写的UDF函数。
- 当前支持的Decimal数据类型规格包含64位和128位,如若超过128位的表示范围,则会抛出异常或者返回null,可能会产生和引擎原生行为不相同的场景,如SUM、AVG聚合等,若中间结果超出Decimal 128位,引擎原生正常执行,OmniOperator则根据配置抛出异常或者返回null。这里建议如果字段需要进行AVG运算且存在累加结果过大的可能,请使用Double等其他类型存储。
- 不同的负载所需内存配置不一样,例如TPC-DS 3TB数据集,SparkExtension推荐配置下,堆外内存配置不低于20GB,99条所有SQL可成功运行,运行过程中日志可能出现MEM_CAP_EXCEEDED但不影响最终功能,建议适当增大堆外内存配置。如果堆外内存配置过低,SQL有可能执行结果出错。
- 当前Sort、Window和HashAgg等算子支持Spill功能,BroadcastHashJoin、ShuffledHashJoin和SortMergeJoin等尚不支持Spill功能。
- Hive OmniOperator算子加速在支持跑通TPC-DS 99条时,由于原生Hive在q14、q72和q89运行时可能存在问题,因此OmniOperator算子加速暂不支持Hive引擎运行该3条SQL。
- Hive OmniOperator算子加速在支持POWER表达式时,由于C++ std:pow函数和Java的Math.pow函数实现存在一些细微差距,导致使用C++实现的POWER表达式和Hive原生的POWER表达式存在一定误差,但相对精度误差不大于1e-15。
- Spark OmniOperator算子加速支持from_unixtime和unix_timestamp表达式:
- 仅支持时间解析策略spark.sql.legacy.timeParserPolicy为EXCEPTION、CORRECTED的情况,不支持LEGACY。
- 对于一些不合理的参数(如不存在的日期,无效的超大时间戳值等),Omni实现与原生Spark实现的处理结果存在不一致。
- 可以通过配置spark.omni.sql.columnar.unixTimeFunc.enabled=false来回退这两个函数,即使用原生函数来规避2中的不一致问题。
- Hive OmniOperator算子加速在支持浮点数运算时,可能会产生和原生Hive行为不相同的场景,如除浮点数0.0等。若出现除浮点数0.0的场景,原生Hive返回null,OmniOperator算子加速则根据具体的运算行为返回Infinity、NaN或null。
- Hive引擎默认开启CBO优化,Hive OmniOperator算子加速当前仅支持开启CBO优化,不支持关闭,即不支持将hive.cbo.enable设置为false。
- 当SQL中存在Alter字段属性或使用LOAD DATA导入.parq数据的场景时,Hive引擎建议使用原生TableScan算子。
- Spark OmniOperator算子加速同时对超多列进行表达式Codegen时,例如500列,编译开销大于OmniOperator加速效果,建议该场景采用原生Spark执行。
- Spark OmniOperator算子加速boolean类型数据不支持比较运算符(<、<=、>、>=、!=、<>、=、==和<=>),同时所有数据类型对比较运算符<=>都不支持,在执行过程中存在这些场景会导致算子回退属于正常现象。如果有大表之间的join发生回退,行列转换开销很大,导致性能会比较差,实际使用过程中应尽量避免以上场景的出现导致回退。
- Hive OmniOperator算子加速在表声明的数据存储结构和实际存储结构不匹配,且GroupBy和分桶的参数一致时,原生Hive可能出现GroupBy算子分组异常的问题。因此建议在建表时不采用分桶策略或使用load data local inpath的方式导入数据,以保障表声明的存储结构和实际存储结构相匹配。
- Hive OmniOperator算子加速在求和结果溢出时,可能会产生和引擎原生行为不相同的结果。OmniOperator算子加速返回NULL,使用户能够感知到运算发生溢出;原生Hive返回一个错误值,可能对用户造成误导。