Среда
2-ядерный ЦП, 8 ГБ памяти для каждой машины.
В кластере три одинаковые машины.
И я также настраиваю HDFS (2 репликации, размер блока 32 МБ). Я развернул его в автономном режиме.
Программа
Вот моя программа, самое простое приложение ALS.
import org.apache.spark.sql.{SaveMode, SparkSession}
import org.apache.spark.ml.recommendation.ALS
object ALSApp {
def main(args: Array[String]): Unit = {
val filePath = args(0)
val outputPath = args(1)
val spark = SparkSession.builder().appName("ALS").getOrCreate()
val ratings = spark.read.format("csv")
.option("header", "true")
.option("inferSchema", "true")
.load(filePath)
val ALS = new ALS()
.setMaxIter(5)
.setRegParam(0.01)
.setUserCol("userId")
.setItemCol("movieId")
.setRatingCol("rating")
//.setImplicitPrefs(true)
val model = ALS.fit(ratings)
// Generate top 10 movie recommendations for each user
val userRecs = model.recommendForAllUsers(10)
// Generate top 10 user recommendations for each movie
val movieRecs = model.recommendForAllItems(10)
userRecs.write.mode(SaveMode.Overwrite).json(outputPath+"/user.json")
movieRecs.write.mode(SaveMode.Overwrite).json(outputPath+"/movie.json")
spark.stop()
}
}
Подайте команду
./bin/spark-submit --master spark://big-data-1:7077 --class ALSApp --executor-memory 4G custom/experiment.jar hdfs://big-data-1:9000/custom/ratings_25000000.csv hdfs://big-data-1:9000/output
Тесты
Размер входного файла: 623 МБ
Один компьютер с локальным файлом
Использование 28 минут.
Три машины с локальным файлом
Использование 26 минут.
Три машины с HDFS
Использование 20 минут.
Вопросы
Почему я увеличил количество машин, но существенно не улучшил производительность? Когда я вижу панель мониторинга, предоставляемую Spark, всегда работает один исполнитель.
Но в порту 8080 все три машины имеют распределение ресурсов.
Кто-нибудь может объяснить, почему это происходит и в чем проблема?