增强有限内存下的稳定性
配置场景
当前Spark SQL执行一个查询时需要使用大量的内存,尤其是在做聚合(Aggregate)和关联(Join)操作时,此时如果内存有限的情况下就很容易出现OutOfMemoryError。有限内存下的稳定性就是确保在有限内存下依然能够正确执行相关的查询,而不出现OutOfMemoryError。
有限内存并不意味着内存无限小,它只是在内存不足于放下大于内存可用总量几倍的数据时,通过利用磁盘来做辅助从而确保查询依然稳定执行,但依然有一些数据是必须留在内存的,如在做涉及到Join的查询时,对于当前用于Join的相同key的数据还是需要放在内存中,如果该数据量较大而内存较小依然会出现OutOfMemoryError。
有限内存下的稳定性涉及到3个子功能:
配置描述
参数入口:
在应用提交时通过“--conf”设置这些参数,或者在客户端的“spark-defaults.conf”配置文件中调整如下参数。
参数 |
场景 |
描述 |
默认值 |
---|---|---|---|
spark.sql.tungsten.enabled |
/ |
类型为Boolean。
|
true |
spark.sql.codegen.wholeStage |
类型为Boolean。
|
true |
- 开启ExternalSort除配置spark.sql.planner.externalSort=true外,还需配置spark.sql.unsafe.enabled=false或者spark.sql.codegen.wholeStage =false。
- 如果您需要开启TungstenAggregate,有如下几种方式:
将spark.sql.codegen.wholeStage 和spark.sql.unsafe.enabled的值都设置为true(通过配置文件或命令行方式设置)。
如果spark.sql.codegen.wholeStage 和spark.sql.unsafe.enabled都不为true或者其中一个不为true,只要spark.sql.tungsten.enabled的值设置为true时,TungstenAggregate会开启。