本文为您介绍Spark Native引擎在使用过程中的限制,以及如何在Spark3服务中开启Native引擎。
背景信息
Spark Native引擎存在部分使用上的限制,在遇到限制场景时,Spark Native引擎会在对应的Spark Stage进行回退(fallback,表示回退到原生Spark引擎)。例如,在遇到不支持的数据类型、function时,Spark Native引擎会fallback到原生Spark引擎执行,并不会影响作业最终执行完成。由于fallback需要进行必要的数据转换,fallback次数过多,可能会导致总体运行时间比原生Spark引擎更慢。因此,当您发现在使用Spark Native引擎后作业执行速度有所下降,可能是遇到了多次fallback。
为了避免产生fallback影响执行速度,您需要了解Spark Native引擎的使用限制。
前提条件
已创建EMR-5.11.1及之后版本,EMR-3.45.1及之后版本的集群,创建集群详情请参见 创建集群 。
使用限制
目前Spark Native引擎存在以下限制:
-
仅支持Spark3,不支持Spark2。
-
仅支持Parquet数据格式。使用其他数据格式(例如,ORC)会出现fallback,影响执行速度。
-
支持None、Zstd、Snappy、Gzip压缩类型。
-
不支持Date、Timestamp、Decimal、NaN数据类型。
-
暂不支持Delta、Hudi、Iceberg等湖格式。
-
暂不兼容Celeborn等RSS服务。
-
不支持ANSI模式,当配置
spark.sql.ansi.enabled=true
时,会fallback到原生Spark。 -
不支持Case Sensitive模式(表示大小写敏感)。目前仅支持Case Insensitive模式(表示大小写不敏感),如果使用Case Sensitive模式可能会得到错误的结果。
-
不支持原生Spark的columnar reading。
-
不兼容
spark.sql.optimizer.dynamicDataPruning.enabled
功能。您可以设置spark.sql.optimizer.dynamicDataPruning.enabled
的参数值为false
关闭该功能。 -
Spark Function相关
-
目前仅20%左右的Spark Function支持Native引擎。
-
JSON Function仅支持双引号包围的字符串,不支持单引号,如果使用单引号可能会得到错误的结果。
-
不支持UDF。
-
-
执行hash join、hash aggregate、sort操作时不支持Spill,当执行的作业数据量超出内存限制时,可能会出现内存相关的报错,导致作业无法顺利执行。
注意事项
Spark Native引擎目前处于测试阶段,仅提供测试使用,请勿用于生产作业。
开启Spark Native引擎
全局设置
在Spark3服务 状态 页面的 服务概述 区域,打开 NativeEngine 开关,即可启用Spark Native引擎。开启Spark Native引擎后,使用spark-sql、pyspark、beeline等客户端工具执行Query时会调用Native引擎执行作业。
作业级别设置
如果您只希望部分作业使用Spark Native引擎,则需按照以下步骤操作:
-
在Spark3服务 状态 页面的 服务概述 区域,打开 NativeEngine 开关。
-
在Spark3服务 配置 页面的 spark-thriftserver.conf 和 spark-defaults.conf 页签中,新增 Key 为 spark.gluten.enabled , Value 为false的配置项。
-
在需要开启Native引擎的作业中设置
spark.gluten.enabled=true
。
配置调优
Spark Native引擎默认内存为
1g
,如果执行Query过程中出现内存相关报错,则需要自行调大参数
spark.memory.offHeap.size
,确保Spark Native引擎有足够的可用内存。
常见问题
-
问题描述:执行Query时出现fallback,且报错Unexpected Bloom filter version number。
-
解决方法:这是由于Native引擎的BloomFilter的实现与Spark不同,您可以关闭Native引擎的BloomFilter,即设置参数
spark.gluten.sql.native.bloomFilter=false
;也可以关闭Spark的BloomFilter,即设置参数spark.sql.optimizer.runtime.bloomFilter.enabled=false
。