一些常用的Spark SQL调优技巧
文章目录
一些常用的Spark SQL调优技巧
-
使用缓存表
在sparksql中,当我们创建表时,我们可以通过调用spark.catalog.cacheTable("tableName")
或者dataFrame.cache()
的方式将表缓存起来。这样Spark SQL将仅扫描所需的列,并自动调整压缩以最小化内存使用和GC压力。
当你不需要缓存时,可以通过使用spark.catalog.uncacheTable("tableName")
将其移除缓存。此外,我们还可以通过设置
spark.sql.inMemoryColumnarStorage.batchSize
来调整列缓存batch的大,例如在提交spark作业时候,指定以下参数:--conf "spark.sql.inMemoryColumnarStorage.batchSize=10000"
较大的batch size可以提高内存利用率和压缩率,但在缓存数据时存在OOM风险。
-
调整Shuffle分区
我可以通过调整在对数据进行shuffle或者aggregation操作时的分区数目来提高性能。
分区数和reduce任务数是相同的。如果reducer具有资源密集型操作,那么增加shuffle分区将增加并行性,同时还可以更好地利用资源并最小化每个任务的负载。
我们可以通过设置spark.sql.shuffle.partitions
来调整spark sql作业中的shuffle分区数(默认值为200).
例如在提交spark作业时候,指定以下参数:--conf "spark.sql.shuffle.partitions=2000"
-
使用Broadcast Join
Broadcast Join接类似于Hive中的Map Join,其中较小的表将被加载到分布式缓存中,并且连接操作可以作为Map Only操作来完成。 默认情况下,Spark SQL中会启用广播连接。当然,我们也可以指定以下参数将其关闭:--conf“spark.sql.autoBroadcastJoinThreshold = -1”
这个参数是表示Broadcast Join时广播表大小的阈值,
-1
即可以理解为关闭Broadcast Join。
当然当我们开启Broadcast Join时,也可以修改其数值来增加在执行连接操作时可以广播的表大小的最大值。 默认值为10 MB,例如我们可以通过以下设置将其大小更改为50MB:--conf "spark.sql.autoBroadcastJoinThreshold = 50485760"
参考资料:
Spark-Troubleshooting-guide-Spark-SQL-Examples-of-commonly-used-Spark-SQLTuning-properties