Spark:分布式系统性能不佳。如何改进>

时间:2016-11-03 00:55:29

标签: apache-spark spark-dataframe apache-spark-mllib

我编写了一个简单的Spark程序,并希望将其部署到分布式服务器上。这很简单:

获取数据 - >安排数据 - >训练数据 - >重新申请以查看训练结果。

输入数据只有10K行,有3个功能。 我首先在本地机器上运行,使用“local [*]”。它只运行约3分钟。 现在当我部署到集群时,它运行得非常慢:半小时没有完成。在训练阶段变得非常缓慢。

我很好奇,如果我做错了什么。请帮我查一下。我使用Spark 1.6.1。

我提交:

spark-submit --packages com.databricks:spark-csv_2.11:1.5.0  orderprediction_2.11-1.0.jar --driver-cores 1 --driver-memory 4g --executor-cores 8 --executor-memory 4g

代码在这里:

 def main(args: Array[String]) {
    // Set the log level to only print errors
    Logger.getLogger("org").setLevel(Level.ERROR)

    val conf = new SparkConf()
        .setAppName("My Prediction")
        //.setMaster("local[*]")
    val sc = new SparkContext(conf)
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    val data = sqlContext.read
        .option("header","true")
        .option("delimiter", "\t")
        .format("com.databricks.spark.csv")
        .option("inferSchema","true")
        .load("mydata.txt")

    data.printSchema()
    data.show()

    val dataDF = data.toDF().filter("clicks >=10")
    dataDF.show()

    val assembler = new VectorAssembler()
      .setInputCols(Array("feature1", "feature2", "feature3"))
      .setOutputCol("features")

    val trainset = assembler.transform(dataDF).select("target", "features")
    trainset.printSchema()
    val trainset2 = trainset.withColumnRenamed("target", "label")

    trainset2.printSchema()
    val trainset3 = trainset2.withColumn("label", trainset2.col("label").cast(DataTypes.DoubleType))
    trainset3.cache() // cache data into memory
    trainset3.printSchema()
    trainset3.show()

    // Train a RandomForest model.

    println("training Random Forest")

    val rf = new RandomForestRegressor()
      .setLabelCol("label")
      .setFeaturesCol("features")
      .setNumTrees(1000)

    val rfmodel = rf.fit(trainset3)

    println("prediction")
    val result = rfmodel.transform(trainset3)

    result.show()
}

更新:经过调查,我发现它被卡住了

collectAsMap at RandomForest.scala:525

它已经花了1.1小时在这条线上,还没有完成。我相信数据只有几兆字节。

1 个答案:

答案 0 :(得分:0)

您正在构建一个由1000个RandomTrees组成的RandomForest,它将训练1000个实例。

代码collectAsMap是第一个动作,而其余的都是转换(延迟评估)。因此,当您在该行看到挂起时,这是因为现在评估了所有maps, flatMaps, filters, groupBy,等。