2016-02-03 52 views
7

我試圖比較Spark SQL版本1.6和版本1.5的性能。在一個簡單的例子中,Spark 1.6比Spark 1.5快得多。但是,在一個更復雜的查詢中 - 在我的情況下,使用分組集的聚合查詢,Spark SQL版本1.6比Spark SQL版本1.5慢得多。有人注意到同樣的問題嗎?甚至更好有這種查詢的解決方案?Spark SQL性能:版本1.6和版本1.5

這是我的代碼

case class Toto(
       a: String = f"${(math.random*1e6).toLong}%06.0f", 
       b: String = f"${(math.random*1e6).toLong}%06.0f", 
       c: String = f"${(math.random*1e6).toLong}%06.0f", 
       n: Int = (math.random*1e3).toInt, 
       m: Double = (math.random*1e3)) 

val data = sc.parallelize(1 to 1e6.toInt).map(i => Toto()) 
val df: org.apache.spark.sql.DataFrame = sqlContext.createDataFrame(data) 

df.registerTempTable("toto") 
val sqlSelect = "SELECT a, b, COUNT(1) AS k1, COUNT(DISTINCT n) AS k2, SUM(m) AS k3" 
val sqlGroupBy = "FROM toto GROUP BY a, b GROUPING SETS ((a,b),(a),(b))" 
val sqlText = s"$sqlSelect $sqlGroupBy" 

val rs1 = sqlContext.sql(sqlText) 
rs1.saveAsParquetFile("rs1") 

這裏是2個截圖Spark 1.5.2Spark 1.6.0與--driver內存= 1G。 Spark 1.6.0上的DAG可以在DAG查看。

+1

似乎它在1.6中洗牌的更多,你可以發佈兩個DAG嗎? –

+0

謝謝@SebastianPiu。您可以在[spark 1.5.2](http://i.stack.imgur.com/dLXiK.png)和[spark 1.6.0](http://i.stack.imgur)中看到帶有空DAG的2個屏幕截圖的.com/4oomU.png)。在其他情況下,Spark仍然正確顯示DAG。 –

+0

是的,可悲的是,這是一個錯誤,當鉻更新時,所以不可能排除故障DAG :( –

回答

1

感謝Herman vanHövell對spark dev社區的回覆。爲了與其他成員分享,我在這裏分享他的迴應。

1.6計劃單個不同的聚合體,如多個不同的聚合體;這固有地導致一些開銷,但在高基數情況下更穩定。您可以通過將spark.sql.specializeSingleDistinctAggPlanning選項設置爲false來恢復到以前的行爲。另請參閱:https://github.com/apache/spark/blob/branch-1.6/sql/core/src/main/scala/org/apache/spark/sql/SQLConf.scala#L452-L462

其實爲了恢復設置值應該是「真」。