面试系列:如何让你的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)sql

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

dataFrame.repartition($"name")大数据

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

dataFrame.repartition(100,$"name")优化

公众号:guowei  

专为大数据面试而生spa

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

相关文章
相关标签/搜索