摘要: 只关注数据处理逻辑本身,而无需管理底层基础设施?Amazon EMR Serverless 的推出,正是为了解放数据工程师和数据分析师。本文将带你深入探讨这一革命性服务,并通过一个实际的Spark应用案例,展示如何轻松、成本高效地运行大数据作业。

一、 痛点:传统大数据集群的运维之踵

在数据驱动决策的时代,Apache Spark、Hive、Presto 等开源框架已成为数据处理的标准工具。然而,传统的部署方式(无论是自建机房还是使用云上的托管集群)都伴随着巨大的运维开销:

  1. 集群配置与调优: 需要根据 workload 选择实例类型、集群规模,并配置大量参数(如内存、核数、动态伸缩策略),技术门槛高、耗时费力。

  2. 资源管理: 集群需要持续运行,即使没有作业时,空转的节点也会产生费用,成本效率低。同时,多团队共享集群时,资源争抢问题频发。

  3. 高可用与扩缩容: 需要自行设计主节点的容灾方案,并手动处理业务高峰期的集群扩容,操作复杂且有风险。

  4. 版本与安全更新: 需要持续跟踪开源组件的版本和安全补丁,并进行复杂的升级操作,可能影响业务稳定性。

核心问题: 我们真正需要的是计算能力,而不是机器本身。能否有一种方式,让我们只提交作业代码,而无需关心底层服务器?

二、 解决方案:什么是 Amazon EMR Serverless?

Amazon EMR Serverless 是 EMR 的一项全新部署选项,它彻底改变了游戏规则。你可以将它理解为一个 “无服务器”的大数据运行时环境

核心思想: 你无需预置或管理任何集群。只需准备好你的应用程序代码(Spark、Hive 或 Presto SQL脚本),指定需要的计算框架版本,然后提交作业即可。EMR Serverless 会自动为你提供计算资源,并在作业完成后立即释放资源。

关键特性

  • 完全无需管理基础设施: 没有主节点、核心节点或任务节点需要管理。AWS负责所有底层服务器的配置、扩展、打补丁和可靠性。

  • 自动扩缩容: 每个作业都会根据其负载自动获取精确所需的计算资源。对于单个作业,它也能将任务分解并在多个 worker 上并行执行,作业完成后资源即刻释放。

  • 按需付费: 你只需要为作业实际消耗的 vCPU、内存和存储资源付费,精确到秒。没有资源空转浪费,极大优化了成本。

  • 内置高可用: 服务本身由AWS保证高可用性,你的作业会自动在多个可用区进行容错处理。

  • 多框架支持: 目前全面支持 Spark、Hive 和 Presto(Trino)三大主流框架。

三、 EMR Serverless 核心优势详解
  1. 极简运维,提升效率

    • 开发人员: 只需关注业务逻辑,使用熟悉的SDK(如Spark Submit)、Airflow DAG或AWS CLI提交作业。

    • 运维人员: 从繁重的集群管理工作中解放出来,专注于更重要的数据治理、权限管理和成本优化策略。

  2. 卓越的成本效益

    • 精准计费: 按实际使用的资源量付费,特别适合间歇性、批处理或不可预测的 workload。

    • 无闲置成本: 作业一结束,计费就停止,彻底消除集群空转费用。

    • 资源预置: 对于稳定流量的场景,仍可选择配置预置容量以获取折扣,灵活兼顾成本与性能。

  3. 自动弹性,性能无忧

    • 作业会根据数据量大小自动申请合适的执行资源(Worker数量),无需人工干预。即使在处理海量数据时,也能快速获得大量计算资源,处理完成后迅速收缩。

  4. 开箱即用的集成

    • 与AWS生态系统无缝集成,可以轻松从Amazon S3读取数据,将结果写回S3、Amazon Redshift或任何其他数据目标。

    • 可与AWS Glue Data Catalog集成,实现元数据统一管理。

    • 通过AWS IAM进行精细的权限控制。

四、 实战演练:使用 EMR Serverless 运行一个PySpark作业

让我们通过一个简单的例子,将一份存储在S3上的JSON数据文件进行ETL处理,并输出处理后的结果到另一个S3路径。

场景: 统计S3上某个日志文件中,不同响应码出现的次数。

