2016-02-03 16 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") 

ある--driverメモリ= 1Gと2つのスクリーンショットSpark 1.5.2Spark 1.6.0あります。 Spark 1.6.0のDAGはDAGで閲覧できます。

+1

1.6でさらにシャッフルしているようですが、2つの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

悲しいことに、悲しいことに、これはChromeが更新されて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

実際には、設定値を元に戻すには「true」にする必要があります。

関連する問題