Spark 作业速度与 SQL 服务器大小相关

Spark Job Speed Relational To SQL Server Size

我的设置:

我正在通过 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 服务器的大小而波动吗?

我想通了。我的一位队友让我想起了我在训练中学到的东西。如果您在从 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)