相关文章推荐
老实的弓箭  ·  sparksql 大小写_Spark ...·  2 天前    · 
淡定的油条  ·  Visual Studio 2022 ...·  3 月前    · 
坚强的领结  ·  Kali Linux ...·  1 年前    · 
冷冷的单杠  ·  VS ...·  1 年前    · 

本文为您介绍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.conf spark-defaults.conf 页签中,新增 Key spark.gluten.enabled Value 为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