使用亚马逊 EMR Serverless 上的 亚马逊云科技 Graviton2 将 Spark 工作负载的性价比提高多达 27%

Amazon EMR Serverless 是 Amazon EMR 中的 一个无服务器选项,它允许使用 Apache Spark 和 Hive 等开源分析框架轻松运行应用程序,而无需配置、管理或扩展集群。

在 亚马逊云科技 re: Invent 2022 上,我们宣布支持在亚马逊 EMR Serverless 上 使用 亚马逊云科技 Graviton2 (Arm64 ) 运行无服务器 Spark 和 Hive 工作负载。 亚马逊云科技 Graviton2 处理器由 亚马逊云科技 使用 64 位 Arm Neoverse 内核定制构建,为您的云工作负载带来了性价比的显著提升。

这篇文章讨论了在 EMR 无服务器上使用 亚马逊云科技 Graviton2 运行 Apache Spark 任务时观察到的性能改进。我们发现,基于运行时间,EMR Serverless 上的 Graviton2 将 Spark 工作负载的性能提高了 10%。亚马逊云科技 Graviton2 的成本比 x86 架构选项低20%(详情请参阅 亚马逊 EMR 定价页面 ),因此 工作负载的总体性价比提高了 27%。

Spark 性能测试结果

以下图表比较了 EMR Serverless Spark 应用程序在使用 Graviton2 和不使用 Graviton2 时的基准运行时间(请注意,这些图表不是按比例绘制的)。我们观察到,与 x86 相比,查询的总运行时间提高了 10%,几何平均值提高了 8%。

下表总结了我们的结果。

Metric Graviton2 x86 %Gain
Total Execution Time (in seconds) 2,670 2,959 10%
Geometric Mean (in seconds) 22.06 24.07 8%

测试配置

为了评估性能改进,我们使用源自 TPC-DS 3 TB 规模性能基准测试的基准测试。基准测试包含 104 个查询,每个查询都按顺序提交到 EMR 无服务器应用程序。默认情况下,EMR Serverless 启用了自动和细粒度扩展。Spark 提供动态资源分配 (DRA),可根据工作负载动态调整应用程序资源,而 EMR Serverless 使用来自 DRA 的信号根据需要弹性扩展工作人员。在测试中,我们选择了预定义的 预初始化容量 ,允许应用程序扩展到默认限制。每个应用程序都有 1 个驱动程序和 100 个工作线程配置为预初始化容量,允许其扩展到最大 8000 vCPU/60000 GB 容量。启动应用程序时,默认情况下,我们使用 x86_64 来获取基准数字,使用 亚马逊云科技 Graviton2 获取 Arm64,并且该应用程序启用了 VPC 联网。

下表总结了 Spark 应用程序的配置。

Number of Drivers Driver Size Number of Executors Executor Size Ephemeral Storage Amazon EMR release label
1 4 vCPUs, 16 GB Memory 100 4 vCPUs, 16 GB Memory 200 G 6.9

性能测试结果和成本比较

让我们对基准测试进行成本比较。因为我们每次运行都使用了 1 个驱动程序 [4 个 vCPU,16 GB 内存] 和 100 个执行器 [4 个 vCPU,16 GB 内存],因此使用的总容量为 4*101=192 个 vCPU,16*101=1616 GB 内存,200*100=20000 GB 存储空间。下表汇总了成本。

Test Total time (Seconds) vCPUs Memory (GB) Ephemeral (Storage GB) Cost
x86_64 2,958.82 404 1616 18000 $26.73
Graviton2 2,670.38 404 1616 18000 $19.59

