在 Amazon EMR Serverless 上以无服务器方式运行 Spark 作业 - 无需集群管理的大数据处理
介绍通过 EMR Serverless 执行 Spark/Hive 作业、作业运行的设计以及成本优化方法。
EMR Serverless 概述
EMR Serverless 是一项以无服务器方式运行 Spark 和 Hive 作业的大数据处理服务,可在为应用程序设置的最大容量范围内自动扩展 Worker。与需要配置实例类型、节点数和 Auto Scaling 设置的 EMR on EC2 不同,EMR Serverless 在提交作业后会自动预置资源。集群的补丁和版本升级也无需管理,可将运维精力完全集中在作业开发上。
自动扩缩容与按量计费机制
EMR Serverless 的应用程序默认在提交作业时自动启动,空闲 15 分钟后自动停止。提交作业时指定 Driver 和 Executor 的 vCPU 与内存上限,但执行过程中 Executor 数量会根据数据量增减。计费取决于作业所使用的 vCPU 和内存等资源的量。这一机制使得即使每天仅运行一次的批处理 ETL 也无需保持集群持续运行,与 EMR on EC2 维护常驻集群相比,在低利用率工作负载下更容易控制成本。
应用程序设计与 Hive 集成
EMR Serverless 的应用程序通过选择 Spark 或 Hive 运行时来创建。Spark 应用程序将 PySpark 脚本放置在 S3 上,通过作业运行执行。Hive 应用程序使用 HiveQL 脚本编写 ETL 处理,并将 Glue Data Catalog 用作元数据存储。配置预初始化 Worker 后,可避免作业启动时的冷启动。作业运行的 Driver 和 Executor 的 vCPU 和内存可分别指定,能够根据作业特性进行资源分配。将 S3 上的数据以 Parquet 格式存储并进行分区,可减少查询读取的数据量。
EMR on EC2 / Glue 的区分使用
与 EMR Serverless 类似的选项包括 EMR on EC2 和 Glue,根据工作负载特性进行选择。当需要 Serverless 不支持的功能(GPU 实例、Presto/Trino 集群)或集群利用率较高可利用预留实例折扣时,EMR on EC2 更具优势。Glue ETL 可通过可视化编辑器构建 ETL 管道,在 Data Catalog 集成和作业书签(恢复功能)方面表现突出,但对 Spark 调优参数的访问受限。判断标准:作业可通过标准 Spark/Hive 功能完成且集群利用率低时选择 EMR Serverless;需要 Spark 以外的框架(Flink、HBase)时选择 EMR on EC2;优先考虑无代码可视化 ETL 时选择 Glue。
设计最佳实践与陷阱
确保 EMR Serverless 稳定运行的三个设计要点。第一,设置应用程序的最大容量,防止意外扩展导致的成本增加。未设置应用程序最大容量时,作业因数据倾斜持续生成大量 Executor 会导致意外账单。第二,预初始化 Worker 适合作业频率较高的情况。预初始化的容量会在应用程序停止时释放。第三,使用 Iceberg 表时规划压缩策略。小文件积累会使 Spark 任务数增加,作业启动需要更长时间。将定期压缩纳入作业管道以维持查询性能。
EMR Serverless 的定价
EMR Serverless 按所使用的资源量按量计费。对于零散的批处理任务,比 EMR on EC2 的常驻集群更容易控制成本。预初始化 Worker 在空闲状态下也会计费,需根据作业频率判断是否启用。设置作业运行的资源上限以控制失控作业的成本,并通过超时自动停止。
总结
EMR Serverless 是一项无需集群管理即可运行 Spark/Hive 作业的服务。按量计费和空闲时的自动停止可控制成本,预初始化 Worker 避免了冷启动。将 Glue Data Catalog 用作元数据存储,可对 S3 上的 Parquet 数据执行 ETL 处理。设置资源上限和管理预初始化 Worker 是控制成本的要点。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。