2

Моя установка:Спарк Работа Скорость Relational Для SQL Server Размер

  • У меня есть сервер MS SQL Azure работает (V12)
  • У меня есть Спарк кластер работает в Azure HDInsights
  • Spark.Version: 1.6.2
  • Scala.Version: 2.10.5

Я вытягивать в моих данных (около 5 миллионов строк) с сервера SQL, с помощью JDBC драйвера, а затем обновления -й e. Затем я выполняю свою логику.

Вот как я прочитал с сервера:

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

Я понял это. Один из моих товарищей по команде напомнил мне о чем-то, чему я учился на тренировках. Если вы не кэшируете данные после извлечения из 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) 
Смежные вопросы