我有一个受python API训练的XGBoost模型,现在我只是想用它来预测大约3亿个海量数据。我只是使用Scala的XGBoost的loadModel API在Spark驱动程序中加载模型,然后将模型广播给所有执行者以执行预测操作。我使用500个执行程序,并在每个执行程序上使用4G内存和1个内核,但是它太慢了,无法接受。它可能需要15个小时才能完成。
但是,当我在单个jvm中进行测试时,它的速度非常快,至少可以每秒预测200条以上的记录,因此当使用500个内核时,Spark作业应该在不到一个小时的时间内完成,但是为什么它这么慢?
代码如下:
sc.addFile("hdfs://xxxxxxx/model/mash/data/my_train.model")
val fpd30Model = XGBoost.loadModel(SparkFiles.get("my_train.model"))
val model30Bdc = sc.broadcast(fpd30Model)
val resultRdd = sc.textFile("hdfs://xxxxxxx/model/mash/data/30_features/").repartition(5000)
.map(row=>{
val data = row.split("\t")
val miId = data(0)
val features = data(1).split(",").map(row=>row.toFloat)
val score = model30Bdc.value.predict(new DMatrix(features, 1, 225, Float.NaN))(0)(0)
Array(miId, score).mkString("\t")
}).repartition(100)
val output = "hdfs://xxxxxxx/model/mash/score/30_score/"
HdfsIo.removePath(sc, output)
resultRdd.saveAsTextFile(output)