Spark MLlib - trainImplicit warning
Я вижу эти предупреждения при использовании trainImplicit
:
WARN TaskSetManager: Stage 246 contains a task of very large size (208 KB).
The maximum recommended task size is 100 KB.
И тогда размер задачи начинает увеличиваться. Я попытался вызвать repartition
на входной RDD, но предупреждения одинаковы.
Все эти предупреждения поступают из итераций ALS, из flatMap, а также из совокупности, например, начала этапа, на котором flatMap показывает эти предупреждения (с Spark 1.3.0, но они также показаны в Spark 1.3.1 ):
org.apache.spark.rdd.RDD.flatMap(RDD.scala:296)
org.apache.spark.ml.recommendation.ALS$.org$apache$spark$ml$recommendation$ALS$$computeFactors(ALS.scala:1065)
org.apache.spark.ml.recommendation.ALS$$anonfun$train$3.apply(ALS.scala:530)
org.apache.spark.ml.recommendation.ALS$$anonfun$train$3.apply(ALS.scala:527)
scala.collection.immutable.Range.foreach(Range.scala:141)
org.apache.spark.ml.recommendation.ALS$.train(ALS.scala:527)
org.apache.spark.mllib.recommendation.ALS.run(ALS.scala:203)
и из совокупности:
org.apache.spark.rdd.RDD.aggregate(RDD.scala:968)
org.apache.spark.ml.recommendation.ALS$.computeYtY(ALS.scala:1112)
org.apache.spark.ml.recommendation.ALS$.org$apache$spark$ml$recommendation$ALS$$computeFactors(ALS.scala:1064)
org.apache.spark.ml.recommendation.ALS$$anonfun$train$3.apply(ALS.scala:538)
org.apache.spark.ml.recommendation.ALS$$anonfun$train$3.apply(ALS.scala:527)
scala.collection.immutable.Range.foreach(Range.scala:141)
org.apache.spark.ml.recommendation.ALS$.train(ALS.scala:527)
org.apache.spark.mllib.recommendation.ALS.run(ALS.scala:203)
Ответы
Ответ 1
Аналогичная проблема была описана в списках рассылки Apache Spark - http://apache-spark-user-list.1001560.n3.nabble.com/Large-Task-Size-td9539.html
Я думаю, вы можете попробовать сыграть с количеством разделов (используя метод repartition()), в зависимости от того, сколько хостов, оперативной памяти, процессоров у вас есть.
Попробуйте также изучить все шаги с помощью веб-интерфейса, где вы можете увидеть количество этапов, использование памяти на каждом этапе и местоположение данных.
Или просто не обращайте внимание на эти предупреждения, если все работает правильно и быстро.
Это уведомление жестко закодировано в Spark (планировщик /TaskSetManager.scala)
if (serializedTask.limit > TaskSetManager.TASK_SIZE_TO_WARN_KB * 1024 &&
!emittedTaskSizeWarning) {
emittedTaskSizeWarning = true
logWarning(s"Stage ${task.stageId} contains a task of very large size " +
s"(${serializedTask.limit / 1024} KB). The maximum recommended task size is " +
s"${TaskSetManager.TASK_SIZE_TO_WARN_KB} KB.")
}
.
private[spark] object TaskSetManager {
// The user will be warned if any stages contain a task that has a serialized size greater than
// this.
val TASK_SIZE_TO_WARN_KB = 100
}