Spark在HadoopRDD上花了很长时间:输入拆分

时间:2018-02-07 05:02:22

标签: scala apache-spark rdd apache-spark-mllib hadoop-partitioning

我正在大型libsvm文件上使用SGD运行逻辑回归。该文件大小约为10 GB,有4000万个训练样例。

当我使用spark-submit运行我的scala代码时,我注意到spark花了很多时间记录这个:

  

18/02/07 04:44:50 INFO HadoopRDD:输入拆分:文件:/ ebs2 / preprocess / xaa:234881024 + 33554432

     

18/02/07 04:44:51 INFO执行人:在阶段1.0(TID 7)完成任务6.0。 875字节结果发送到驱动程序

     

18/02/07 04:44:51 INFO TaskSetManager:在阶段1.0中启动任务8.0(TID 9,localhost,执行程序驱动程序,分区8,PROCESS_LOCAL,7872字节)

     

18/02/07 04:44:51 INFO TaskSetManager:在localhost(执行者驱动程序)(7/307)上以1025毫秒的阶段1.0(TID 7)完成任务6.0

为什么Spark做了这么多'HadoopRDD:输入拆分'?这样做的目的是什么,我如何加速或摆脱这个过程呢?

以下是代码:

import org.apache.spark.SparkContext
import org.apache.spark.mllib.evaluation.MulticlassMetrics 

import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.mllib.classification.LogisticRegressionWithSGD
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.optimization.L1Updater
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
import scala.compat.Platform._ 


object test {

    def main(args: Array[String]) {

        val nnodes = 1
        val epochs = 3

        val conf = new SparkConf().setAppName("Test Name")
        val sc = new SparkContext(conf)

        val t0=currentTime
        val train = MLUtils.loadLibSVMFile(sc, "/ebs2/preprocess/xaa",  262165, 4)
        val test = MLUtils.loadLibSVMFile(sc,  "/ebs2/preprocess/xab",   262165, 4)
        val t1=currentTime;

        println("START")
        val lrAlg = new LogisticRegressionWithSGD()
        lrAlg.optimizer.setMiniBatchFraction(10.0/40000000.0)
        lrAlg.optimizer.setNumIterations(12000000)
        lrAlg.optimizer.setStepSize(0.01)

        val model = lrAlg.run(train)        


        model.clearThreshold()
        val scoreAndLabels = test.map { point =>
              val score = model.predict(point.features)
              (score, point.label)
        }

        val metrics = new BinaryClassificationMetrics(scoreAndLabels)
        val auROC = metrics.areaUnderROC()
        println("Area under ROC = " + auROC)
     }
}

1 个答案:

答案 0 :(得分:1)

我通过运行

修复了速度问题

train = train.coalesce(1) train.cache()

并通过将内存增加到总共64演出。由于内存不足,以前Spark可能没有正确缓存。