文章目录
一些常用的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).
例如在提交s