我的设置:
我通过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服务器的大小波动的原因有任何想法?
答案 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)