Невозможно достичь лучшей скорости в Apache Spark для некоторых небольших наборов данных при увеличении количества рабочих - PullRequest
0 голосов
/ 09 июля 2020

Я использую Spark для классификации набора данных о доходах переписи с помощью алгоритма случайного леса. Мои рабочие (w1 и w2) имеют один процессор (4 ядра). Когда я настраиваю Spark на использование только w1 в качестве рабочего, создание модели занимает около 12 секунд. Когда я настраиваю Spark для использования как w1, так и w2 в качестве рабочего, для построения модели снова требуется 12 секунд. Я вижу с помощью 'htop', что загрузка ЦП обоими рабочими увеличивается, когда я запускаю код. Однако я ожидаю, что время выполнения будет меньше! Когда я использую большие наборы данных, я могу достичь меньшего времени выполнения.

Вот мой фрагмент кода:

import org.apache.spark.mllib.tree.RandomForest
import org.apache.spark.mllib.tree.model.RandomForestModel
import org.apache.spark.mllib.util.MLUtils

// Load and parse the data file.
val data = MLUtils.loadLibSVMFile(sc, "data/Census-income.libsvm")
// Split the data into training and test sets (30% held out for testing)
val splits = data.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(0), splits(1))

// Train a RandomForest model.
// Empty categoricalFeaturesInfo indicates all features are continuous.
val numClasses = 2
val categoricalFeaturesInfo = Map[Int, Int]()
val numTrees = 3 // Use more in practice.
val featureSubsetStrategy = "auto" // Let the algorithm choose.
val impurity = "gini"
val maxDepth = 4
val maxBins = 32

val model = RandomForest.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo,
numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins)

// Evaluate model on test instances and compute test error
val labelAndPreds = testData.map { point =>
  val prediction = model.predict(point.features)
(point.label, prediction)
}
val testErr = labelAndPreds.filter(r => r._1 != r._2).count.toDouble / testData.count()
println(s"Test Error = $testErr")

В чем проблема? Любые комментарии приветствуются.

1 Ответ

0 голосов
/ 09 июля 2020

Закон Амдала и Закон Гюнтера оба применяются здесь.

Закон Амдала по существу гласит, что производительность от распараллеливания не может увеличиваться более чем на обратную величину относительной части работа, которая не является распараллеливаемой (относительно общей работы): если половина работы распараллеливается, а половина - нет, то добавление бесконечного числа рабочих может в лучшем случае сделать распараллеливаемую половину мгновенной, но непараллелизуемую половину не изменится: вы, таким образом, увеличите скорость вдвое. ненулевое снижение производительности.

В задании Spark имеется ненулевой объем непараллелизируемой работы (например, установка драйвера для задания). Объем параллелизируемой работы ограничен размером набора данных: чем меньше набор данных, тем большая часть рабочей нагрузки не распараллеливается.

Кроме того, некоторые операции, выполняемые в задании Spark, могут вызвать конкуренцию и задержки согласованности еще больше уменьшают выгоду от добавления дополнительных рабочих (я не знаю, выполняет ли Spark MLLib такие операции).

...