亚马逊AWS官方博客
宣布推出 Amazon EMR Serverless(预览版):无需管理服务器即可运行大数据应用程序
EMR Serverless 概述
成千上万的客户使用 Amazon EMR,这是一种托管式服务,用于为大规模数据分析应用程序运行 Apache Spark、Hive 和 Presto 等开源分析框架。借助 Amazon EMR,您可以在几分钟内预置任意大小的集群。Amazon EMR 会自动安装和配置您选择的框架,并提供性能优化的运行时,该运行时与标准开源兼容,但速度是后者的两倍以上。
Amazon EMR 客户可以完全控制集群配置。借助自定义集群的功能,您可以根据工作负载要求针对成本和性能进行优化。例如,您可以使用 Amazon Elastic Compute Cloud (Amazon EC2) 内存优化型实例低延迟运行 SQL 工作负载,也可以使用基于 EC2 Graviton2 的实例来提高性能。此外,您还可以使用集成在 Amazon EMR 中的 EC2 竞价型实例,以便利用 AWS 云中未使用的 EC2 容量,以高达 90% 的折扣(相较于按需价格)获得实例。如果您在 Kubernetes 上运行应用程序,则可以使用 Amazon EKS 上的 Amazon EMR,在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上运行您的 Amazon EMR 分析应用程序。
但是,优化集群来获得最优性价比要求工程师深入了解底层分析框架。此外,以最佳方式运行应用程序所需的特定计算和内存资源取决于各种因素,例如,数据处理作业的时间表和复杂性以及正在处理的数据量。当这些特征随时间变化时,您需要重新评估和重新配置集群。此外,管理员必须保护和监控集群,以确保它们符合企业安全策略。许多客户不需要这种级别的自定义和控制,他们希望以更简单的方式,使用开源框架和 Amazon EMR 性能优化运行时来处理数据。
考虑到这一点,我们构建了 EMR Serverless。借助 EMR Serverless,您可以获得在无服务器环境中运行 Amazon EMR 的所有好处。我们在构建 EMR Serverless 时考虑了以下目标:
- 提供更简单的体验 — EMR Serverless 易于使用,因为您无需配置、优化、操作或保护集群。您不必担心实例类型或集群大小,也不必担心应用操作系统更新。您只需指定要用于应用程序的框架和版本,然后提交数据处理作业即可。您仍然可以从 Amazon EMR 中获得您期望的所有优势(开源兼容性、开源版本货币和性能优化的运行时),但无需管理集群。
- 无需猜测集群大小 — 通过 EMR Serverless,无需针对不同的作业和数据大小调整集群大小。借助 EMR Serverless,您可以使用开源框架版本创建应用程序,然后向应用程序提交作业。EMR Serverless 会在处理作业的不同阶段自动添加和删除工作线程。因此,当数据量发生变化时,您不必重新进行配置,只需为作业所需的资源付费即可。您可以指定并发工作线程的最小和最大数量以及每个工作线程的 vCPU 和内存,来控制成本。
- 保留 Amazon EMR 性能优化的运行时和开源货币 — EMR Serverless 包括适用于 Apache Spark、Hive 和 Presto 的 Amazon EMR 性能优化运行时。Amazon EMR 运行时兼容 API,速度是标准开源的两倍多,因此,您的作业运行速度更快,计算成本更低。
- 与 EMR Studio 无缝集成 — EMR Serverless 包括 EMR Studio,它提供完全托管式无服务器 Jupyter 笔记本和熟悉的开源工具(例如 Spark UI 和 Tez UI),帮助您开发、可视化和调试应用程序。
- 自动细粒度扩缩 — EMR Serverless 在处理作业的每个阶段自动纵向扩展工作线程,并在不需要时缩减工作线程。您需要为从工作线程开始运行到停止期间使用的总计 vCPU、内存和存储资源付费,四舍五入到最接近的秒(最小 1 分钟)。例如,您的作业在处理作业的前 10 分钟可能需要 10 个工作线程,在接下来的 5 分钟内需要 50 个工作线程。使用细粒度弹性伸缩,您只需为 10 分钟内 10 个工作线程及 5 分钟内 50 个工作线程付费即可。因此,您不必为未充分利用的资源付费。
- 应对可用区故障的弹性 — EMR Serverless 是一项区域性服务。当您向 EMR Serverless 应用程序提交作业时,该应用程序可以在区域的任何可用区中运行。作业在单个可用区中运行,以免跨可用区的网络流量对性能造成影响。如果可用区受损,则提交给您的 EMR Serverless 应用程序的作业将自动在另一个(运行状况良好)可用区中运行。在私有 VPC 中使用资源时,EMR Serverless 建议您为多个可用区指定私有 VPC 配置,以便 EMR Serverless 自动选择运行状况良好的可用区。
- 启用共享应用程序 — 向 EMR Serverless 应用程序提交作业时,您可以指定该作业必须使用的 AWS Identity and Access Management (IAM) 角色,以便访问 AWS 资源,如 Amazon Simple Storage Service (Amazon S3) 对象。因此,不同的 IAM 主体可以在单个 EMR Serverless 应用程序上运行作业,且每个作业只能访问允许 IAM 主体访问的 AWS 资源。这样,您可以设置以下场景:具有预初始化工作线程池的单个应用程序可供多个租户使用,其中每个租户可以使用不同的 IAM 角色提交作业,但使用预初始化工作线程的公共池立即处理请求。
- 启用交互式应用程序 — 允许数据科学家和分析师运行 SQL 查询和脚本以进行数据探索的交互式应用程序需要对用户请求快速响应。对于此类应用程序,EMR Serverless 允许您预初始化工作线程池。您可以在用户启动应用程序后,启动 EMR Serverless 应用程序并预初始化工作线程池,然后,在没有交互式用户处于活动状态时,停止应用程序以停止工作线程。如果处理用户请求所需的工作线程多于预初始化的工作线程,则 EMR Serverless 会自动添加更多工作线程,直至达到您指定的最大并发限制。因此,通过控制要预初始化的工作线程数量和最大并发工作线程数量,您可以优化交互式应用程序的用户体验和成本。
- 轻松地从一种部署模式切换到另一种部署模式 — 为使用 EMR 集群、EKS 上的 Amazon EMR 和 EMR Serverless 的应用程序提供相同的 Amazon EMR 版本。当您使用 Amazon EMR 版本(例如使用 Amazon EMR 6.4 版本的 Spark 作业)构建应用程序时,可以选择在 EMR 集群、EKS 上的 Amazon EMR 或 EMR Serverless 上运行该应用程序,而无需重新编写应用程序。这使您能够为给定的框架版本构建应用程序,并保留灵活性,以便根据未来运营需求更改部署模式。
核心概念
在本节中,我们将讨论 EMR Serverless 中的核心概念:应用程序、作业、工作线程和预初始化工作线程。
应用程序
借助 EMR Serverless,您可以创建一个或多个使用开源分析框架的应用程序。要创建应用程序,您需要指定要使用的开源框架(例如 Apache Spark 或 Apache Hive)、适用于开源框架版本的 Amazon EMR 版本(例如,对应于 Apache Spark 3.1.2 的 Amazon EMR 6.4 版本)以及应用程序的名称。创建应用程序后,您可以向应用程序提交数据处理作业或交互式请求。
以下是您可能想要创建多个应用程序的几个示例:
- 为了使用不同的开源框架(例如 Hive 或 Spark)
- 为了在不同使用案例中使用不同版本的开源框架(例如,对新应用程序使用较新版本的 Spark,而不必升级旧应用程序)
- 为了在从一个版本升级到另一个版本时执行 A/B 测试(例如,从 Spark 2.4 迁移到 Spark 3.1)
- 为了针对测试和生产场景维护单独的逻辑环境
- 为了通过独立的成本控制和使用情况跟踪,为不同的团队提供单独的逻辑环境
- 为了从逻辑上区分不同的业务线应用程序(例如,财务和市场营销)
作业
作业是提交给 EMR Serverless 应用程序的请求,该应用程序将进行异步运行和跟踪直至完成。您可以在一个应用程序中同时运行多个作业。
工作线程
EMR Serverless 应用程序在内部使用工作线程来运行作业。根据开源框架,EMR Serverless 为每个工作线程使用默认数量的 vCPU、内存和本地存储。您可以覆盖应用程序的这些默认值。
预初始化工作线程
EMR Serverless 提供一项可选功能,可在应用程序启动时预初始化工作线程,以便在向应用程序提交作业时,工作线程可以立即处理请求。预初始化工作线程允许您为应用程序维护一个暖工作线程池,以便它提供亚秒级响应来开始处理请求。
应用于 EMR Serverless 的常见使用模式
现在,我们来看看一些常见使用场景,以及 EMR Serverless 如何为您提供简单的解决方案。
模式 #1:数据管道
数据管道是分析工作负载的支柱。数据管道的常见模式是启动集群、运行作业并在作业完成时停止集群。由于数据与计算分开,因此,每个作业的输入和输出将与集群分开保存(例如,在 Amazon S3 中)。这些步骤通常使用 Apache Airflow 等工作流程编排应用程序来自动执行。您还可以使用 AWS Step Functions 和 AWS Managed Workflows for Apache Airflow (Amazon MWAA) 等 AWS 服务来创建此类工作流程。
尽管自动执行这些步骤并不复杂,但数据工程师必须花时间确定合适的 EC2 实例和集群大小。他们必须确定运行集群的可用区,并处理故障转移。他们在采用操作系统更新时,必须测试其应用程序。当数据大小随时间变化时,他们必须调整集群的大小,或使用诸如 Amazon EMR 托管扩缩之类的功能来自动调整集群大小。EMR Serverless 提供了更简单的解决方案,让您无需处理这些场景。您只需为应用程序选择开源框架和版本,然后提交作业即可。您不必担心实例选择、集群大小、集群启动、集群大小调整、停止节点、可用区故障转移或操作系统更新等问题。
模式 #2:共享集群
另一个常见模式是团队使用长时间运行的共享集群来运行多个作业。在这种情况下,工程师会在 Apache YARN 中为公共集群上的不同工作负载实施队列,并设置规则,以根据总体工作负载自动扩展或缩减集群。借助 EC2 上的 Amazon EMR 集群,您可以使用 Amazon EMR 托管式扩缩,这是一项功能,可根据工作负载自动扩展或缩减集群。使用 EMR Serverless,在需要时为每个作业分配工作线程,这样您的作业就可以获得所需的资源。此外,由于您只需为作业所需的工作线程付费,因此,不会因过度预置的资源而产生成本。最后,由于每个作业都可以指定在运行作业时用于访问 AWS 资源的 IAM 角色,因此,您不必设置复杂的配置来管理队列和权限。
模式 #3:交互式工作负载
第三个使用模式是团队保留一组实例以支持交互式分析。在这种情况下,集群将使用等待交互式用户请求的应用程序进行设置和初始化。应用程序经过预初始化,以便它们立即开始处理用户请求并提供交互式用户体验。EMR Serverless 支持此场景,无需您管理集群。您可以指定在启动 EMR Serverless 应用程序时要预初始化的工作线程数量。随后,当用户提交请求时,可以使用预初始化工作线程立即处理用户请求。如果处理用户请求所需的工作线程多于您选择的预初始化工作线程,则 EMR Serverless 会自动添加更多工作线程(不超过您指定的最大并发限制)。处理完请求后,EMR Serverless 会自动恢复为维护您指定的预初始化工作线程。您可以通过控制何时启动和停止 EMR Serverless 应用程序,来控制预初始化工作线程何时处于活动状态。例如,您可以在用户开始交互式分析时启动应用程序,在没有用户请求且应用程序处于空闲状态时将其关闭。
演示
结论
在本文中,我们讨论了 EMR Serverless 的核心概念和常见使用模式,并向您展示了一个简短的演示视频。EMR Serverless 提供预览版,您可以注册预览版,以便通过 API、AWS Command Line Interface (AWS CLI) 和 SDK 来运行使用 Spark 3.1.2 和 Hive 2.0 的工作负载。 有关更多信息,请参阅 EMR Serverless 文档。
关于作者
Damon Cortesi 是 Amazon Web Services 的一名首席开发人员支持者。
Mehul Y. Shah 是 Amazon EMR 的总经理。
Abhishek Sinha 是 Amazon Web Services 的一名首席产品经理。