步骤1: 准备工作

  • AWS账户: 确保你有一个AWS账户,并具有操作EMR Serverless、S3和IAM的权限。

  • S3存储桶: 创建两个S3存储桶,一个用于存放应用程序代码(如JAR包或Python文件),另一个用于存放输入数据和输出结果。

  • IAM角色: 创建一个EMR Serverless服务角色(用于EMR服务本身调用其他AWS资源)和一个作业运行时角色(用于作业在执行时访问S3等资源)。

步骤2: 创建EMR Serverless应用程序

  1. 登录AWS管理控制台,进入EMR服务页面。

  2. 选择 “EMR Serverless”,点击 “创建应用程序”

  3. 填写应用程序名称,例如 my-first-spark-app

  4. 选择 “Spark” 作为类型,并选择一个Spark版本(如Spark 3.3.0)。

  5. 其他配置(如初始容量、网络)可暂时保持默认,点击 “创建应用程序”

步骤3: 编写PySpark代码(response_code_analysis.py

from pyspark.sql import SparkSession
import sys

def main():
    # 输入和输出路径通过参数传递
    input_path = sys.argv[1]
    output_path = sys.argv[2]
    
    # 创建SparkSession
    spark = SparkSession.builder.appName("ResponseCodeAnalysis").getOrCreate()
    
    # 从S3读取JSON数据
    df = spark.read.json(input_path)
    
    # 展示schema和前10行数据
    df.printSchema()
    df.show(10)
    
    # 使用Spark SQL进行统计:分组计数
    df.createOrReplaceTempView("logs")
    result_df = spark.sql("""
        SELECT response_code, COUNT(*) as count
        FROM logs
        GROUP BY response_code
        ORDER BY count DESC
    """)
    
    # 将结果写入S3,格式为Parquet
    result_df.write.mode("overwrite").parquet(output_path)
    
    # 打印结果到日志(可在EMR控制台查看)
    result_df.show()
    
    spark.stop()

if __name__ == "__main__":
    main()

将这段代码打包成ZIP文件(如果依赖第三方库),或直接将Python文件上传到你的S3代码桶中,例如:s3://my-code-bucket/spark-scripts/response_code_analysis.py

步骤4: 提交作业

你可以通过AWS控制台、CLI或SDK提交作业。这里以控制台为例:

  1. 在创建好的应用程序详情页,点击 “提交作业”

  2. 作业类型: 选择 Spark Submit

  3. Spark Submit 选项

    • Spark Submit 参数: 填入 response_code_analysis.py 和你的输入/输出S3路径。

--conf spark.sql.adaptive.enabled=true s3://my-code-bucket/spark-scripts/response_code_analysis.py s3://my-data-bucket/input/logs.json s3://my-data-bucket/output/

  1. 作业角色: 选择你之前创建的作业运行时角色。

  2. S3日志路径: 指定一个S3路径用于存储作业的运行日志,便于调试。

  3. 点击 “提交”

步骤5: 监控与查看结果

  • 提交后,你可以在控制台实时查看作业的状态(Running, Success, Failed)。

  • 查看Spark UI和日志来监控执行细节。

  • 作业成功后,到指定的S3输出路径(s3://my-data-bucket/output/)查看生成的Parquet文件。

五、 最佳实践与总结
  • 适用场景: EMR Serverless 非常适合批处理作业不定期运行的报表任务开发和测试环境以及资源需求波动大的场景

  • 成本优化: 利用作业标签(Tagging)进行成本分摊。对于频繁启动的短作业,可以考虑配置预置容量来减少冷启动时间。

  • 监控告警: 使用Amazon CloudWatch来监控应用程序和作业的指标,并设置告警。

总结

Amazon EMR Serverless 真正实现了大数据处理的“Serverless化”,将数据工程师和分析师从复杂的集群运维中彻底解放。它通过按需使用、按量付费的模式,在保证性能的同时,显著降低了大数据平台的总拥有成本(TCO)。无论你是初创公司希望快速搭建数据平台,还是大型企业希望优化现有数据流水线的成本和效率,EMR Serverless 都是一个非常值得尝试和采用的现代化解决方案。

现在,是时候告别集群运维的烦恼,专注于创造更大的数据价值了!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