文档

Spark Native引擎使用说明(Beta)

更新时间:

本文为您介绍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引擎,则需按照以下步骤操作:

  1. 在Spark3服务状态页面的服务概述区域,打开NativeEngine开关。

  2. 在Spark3服务配置页面的spark-thriftserver.confspark-defaults.conf页签中,新增Keyspark.gluten.enabledValue为false的配置项。

  3. 在需要开启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

  • 本页导读 (1)
文档反馈