Spark作业速度与SQL Server大小的关系

时间:2016-10-14 19:36:34

标签: apache-spark apache-spark-sql spark-dataframe hdinsight

我的设置:

  • 我有运行Azure(V12)的MS SQL服务器
  • 我有一个在Azure HDInsights中运行的Spark群集
  • Spark.Version:1.6.2
  • Scala.Version:2.10.5

我通过jdbc驱动程序从SQL服务器中提取数据(大约500万行),然后更新列名。然后我执行我的逻辑。

以下是我从服务器上阅读的内容:

println("SQL Load Start: " + TimeStamp.getCurrentTime.toDateString)
val options: Map[String, String] = Map("url" -> connectionString,
    "dbtable" -> ("(SELECT * FROM Data)" + "Data"))
val data = sQLContext.read.format("jdbc").options(options).load()
println("DF Count: " + data.count().toString)
println("Partition Count: " + data.rdd.partitions.length.toString)
println("SQL Load End: " + TimeStamp.getCurrentTime.toDateString)

当我向上扩展SQL服务器时,我的数据被快速读入,我的逻辑在大约10秒内运行。 当SQL服务器很小时,我的数据读取速度较慢(预期),但我的逻辑也需要更长的时间(意外),花费大约3-4分钟。

群集大小没有变化。 DataFrame中的分区数似乎没有变化。我只是改变了SQL服务器的大小。

有没有人对我的Spark作业的逻辑部分根据我的SQL服务器的大小波动的原因有任何想法?

1 个答案:

答案 0 :(得分:0)

我想出来了。我的一个队友让我想起了我在训练中学到的东西。如果在从MS SQL检索数据后没有缓存数据,它将在您处理数据时再次检索数据。

更新后的内容如下:

println("SQL Load Start: " + TimeStamp.getCurrentTime.toDateString)
val options: Map[String, String] = Map("url" -> connectionString,
    "dbtable" -> ("(SELECT * FROM Data)" + "Data"))
val data = sQLContext.read.format("jdbc").options(options).load()

data.cache()   // NEW CODE

println("DF Count: " + data.count().toString)
println("Partition Count: " + data.rdd.partitions.length.toString)
println("SQL Load End: " + TimeStamp.getCurrentTime.toDateString)