Apache spark Spark:分布式系统性能差。如何改进>;

Apache spark Spark:分布式系统性能差。如何改进>;,apache-spark,spark-dataframe,apache-spark-mllib,Apache Spark,Spark Dataframe,Apache Spark Mllib,我编写了一个简单的Spark程序,并希望将其部署到分布式服务器上。这很简单: 获取数据->整理数据->培训数据->重新申请查看培训结果 输入数据只有10K行,有3个特征。 我首先在本地机器上运行,使用“local[*]”。它运行大约3分钟。 现在,当我部署到集群时,它运行得非常慢:半个小时没有完成。它在训练阶段变得非常缓慢 我很好奇,如果我做错了什么。请帮我查一下。我使用Spark 1.6.1 我提出: spark-submit --packages com.databricks:spark-c

我编写了一个简单的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个小时,还没有完成。我相信数据只有几兆字节。

您正在构建一个由1000棵随机树组成的随机森林,它将训练1000个实例


在代码中,collectAsMap是第一个操作,而其他所有操作都是转换(是惰性计算的)。所以,当您看到它挂在那条线上时,这是因为现在所有的
映射、平面映射、过滤器、groupBy、
等都被评估了。

您在集群中使用了多少执行器?您是否尝试过增加执行器内存,或者您是否考虑过在集群中花费更多时间的阶段?--驱动程序内核1--驱动程序内存4g--执行器内核8--执行器内存4g。实际上,这个文件只有180M,所以内存应该足够了。它处于训练阶段。在决策树训练中,当您指定执行器核心和内存时,看起来并没有指定执行器的数量。为了帮助调试,可以尝试使用
--num executors 1
2
。这看起来不像是洗牌或任何事情会让事情变慢,但这取决于默认情况下使用了多少执行器。谢谢,我添加了--num executors 1。因为这是一项非常简单的工作,所以1就足够了。我发现它停在“RandomForest的collectAsMap.scala:525”上,但为什么它如此耗时呢?