计算结果如下:

  • vCPU 总成本 =(vCPU 数量 * 每 vCPU 速率 x 作业运行时间(以小时为单位)
  • 总 GB =(配置的总内存 GB * 每 GB 小时速率 x 作业运行时间(以小时为单位)
  • 存储 = 默认情况下,20 GB 的临时存储空间可供所有工作人员使用,您只需为每个工作人员配置的任何额外存储支付费用

费用明细

让我们来看看 x86 的成本明细:

  • 作业运行时间 — 49.3 分钟 = 0.82 小时
  • vCPU 总成本 — 404 个 vCPU x 0.82 小时作业运行时间 x 每个 vCPU 0.052624 美元 = 17.4333 美元
  • GB 总成本 — 1,616 GB 内存 x 0.82 小时作业运行时间 x 每块内存 0.0057785 美元 GB = 7.6572 美元
  • 存储成本 — 18,000 GB 存储 x 0.82 小时作业运行时间 x 每存储 0.000111 美元 = 1.6386 美元
  • 额外存储空间 — 20,000 GB — 20 GB 免费套餐 * 100 名员工 = 18,000 个额外存储空间 GB
  • EMR 无服务器总成本 (x86): 17.4333 美元 + 7.6572 美元 + 1.6386 美元 = 26.7291 美元

让我们比较一下 Graviton 2 的成本明细:

  • 作业运行时间 — 44.5 分钟 = 0.74 小时
  • vCPU 总成本 — 404 个 vCPU x 0.74 小时作业运行时间 x 每个 vCPU 0.042094 美元 = 12.5844 美元
  • GB 总成本 — 1,616 GB 内存 x 0.74 小时作业运行时间 x 每块内存 0.004628 美元 GB = 5.5343 美元
  • 存储成本 — 18,000 GB 存储 x 0.74 小时作业运行时间 x 每存储 GB 0.000111 美元 = 1.4785 美元
  • 额外存储空间 — 20,000 GB — 20 GB 免费套餐 * 100 名员工 = 18,000 个额外存储空间 GB
  • EMR 无服务器总成本 (Graviton2): 12.5844 美元 + 5.5343 美元 + 1.4785 美元 = 19.5972 美元

测试表明,在基准测试中,亚马逊云科技 Graviton2可以节省27%的总体成本。

个人查询的改进和观察

下图显示了使用 Graviton2 与 x86 相比单个查询的相对速度。

我们在一些较短的查询中看到了一些回归,这对整体基准测试运行时影响不大。我们观察到长时间运行的查询可以获得更好的性能提升,例如:

  • q67 x86 的平均值为 86 秒,Graviton2 为 74 秒,运行时性能提高 24%
  • q23a和q23b分别上涨了14%和16%
  • q32 倒退了 7%;平均运行时间之间的差异小于 500 毫秒(Graviton2 为 11.09 秒,x86 为 10.39 秒)

为了量化性能,我们使用源自 TPC-DS 3 TB 规模性能基准测试的基准 SQL。

如果您正在评估将工作负载迁移到 EMR Serverless 上的 Graviton2 架构,我们建议您根据实际用例测试 Spark 工作负载。结果可能会因 预先初始化的容量 和所选工作人员数量而异。如果你想在多个处理器架构上运行工作负载(例如,在 x86 和 Arm vCPU 上测试性能),请按照 GitHub 存储库 中的演练开始一些 具体的想法。

结论

如本文所示,EMR 无服务器应用程序上的 Graviton2 持续为 Spark 工作负载提供更好的性能。Graviton2 在所有支持 EMR 无服务器的地区均可用。要查看可用 EMR 无服务器的地区列表,请参阅 EMR 无服务器常见问题解 。 要了解更多信息,请访问 亚马逊 EMR Serverless 用户 指南 以及包含 Apache Spark 和 Apache Hive 的示例 代码。

如果你想知道用例可以提高多少性能,可以试试这篇文章中概述的步骤,然后用你的查询来代替。

要在 EMR Serverless 上使用基于 Graviton2 的架构启动您的第一个 Spark 或 Hive 应用程序,请参阅亚马逊 EMR Serverless 入门 。


作者简介

Karthik Prabhakar 是 A WS 亚马逊 EMR 的高级大数据解决方案架构师。他是一位经验丰富的分析工程师,与 亚马逊云科技 客户合作,提供最佳实践和技术建议,以帮助他们在数据之旅中取得成功。

Nithish Kumar Murcherla 是亚马逊 EMR Serverless 团队的高级系统开发工程师。他热衷于分布式计算、容器以及与数据有关的一切事物。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。