Amazon DEA-C01: 数据转换和处理 — 学习指南
属于 Amazon Data Engineer Associate DEA-C01 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.
该领域涵盖了用于大规模清理、转换和准备数据以进行分析和机器学习的 AWS 服务和模式。它侧重于根据数据量、延迟要求和成本限制选择合适的计算和工具(Glue、Lambda、EMR、DataBrew)。理解服务限制、作业配置选项以及数据格式和目录如何交互,对于构建可靠的增量管道至关重要。
AWS Glue ETL 作业 (Spark 和 Python shell)
Glue Spark 作业是大规模、分布式 ETL 的首选:它们在 AWS Glue 托管的 Apache Spark 上运行,使用 GlueContext,并操作 DynamicFrame 和 Spark DataFrame 类型。通过控制台或 CLI 使用作业类型 “glueetl”、workerType (G.1X, G.2X, G.4X) 和 NumberOfWorkers 进行配置;使用 CLI 启动:aws glue start-job-run –job-name my-spark-job –arguments ‘–execution-class=STANDARD’。当需要模式灵活的转换、内置转换(Relationalize、Unnest)以及自动处理半结构化数据时,请使用 DynamicFrame API(create_dynamic_frame.from_options、apply_mapping);当需要 Spark SQL、更高性能的连接或自定义 UDF 时,请使用 dyf.toDF() 将其转换为 Spark DataFrame。
Glue Python shell 作业使用作业类型 “pythonshell” 来执行轻量级脚本和控制平面任务。它们是单 DPU(1 DPU),并行性有限,最适合小型文件操作、元数据更新或编排。通过 aws glue create-job –name my-pyjob –command ‘{“Name”:“pythonshell”,“PythonVersion”:“3”}’ 进行配置,并使用 aws glue start-job-run 启动。请注意,Python shell 作业有 1 DPU 的限制——对于大型数据集,请使用 Spark。
Glue 作业书签通过跟踪先前处理过的 S3 对象和分区来实现增量处理。在作业配置中或启动运行时启用书签:aws glue start-job-run –job-name my-job –job-bookmark-option job-bookmark-enable。书签适用于使用内置连接器的基于 S3 的源;JDBC 源默认不支持书签,需要自定义水印或状态存储。
Glue 现在支持 ExecutionClass FLEX,用于成本优化、非紧急的作业。使用 aws glue start-job-run –job-name my-job –execution-class FLEX 启动,以允许 Glue 以更低的成本和更宽松的启动时间 SLA 来调度作业。将 FLEX 用于批量回填和非延迟敏感的工作负载;将 STANDARD 用于可预测的延迟。
决策标准 — 快速比较:
-
DynamicFrame vs Spark DataFrame
- 当摄取带有模式漂移的半结构化 JSON/Parquet,并利用 apply_mapping、relationalize 和 glue 转换时,使用 DynamicFrame。
- 当需要 Spark SQL 性能、复杂连接、窗口函数和第三方 Spark 库时,使用 Spark DataFrame。
- 通过 DynamicFrame.fromDF(df, glueContext, “name”) 和 dyf.toDF() 在两者之间进行转换。
-
Glue Spark vs Python shell
- 对于大型数据集上的多节点、分布式 ETL,以及大规模使用 Glue Catalog 集成时,选择 Spark。
- 对于适合 1 DPU 范围内的小型、快速任务或编排步骤,选择 Python shell。
AWS Lambda 用于轻量级转换
Lambda 非常适合由 S3、Kinesis 或 EventBridge 直接触发的事件驱动、低延迟、轻量级的转换。典型用途包括文件验证、元数据提取、小文件的 JSON 到 CSV 转换,或记录的流式处理。使用 aws lambda update-function-configuration –function-name myFunc –memory-size 2048 –timeout 300 配置内存和超时。可以使用 aws lambda put-provisioned-concurrency-config 设置预置并发,以缓解延迟敏感的流式管道的冷启动问题。
请注意 Lambda 用于数据处理的限制:最大执行时间 15 分钟、内存 10 GB (10,240 MB),以及仅 512 MB 的临时 /tmp 存储。对于更大的文件处理,可以采用链式处理(拆分文件)、暂存到 S3 并调用 Glue 或 EMR 作业,或使用 AWS Step Functions 进行多部分处理。使用环境变量进行少量配置,并使用严格授予最小权限的 IAM 角色策略。
决策标准 — 何时选择 Lambda:
- 当每次调用的处理都符合 15 分钟、10 GB 内存和 512 MB /tmp 的限制,并且需要亚秒到秒级的延迟时,使用 Lambda。
- 避免将 Lambda 用于大型、长时间运行或内存密集型的重度转换;应改用 Glue Spark 或 EMR。
用于大规模处理的 Amazon EMR
当需要集群级别的控制、自定义引导操作或专用库时,EMR 是进行可定制化、大规模大数据处理(Spark、Hadoop、Presto、Flink)的首选方案。可通过 CLI 使用 aws emr create-cluster 创建集群,并选择 --instance-groups 或 --instance-fleets。实例舰队(Instance fleets)提供了灵活的实例类型组合以及 Spot 实例和按需实例的搭配;实例组(instance groups)是更简单的固定大小分组。
需要考虑的 EMR 集群模式:
- 瞬态集群:使用
--auto-terminate启动并提交步骤,这样当步骤完成时集群就会终止。这有利于成本控制,但临时的 HDFS 和本地状态将在终止时丢失。 - 长期运行的集群:不自动终止;用于交互式工作负载、持久化 HDFS,或当许多小作业能从 JVM 预热中受益时。如果预计集群会终止,请将关键数据持久化到 S3 或由 EBS 支持的 Hadoop 存储中。
配置示例:
- 实例组 CLI:
undefined
- 实例舰队 CLI 使用
--instance-fleets,通过按需/Spot 分配和多种实例类型来实现弹性和成本优化。
当您需要对 Hadoop 生态系统组件的完全控制、自定义引导脚本或用于存储中间数据的持久化 HDFS 时,请使用 EMR;否则,对于与 Glue Data Catalog 集成的托管式 Spark ETL 而言,Glue Spark 更为简单。
Glue DataBrew 与可视化转换
Glue DataBrew 是一款可视化的、无代码/低代码工具,用于数据探查、清洗和转换,其目标用户是需要进行交互式操作的数据分析师和工程师。您可以从 S3 或 Glue Catalog 创建数据集,在控制台中构建一个转换“配方”(recipe),在样本数据上进行预览,然后运行作业以大规模应用该配方。可以调度 DataBrew 作业,或通过 CLI 使用 aws databrew start-job-run --name my-databrew-job 来运行它们。
DataBrew 针对数据准备任务进行了优化,例如标准化、去重、类型转换以及使用内置函数进行列级转换。它与 Glue Catalog 集成,并将输出写入 S3。当业务用户需要自助式数据清洗和快速探查时,应选择 DataBrew;对于繁重的转换逻辑、复杂的联接或非常大的数据集,则首选 Glue Spark 或 EMR。
可视化转换与基于代码的转换之比较:
- Glue DataBrew
- 优点:快速探查、基于配方、非编码人员可以构建管道、集成调度。
- 缺点:不适用于非常大或高度复杂的分布式联接以及自定义库。
- Glue Spark / EMR
- 优点:完全的编程控制、能处理海量数据集、支持第三方库。
- 缺点:需要开发人员技能和更多的配置。
常见陷阱与决策标准
- 假设 Glue 作业书签对 JDBC 源有效 —— 书签只跟踪 S3 对象/分区的状态;对于 JDBC 增量加载,应使用水印列、变更数据捕获 (change-data-capture),或将进度存储在 DynamoDB/S3 中。
- 将瞬态 EMR 集群当作有状态系统对待 —— 瞬态集群在步骤完成后会终止并丢失 HDFS;应将中间数据持久化到 S3 或使用 EBS 卷进行持久存储。
- 忽略流处理管道中的 Lambda 冷启动问题 —— 冷启动会增加延迟;对于关键路径,可通过预置并发来缓解,或对于严格的低延迟要求,使用长期运行的计算资源。
- 在 Glue Python shell 中运行大规模转换 —— Python shell 作业限制为 1 个 DPU;对于大型数据集,应使用 Glue Spark 作业,并配置合适的
workerType/NumberOfWorkers。 - 错误配置 EMR 实例类型:为实现成本效益和灵活性,应选择实例舰队并使用 Spot 实例;当需要可预测的实例构成时,应使用实例组。
- 对紧急工作负载过度使用 Glue Flex —— FLEX 会降低成本,但可能会延迟启动时间;对于需要可预测启动和执行时间的工作,应使用 STANDARD。
实践问题:用例场景
AcmeRetail 公司需要处理夜间的点击流 Parquet 文件,将其整合到一个统一的客户活动表中,并希望采用增量处理方式,以避免重处理数月的数据,同时为非紧急的回填任务保持低成本。
- 使用 S3 分区布局(例如
year=/month=/day=),并在 Glue Data Catalog 中注册数据集。 - 创建一个 Glue Spark 作业 (glueetl),该作业使用
DynamicFrame.from_catalog读取数据以获得模式灵活性,应用映射,为进行复杂联接而转换为 DataFrame,然后将分区后的 Parquet 写回 S3。 - 为夜间运行启用 Glue 作业书签 (
job-bookmark-enable),以便只处理新的分区;对于 JDBC 数据扩充源,应实现持久化在 DynamoDB 中的水印列,以跟踪已处理的最大时间戳。 - 对于常规的夜间运行,使用
ExecutionClass=STANDARD;对于非紧急的历史数据重处理,提交运行时使用--execution-class FLEX以节省成本。 - 使用 CloudWatch 指标进行监控,并为作业失败设置告警;对于超大规模或需要自定义库的场景,可考虑使用 EMR 瞬态集群,该集群将中间结果写入 S3 并自动终止。
基本原理:该方法利用 Glue 的托管式 Spark 进行可扩展的转换,使用 DynamicFrames 处理半结构化输入,利用作业书签实现 S3 的增量处理,并使用 FLEX 降低回填成本——从而在成本、可靠性和运维简易性之间取得了平衡。
← 数据编目和元数据管理 · 所有领域 · 数据编排和工作流管理 →
练习这些题目 → · 在 ExamRoll.io 上限时练习 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
通过考试 →