问题 运行 ASW 上具有计算优化实例的 Spark 应用程序

Issues running Spark application on ASW with compute optimized instances

您好,我正在比较我的 Spark 算法在两个不同集群上的性能。一种具有更高的计算能力,一种具有更高的内存效率。

  1. 集群 1 有 5 个 AWS 实例节点 c4.xlarge,具有 4 个 vCPU 和 7.5GiB 的主内存。
  2. 集群 2 有 5 个 AWS 实例节点 r4.xlarge,具有 4 个 vCPU 和 30.5 GiB 的主内存。

我的代码分为 13 个阶段,但实际上只有最后 5 个阶段是我需要处理性能的阶段。下面这五个:

上图显示了 运行 在集群 2 上运行我的代码的阶段统计(内存效率)你可以看到第 11 和 13 阶段需要几分钟,因为 flatMapmap 分别在列表上做一些繁重的顺序工作。

由于作业阶段 11 和 13 在每个分区中都是顺序执行的,因此我希望使用集群 1(计算效率)为这两个阶段获得更好的性能,但是当 运行集群 1 是最后 3 个阶段 运行 只有 32 个任务(因此只有 32 个分区)并且 运行ning 时间较慢,每个阶段多 2 分钟。

我意识到只有 3 个执行者 运行ning 所以实际上 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 的主内存较少是问题吗?

感谢您配合我寻找答案。

在 EMR 上以最佳方式使用资源需要一些配置调整以及一些关于 YARN 工作原理的知识。我强烈建议阅读 Cloudera 的 this blog post,以大致了解如何使用 YARN 调整您的应用程序。

无论如何,在这种特殊情况下,您只看到 3 个执行程序而不是 4 个执行程序的原因是因为您指定每个执行程序应该有 4 个核心(带有标志 --executor-cores 4)。由于每个工作人员只有 4 个核心可用,并且由于 YARN 将其中一名工作人员的 1 个核心提供给 运行 应用程序管理器,因此您基本上只有 3 个工作人员有 4 个可用核心和 1 个工作人员有 3 个可用核心。具有 3 个可用核心的 worker 不能 运行 需要 4 个核心的执行器,因此该 worker 上根本没有声明执行器。这给你留下了 3 个执行者。

无论如何,上述博客post对此进行了详细描述:)

哦,至于哪种类型的集群 运行 更快,你必须测试一下。我遵循你的理论思维,但我早就放弃了尝试预测哪种类型的集群更适合特定任务。事实是,除非完全理解 Spark 如何创建它的执行计划,否则您基本上只是在猜测。我建议您测试不同的实例类型并使用 Ganglia 来监控您的集群如何利用不同的资源。