在Spark中使用Scala将预测结果保存到HDFS表中,在纱线群集模式下非常慢



我使用Scala在Spark中构建了一个机器学习项目,并使用Spark-Submit将其启动,以" -master Yarn-Cluster"作为参数。计算步骤非常快,但是它总是陷入编写表步骤数小时。输出仅为3MB。以前有人遇到过这个问题吗?

Scala写入表代码如下

列出
mlPredictResult
  .select("orderid","prediction")
  .write
  .mode(SaveMode.Overwrite)
  .saveAsTable("tmp_sbu_vadmtestdb.AntiCF_ClickFarming_predicted")

列出了Spark-Submit代码如下

spark-submit  --class Ml_Learning --master yarn-cluster --executor-memory 5G --num-executors 50 AntiCF-1.0-SNAPSHOT.jar

在Spark中,有两种类型的命令,转换("懒惰",即仅在需要时执行它们)和操作(立即执行)。

我假设: - 计算步骤似乎很快,因为它们很懒惰。 - 写入/可保护的似乎非常慢,因为这是一种触发火花的动作,可以执行直到此时才计算的懒惰变换。

==>是由于需要在写入磁盘之前执行计算而需要大量时间写入磁盘的原因。

http://spark.apache.org/docs/latest/programming-guide.html

*rdds支持两种类型的操作:转换,它们从现有数据集创建一个新数据集,并在数据集上运行计算后,将值返回驱动程序程序。例如,MAP是一个转换,该转换将每个数据集元素通过函数传递,并返回代表结果的新RDD。另一方面,Reled是一种使用一些功能汇总RDD的所有元素的操作,并将最终结果返回驱动程序程序(尽管还有一个并行的ReledByKey可以返回分布式数据集)。火花中的所有转换都是懒惰的,因为它们不会立即计算其结果。相反,他们只记得应用于某些基本数据集的转换(例如文件)。仅当操作需要返回驱动程序程序时,才能计算转换。该设计使火花能够更有效地运行。例如,我们可以意识到,通过MAP创建的数据集将用于降低并仅返回减少的结果,而不是较大的映射数据集。*

注意:修改机器学习火花代码和/或SPARK资源可能会减少计算时间

最新更新