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