performance - 在spark中使用scala将预测结果保存到HDFS表中在yarn-cluster模式下非常慢

标签 performance scala apache-spark machine-learning hdfs

我使用scala在spark中构建了一个机器学习项目,并使用spark-submit以“--masteryarn-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 中,有两种类型的命令:转换(它们是“惰性的”,即它们仅在需要时才执行)和操作(立即执行)。

我假设: - 计算步骤似乎非常快,因为它们很懒。 - write/saveAsTable 似乎非常慢,因为它是一个触发 Spark 执行延迟转换的操作,而延迟转换直到此时才计算。

==>写入磁盘需要花费大量时间,是因为在写入磁盘之前需要进行计算。

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

*RDD 支持两种类型的操作:转换(从现有数据集创建新数据集)和操作(在对数据集运行计算后将值返回给驱动程序)。例如,map 是一种转换,它将每个数据集元素传递给函数并返回表示结果的新 RDD。另一方面,reduce 是一个使用某个函数聚合 RDD 的所有元素并将最终结果返回给驱动程序的操作(尽管也有一个并行的reduceByKey 返回分布式数据集)。 Spark 中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记住应用于某些基础数据集(例如文件)的转换。 仅当操作需要将结果返回到驱动程序时才计算转换。这样的设计使得Spark能够更高效地运行。例如,我们可以意识到,通过map创建的数据集将在reduce中使用,并且只将reduce的结果返回给驱动程序,而不是更大的映射数据集。 *

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

关于performance - 在spark中使用scala将预测结果保存到HDFS表中在yarn-cluster模式下非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879660/

相关文章:

Scala 模板导入可重用 block (Play2)

javascript - 如何使用 leaflet.js 提高将大量特征插入 map 的性能

javascript - 仅在特定页面上执行 js 的最佳方式

mysql - RDS CPU 利用率高

javascript - 找出渲染项目的时间

scala - 如何在 Spark/Scala 中使用窗口函数使用 countDistinct?

使用即发即忘 Futures 进行 Scala 测试

function - 带有 =(等号)的 Scala 方法

apache-spark - 限制 Spark 应用程序获取 YARN 集群中的所有资源

java - Spark jdbc 重用连接