【发布时间】:2017-09-21 14:31:33
【问题描述】:
您好,我正在比较我的 Spark 算法在两个不同集群上的性能。一种具有更高的计算能力,另一种具有更高的内存效率。
- 集群 1 有 5 个 AWS 实例节点 c4.xlarge 和 4 个 vCPU 和 7.5GiB 的主内存。
- 集群 2 有 5 个 AWS 实例节点 r4.xlarge,具有 4 个 vCPU 和 30.5 GiB 的主内存。
我的代码分为 13 个阶段,但实际上只有最后 5 个阶段是我需要处理的性能。下面这五个:
上图显示了在集群 2 上运行我的代码阶段的统计数据(内存效率),您可以看到阶段 11 和 13 需要几分钟,因为 flatMap 和 map 分别在列表上做一些繁重的顺序工作。
由于作业阶段 11 和 13 在每个分区中是连续的,我希望使用集群 1(计算效率)为这两个阶段获得更好的性能,但我在集群 1 上运行时实际得到的是最后 3 stage 只运行 32 个任务(所以只有 32 个分区)并且运行时间比较慢,比如每个 stage 多 2 分钟。
我意识到只有 3 个执行程序在运行,所以实际上 4 个实例中只有 3 个在处理我的问题。然后我所做的就是以这种方式提交应用程序:
spark-submit --master yarn --deploy-mode cluster —-num—executors 4 --executor-cores 4 --class myclass myjar myparams
所以我认为强制执行器的数量为—-num—executors 4 会强制第 4 个节点获得一个执行器但无事可做。那也没有用。只有 3 个执行者在 3 个实例上处于活动状态。
我确定问题是这个。您不认为顺序阶段应该在集群 1 上运行得更快吗?根据您的说法,集群 1 的主内存较少的问题是什么?
感谢您与我合作寻找答案。
【问题讨论】:
标签: amazon-web-services apache-spark mapreduce rdd distributed-computing