面試系列:如何讓你的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

相關文章
相關標籤/搜索