为什么由Scala API加载并在Spark中的广播使用的XGBoost模型运行得如此缓慢?

时间:2019-05-09 10:42:04

标签: scala apache-spark broadcast xgboost

我有一个受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)

0 个答案:

没有答案