【发布时间】:2016-02-06 16:09:47
【问题描述】:
我在 cli 的 HDP 2.2 集群上以 YARN 客户端模式在 Spark 1.5.1 上使用 Mahout 0.11.0。我的输入大约是 325Mb,分成 1000 个部分文件。这是我调用的确切命令:
$MAHOUT_HOME/bin/mahout spark-itemsimilarity --input unit-similarity-dump/bpc1 --output mahout-cooccurrence-output4 --maxPrefs 200 --maxSimilaritiesPerItem 100 --master yarn-client --sparkExecutorMem 10g -D:spark.yarn.executor.memoryOverhead=1024 -D:spark.executor.cores=5 -D:spark.executor.instances=50 -D:spark.yarn.am.memory=4g -D:spark.yarn.am.memoryOverhead=512 -D:spark.yarn.am.cores=2 -D:spark.driver.memory=20g -D:spark.yarn.driver.memoryOverhead=2048 -D:spark.driver.cores=4 -D:spark.driver.maxResultSize=10g -D:spark.yarn.queue=product -D:hdp.version=2.2.6.0-2800
应用程序运行良好,直到最后阶段,saveAsTextFile 被调用。在这一点上,任务逐渐停止,每项任务都需要 45 分钟到一个小时才能成功。仔细观察,似乎每个任务都在读取 MapPartitionsRDD 的所有 1000 个分区,我认为,直观地说,这一定是性能问题的根源。这些分区在所有 executor 中分布均匀,因此我认为每个任务都需要从不是其直接父级的 n-1 个 executor 请求所有分区。
优化此应用程序的最佳方法是什么?更少的分区,所以需要更少的远程数据?更少的执行者,因此每个任务的本地化数据百分比更高?尝试为 RDD 强制使用更高的复制因子?现在它似乎默认为 Storage Level: Memory Deserialized 1x Replicated,100% 缓存。
为了清楚起见,这里是舞台细节的截图:saveAsTextFile stage
提前感谢您提供任何见解。
更新:
我尝试仅使用 1 个多核执行器(即任务),尽管所有 RDD 分区都存在于单个本地执行器上,但性能仍然非常缓慢。我认为剩下的唯一罪魁祸首是reduceByKey 在最终的saveAsTextFile DAG 中造成的洗牌。
第二次更新:
我也尝试只使用 1 个输入分区,而我之前使用的是 100 甚至 1000 个。结果非常相似,总结为 here。为了清楚起见,在这次运行中,我使用了一个 5 核的 20g 执行器。然而,这种方法确实导致总资源分配减少了大约一个数量级(以 MB 秒和 vcore 秒为单位衡量)。这可能是由于先前运行中执行器和线程的过度分配造成的,这意味着瓶颈可能不受计算限制。
【问题讨论】:
-
您的问题是否有进一步的更新?你修好了吗?我在使用 spark 1.6.3 和 Mahout 0.13 时遇到了同样的问题,但无法弄清楚。
标签: apache-spark mahout mahout-recommender collaborative-filtering