Amazon EMR

以托管方式运行 Apache Spark、Hive、Presto 等开源框架,实现 PB 级数据处理与分析的大数据平台

概述

Amazon EMR (Elastic MapReduce) 是一项全托管大数据处理服务,可运行 Apache Spark、Hadoop、Hive、Presto、HBase 等开源框架。除了在 EC2 实例上构建集群的传统模式外,还提供在 EKS 上运行的 EMR on EKS 以及无服务器运行的 EMR Serverless 三种部署选项。通过将 S3 作为数据湖实现计算与存储分离的架构,处理完成后即可终止集群以最小化成本。

三种部署模型与选型标准

EMR on EC2 是最灵活的选项,可以精细控制实例类型、集群配置和引导操作。适用于需要指定 Spark 或 Hive 版本、使用自定义 AMI、利用 HDFS 本地存储的场景。EMR on EKS 是在现有 EKS 集群上运行 Spark 作业的方式,可以利用 Kubernetes 的资源管理和多租户功能。适合多个团队共享同一集群并通过命名空间隔离作业的运维模式。EMR Serverless 是 2022 年 GA 的最新选项,完全无需构建和管理集群。只需提交作业,所需资源即自动配置,处理完成后释放。对于批量 ETL 和临时分析等无需常驻运行的工作负载,成本效率最高。选型参考:需要精细调优选 EC2,需要 Kubernetes 集成选 EKS,需要最小化运维负担选 Serverless。

Spark 作业优化与成本控制

在 EMR 上运行 Spark 时,对性能和成本影响最大的是实例配置和分区设计。基本做法是为 Driver 节点分配内存优先的 r 系列实例,为 Worker 节点分配成本优先的 m 系列实例。在 Worker 节点使用 Spot 实例可节省 60-90% 的成本,但需要通过实例队列指定多种实例类型以应对中断风险。Spark 的 shuffle 分区数 (spark.sql.shuffle.partitions) 应从默认的 200 根据数据量进行调整。目标是每个分区 128-256 MB,以平衡内存效率和任务并行度。从 S3 读取时,应使用 Parquet 或 ORC 等列式格式,并按日期或类别对数据进行分区以启用分区裁剪。EMR Runtime for Apache Spark 相比开源版 Spark 可实现最高 3.5 倍的加速,且无需额外费用。

数据湖架构与 Glue 的区分使用

EMR 和 Glue 都可以执行基于 Spark 的 ETL 处理,但定位不同。Glue 是无服务器的,运维负担低,集成了 Glue Data Catalog 的元数据管理和 Crawler 的自动模式发现。适用于定型 ETL 管道和需要与数据目录紧密集成的场景。另一方面,EMR 除 Spark 外还可运行 Hive、Presto、HBase、Flink 等多种框架,集群配置自由度高,适合复杂分析处理和交互式查询。实务中常见的做法是:日常定型 ETL 用 Glue 处理,临时大规模分析或机器学习预处理用 EMR 执行。构建数据湖时,标准模式是将原始数据存储在 S3 中,用 Glue Crawler 检测模式并注册到 Data Catalog,然后从 EMR 或 Athena 进行查询。在 EMR 上使用 Apache Iceberg 或 Delta Lake 等表格式,还可实现 ACID 事务和时间旅行查询。

共有するXB!