面试系列:如何让你的spark sql运行的更快一些?

在spark设置并行度一般通过两种方式来设置:

1.spark.default.parrallelism
2.textFile()传入第二个参数,指定partition数量

使用spark sql的时候会出现什么问题?

但是如果使用来spark sql,用spark sql的那个stage的并行度,你没办法自己指定,因为spark sql 自己会默认根据hive表对应的hdfs的block,自动设置spark sql查询所在的那个stage的并行度。

你自己通过spark.default.parallelism参数指定的并行度,只会在没有spark sql的stage中生效。

比如:你的第一个stage,用spark sql从hive表中查询了一些数据,然后做了一些transformation操作,接着做了一个shuffle操作(例如groupByKey);下一个stage,在stage之后,做了一些transformation操作。
hive表,对应了一个hdfs文件,有20个block;你自己设置了spark.default.parallelish参数为100;
你的第一个stage的并行度,是不受你设置的参数控制的,就只有20task;第二个stage的并行度,才是你自己设置的100;
这样会产生的问题就是:在第一个stage中,可能有非常复杂的业务逻辑或者算法,如果只有默认的20个并行度的话,每个task要处理很大的数据量,这就会导致第一个stage执行的速度特别慢。而第二个就很快。

解决方法

直接对spark sql查询出来的rdd使用repartition,进行重新分区。

三种设置方式:

直接设置分区数量

dataFrame.repartition(10)

根据字段进行分区,分区数量由 spark.sql.shuffle.partition 决定

dataFrame.repartition($"name")

根据字段进行分区,将获得100个分区的DataFrame,这种方式可以在join的时候极大的提高效率,但是同时得注意出现数据倾斜的问题

dataFrame.repartition(100,$"name")

公众号:guowei  

专为大数据面试而生

一系列的spark,flink优化文章在等你呢~

你可能感兴趣的:(大数据,spark,面试)