对于某些工作负载,可以通过在内存中缓存数据或打开一些实验选项来提高性能。
在内存中缓存数据
Spark SQL可以通过调用spark.catalog.cacheTable(“tableName”)或使用内存中的列式格式来缓存表.dataFrame.cache()。然后,Spark SQL将仅扫描所需的列,并自动调整压缩以最小化内存使用和GC压力。可以调用spark.catalog.uncacheTable(“tableName”)从内存中删除表。
- spark.sql.inMemoryColumnarStorage.compressed 设置为true时,Spark SQL将根据数据统计信息自动为每列选择压缩编解码器。
- spark.sql.inMemoryColumnarStorage.batchSize 10000 控制柱状缓存的批次大小。较大的批处理大小可以提高内存利用率和压缩率,但在缓存数据时会产生OOM风险。
其他配置选项
以下选项也可用于调整查询执行的性能。由于会自动执行更多优化,因此可能会在将来的版本中弃用这些选项。
物业名称 默认 含义
- spark.sql.files.maxPartitionBytes 134217728(128 MB) 读取文件时打包到单个分区的最大字节数。
- spark.sql.files.openCostInBytes 4194304(4 MB) 可以在同一时间扫描通过字节数测量的打开文件的估计成本。将多个文件放入分区时使用。最好过度估计,然后使用较小文件的分区将比具有较大文件的分区(首先安排的分区)更快。
- spark.sql.broadcastTimeout 300 广播连接中广播等待时间的超时(以秒为单位)
- spark.sql.autoBroadcastJoinThreshold 10485760(10 MB) 配置在执行连接时将广播到所有工作节点的表的最大大小(以字节为单位)。通过将此值设置为-1,可以禁用广播。请注意,目前只有ANALYZE TABLE COMPUTE STATISTICS noscan运行该命令的Hive Metastore表支持统计信息 。
- spark.sql.shuffle.partitions 200 配置为连接或聚合数据移动数据时要使用的分区数。