type
status
date
slug
summary
tags
category
icon
password
本文写作于 2025 年 8 月,截止到写作时间点为止,AWS考试体系中涉及数据工程的有DEA、MLA、MLS、SAP四部分。
本文知识不代表DEA考试所需的所有考点,很多时候只是罗列了一些我认为比较重要的内容。
本文内容的正确性与非过时性都经过了GPT-5核查,但我无力随时更新这个总结,随着AWS技术本身的演进,其中的一些说法难免会和事实出现偏差,阅读时请注意这一点。
1. 数据接入 ——Kinesis Data Streams(KDS)
- 关键词:实时性
- 数据保持
- 数据最多保留 365 天
- 可以重放数据流
- 一旦数据进来了则不可变,无法删除,必须等过期
- KDS 是 Region 级服务,分片位于 AZ 内,KDS 到 VPC 内 EC2 的流量使用 VPC 终结点提供的 HTTPS,静态数据使用 KMS 加密
- 数据分片
- 分片由唯一 ID(shardId)标识,并有固定的哈希键范围,Partition Key 经过哈希后落在哪个范围,就进入对应分片
- 进入 KDS 的数据,由分片 Key 和二进制数据组成,从 KDS 读取的数据,由分片 Key、位置和二进制数据组成
- 分片数决定流量,假设每秒有 6M 数据流入,则需要 6 个分片支撑生产端,每个消费者可以按照 2M/s 的速度读取数据
- 当数据传入 KDS 时可以增加一个 Partition Key 在消息之间共享,同一个 key 的消息会进入同一个分片
- 分片扩容问题
- 假设有 1、2、3 三个分片,其中 2 中的数据量很多,那么可以把 2 的数据分别写入 4、5 分片,分片 2 将在数据过期后消失,这样就有了 1、4、5、3 分片,吞吐量得到了增加,这就是分片的分裂。同样,可以通过合并分片的方式减少成本
- 为了防止在分片过程中读取顺序发生混乱,建议首先读取老分片直到读完,再去读新分片的数据,KCL 已经内置了这种逻辑
- 大量分片数的扩展、缩小是相当耗时的,建议提前规划容量,并考虑自动扩容
- 数据重复问题
- 在生产端,KDS 不会自动去重,有时候因为 KDS 返回给客户端的 ACK 由于网络超时没有到达,数据会发送第二次,导致 KDS 中重复写入数据。解决方法是在数据内部添加唯一 ID
- 在消费端,可能由于分片扩展等多种因素导致客户端读取两次数据,没有很好的解决办法,建议让程序本身保持幂等性,以及在数据库级别进行重复对应
- 生产消费模式
- 生产端
- 生产者
- 在服务器上安装的 Kinesis Agent
- 程序里的 SDK,复杂编程下的 KPL
- 第三方库,如 Spark 和 Kafka 写入
- SDK
- 生产端 SDK 存在 PutRecords API 进行同步发送,会立刻发送数据,适合 IoT 这种无法容忍发送延迟或批量失败的情况
- KPL 客户端
- 是个 Java/C++ 库,分为同步和异步 API
- 可以直接发送指标,以便 CloudWatch 随时监控它
- 它支持两种批处理机制并且默认开启,具体的参数可以配置
- 支持将多条用户记录聚合成一条 Kinesis Record(Aggregation)
- 支持将多条 Kinesis Record 在一次 Put 请求中批量发送(Batching)
- KPL 不支持数据压缩,必须手动实现,并在 KCL 里手动解压
- Agent 内部使用的是 KPL
- 当写入超过负载时的对策
- 采用指数退避方式重发
- 增加分片数量
- 检查 Partition 不合理导致的数据倾斜
- 消费端
- 消费者
- 程序里的 SDK,复杂编程下的 KCL
- 整合 Firehose、Lambda 等服务
- 第三方库,如 Spark
- 吞吐量整理
- 写入吞吐量
- 在配置模式(Provisioned Mode)下,支持 SDK 和 KPL,每个分片吞吐量 1MB/s 或 1000TPS,按分片线性叠加,KPL 只是批处理优化
- 在按需模式(On-demand Mode)下,支持 SDK 和 KPL,总吞吐量从 4MB/s 或 4000TPS 动态扩容,根据过去 30 天的使用情况自动调节
- 读取吞吐量
- 如果不开启增强扇出,支持 SDK 和 KCL,所有客户端共享每个分片 2MB/s 的总吞吐量,每个消费者会轮询多个分片,每次最多拉取 10MB 或 10000 条记录,每个分片每秒最多可以被 Get 5 次,这意味着每次 get 之间会存在 200ms 的延迟
- 如果开启增强扇出,只支持 KCL(HTTP2 实现),消费者之间不会共享 2MS/s 的总带宽,而是各有各的限制,同时 get 之间的延迟降低到 70ms,默认最多支持 20 个消费者,这个数字可以申请提高
2. 数据接入 ——Kinesis Data Firehose(KDF)
- 关键词:把数据从一个地方发送到另一个地方
- 适用场景
- 日志收集与归档(如从 CloudWatch Logs → S3)
- IoT 或 Web 应用实时事件流入数仓
- 数据落地前进行格式转换、压缩、清洗
- 将 KDS 数据实时推送到 Redshift/OpenSearch
- 数据源
- 应用程序(通过 API)
- Kinesis Data Streams(KDF 从 KDS 拉取数据)
- AWS 服务:CloudWatch Logs、IoT Core 等
- 第三方系统(通过 HTTP Endpoint)
- 目的地:
- AWS 内置目的地:
- Amazon S3(最常见,可与 Athena/Glue 配合分析)
- Amazon Redshift(通过 S3 中转加载)
- Amazon OpenSearch Service
- Amazon Splunk(实时日志分析)
- 第三方目的地:
- HTTP Endpoint
- 部分 SaaS(通过 API Gateway 或 Lambda 处理后发送)
- 数据格式支持:
- 支持 JSON、CSV、Parquet、Avro(Parquet/Avro 仅在 S3 目标中支持)
- 压缩:GZIP、ZIP、Snappy(Parquet 专用)
- 数据处理:
- 可选 Lambda 转换
- 每批最多 6MB 数据
- 转换失败的数据可进入错误输出(S3)
- 超时或异常将触发重试或落入备份
- 缓冲机制
- 基于时间:最小 60 秒,最大 900 秒
- 基于大小:最小 1MB,最大 128MB
- 注意:
- 缓冲不可完全禁用,但可将参数设到最小值以接近实时传输
- 到达时间阈值或大小阈值时立即发送数据到目的地
- 不能回放数据,流经即消费
- 错误处理与备份
- 失败重试机制:
- 最长重试 24 小时
- 超过重试窗口后仍失败的数据会直接落到 S3 备份桶
- 备份选项:
- All records:所有经过 Firehose 的数据都会备份到 S3
- Failed records only:仅备份写入失败的数据
- 吞吐量与性能
- API 写入限制:
- 单条记录≤1MB
- 批量≤500 条,且总大小≤4MB
- 默认写入速率(同步 API 调用):
- 每个交付流最高 5000TPS 或 5MB/s
- 自动扩展(异步输入时可更高)
- 延迟:
- 取决于缓冲设置(通常 60 秒~数分钟)
3. 数据接入 ——MSK(Kafka)
- 关键词:AWS 托管的 Apache Kafka 服务
- MSK 最多部署三个 AZ 实现 HA,数据存储在 EBS 上
- 可以通过配置支持传输 1MB~10MB 的消息,而 KDS 有 1MB 的硬性限制
- 在加密方面,MSK 的 Broker 之间支持通过 TLS 加密,Broker 对应的 EBS 也支持 KMS 加密,但是为了效率可以禁用
- 在认证方面,支持双向 TLS 和 SASL/SCRAM(这些不能被 IAM 策略管理,必须在 Kafka 集群里定义)
- 在监控方面,支持 CoudWatch,支持开源监控,支持 Broker Log 传输到 CoudWatch 或 S3 以及 KDS
- MSK Connect 是一个插件,用来从 Kafka 集群读取数据到 S3 等地方,按 worker 和小时数收费
- MSK Serverless 可以自动扩展,不用认为控制,但是有 558 刀的基础月费还要收流量费
4. 数据加工 ——Glue
- ETL Job
- 支持使用 Spark 进行 ETL,并且是无服务器的
- 如果 Glue 运行过慢,需要增大 DPU 数
- 错误会报告给 CloudWatch
- 可以配置为事件驱动或者按时执行
- bookmark(书签)是 Glue ETL 任务中用于增量数据处理的机制。它的作用是记录上一次 ETL 作业处理的数据位置或状态,从而在下次运行时,只处理新增或变化过的数据,而不重复处理历史数据。仅在某些源 / 目标格式和 Glue DynamicFrame 转换中有效。
- Studio(面向开发者)
- 是一个基于 Jupyter 的 IDE,适合做探索数据分析
- 可以以可视化的方式编写 ETL 流程而无需代码,可以根据流程生成 Spark 代码
- DataBrew(面向分析师)
- 以 UI 的方式做数据预处理的工具,但其背后运行的并不是 Spark 代码
- 可以做归一化、空值填充等 250 多个任务
- 支持处理 PII(个人信息)
- Data Catalog
- 数据目录工具
- 可以使用 Data Catalog 充当 Hive 中的元数据,也可以将 Hive 中的元数据导出给 Data Catalog
- Data Catalog 有分区概念,能对应 S3 的前缀(Hive 风格分区)
- Crawlers
- 可以在 S3、Redshift 或 RDS 上创建爬虫程序,将数据模式提取到 Catalog 里
- 可以定期爬取
- Data Quality
- 是一个保障数据质量的部分,如果发现数据质量违规,可以停止 job 或者发送给 CloudWatch
- Workflow
- 是一套数据处理调度工具,可以编排 Crawler → Job → Trigger 等 Glue 任务
5. 数据加工 ——EMR
- 在 EMR 中,Master Node 是控制中心,Core Node 里面装有 HDFS,Task Node 不装 HDFS,Task Node 建议使用 Spot Instance。EMRFS 是允许 EMR 直接访问 S3 存储作为持久层的文件系统实现的工具
- EMR Serverless 将自行决定执行任务的节点数,能解决 Spark 没有提前规划好内存大小导致任务失败的问题,可以设定初始和最大情况下的 Capacity
- EMR Serverless 并没有公开底层架构,但是有 EMR on K8S 的选项
- EMR Serverless 和 S3 之间的通信可以强制使用 TLS 加密
6. 数据存储
- Redshift
- 数据加载
- S3→Redshift:支持自动加载(包括 COPY 命令批量导入),可在导入时解密文件
- Aurora→Redshift:支持 Zero-ETL 自动同步数据
- PostgreSQL→Redshift:可通过 DBLINK 连接并直接查询 / 导入数据
- 支持批量从 S3 导入数据(效率高、可并行处理),支持数据解密、压缩格式(GZIP、BZIP2 等)解析
- 数据分散风格
- AUTO:让 Redshift 自动选择并动态调整分布方式(推荐)
- EVEN:按行均匀分布到所有节点
- KEY:按指定列的哈希值分布,减少连接时的跨节点传输
- ALL:将小表完整复制到所有节点,适用于频繁 JOIN 的小型维度表
- VACUUM 的类型
- VACUUM FULL(默认):回收所有被删除的行并重新排序
- VACUUM DELETE ONLY:仅回收被删除行的空间
- VACUUM SORT ONLY:仅重新排序,不回收空间
- VACUUM REINDEX:重新生成索引并排序(很少使用)
- 查询与视图
- 物化视图(Materialized View)
- 保存查询结果及中间数据,提高查询速度
- 存在数据同步延迟,需要手动 REFRESH 或启用 AUTO REFRESH
- 联合查询(Federated Queries)
- 从 Redshift 查询外部数据库(PostgreSQL、Aurora 等)
- 通过外部表(External Table)使用外部数据
- 要求目标数据库与 Redshift 在同一 VPC 或通过 VPC Peering 连接
- 使用 Redshift 自身的计算资源
- 开发与集成
- Lambda 函数集成
- Lambda 可作为 Redshift 的 UDF(用户自定义函数)或过程调用
- Redshift Data API
- 基于 HTTPS 的 SQL 执行接口,无需 JDBC/ODBC 驱动即可从任意地方执行 SQL
- 适合无持久连接环境(如无服务器应用)
- LakeFormation
- 概述
- 基于 Glue 之上构建的数据湖管理服务,可快速在 S3 上搭建数据湖
- 统一管理数据的存储、访问权限、治理与安全
- 数据导入与存储
- 支持从多种数据源导入(RDS、DynamoDB、本地文件、流数据等)
- 数据会被同步 / 导入到 Amazon S3
- 自动执行数据压缩和格式转换(如 CSV → Parquet/ORC)以节省空间和提升查询性能
- 查询与集成
- 数据湖中的数据可直接通过 Amazon Athena、Amazon Redshift Spectrum、EMR/Spark 等查询
- 与 Glue Data Catalog 紧密集成,元数据统一管理
- 数据治理与安全
- Governed Tables(受管表)
- 提供 ACID 事务支持,解决多用户并发写入冲突
- 支持时间旅行(Time Travel)与回滚操作
- 细粒度访问控制
- 基于 IAM 和 Lake Formation 权限模型,支持列级访问控制
- 使用数据过滤器(Data Filter) 实现行级访问控制
- 列级与行级结合,可精确到单元格级别控制访问
7. 数据查询
- Apache Flink(MSAK) / Kinesis Data Analysis(KDA)
- 是流处理框架,数据源:KDS、MSK(Kafka),不支持 KDF
- KDA 的 for SQL 的服务,可以写 SELECT STREAM 语句读取 KDS 缓冲区里的内容,也可以结合 Lambda 把数据发送到任何地方,它正在被 Flink 取代,相比之下 Flink 是无服务器的,也可以使用表 API 做同样的事情
- QuickSight
- 是个基于用户收费的 SaaS 服务,支持探索机器学习的维度,比如用随机砍伐森林找离群点
- QuickSight 可以在查询时在分析视图中派生字段,并能基于查询引擎 SPICE 或直接查询数据源来做聚合、窗口函数等
- Athena
- 性能优化建议
- 推荐使用 ORC 或 Parquet 格式以获得更高性能和更低成本
- 文件组织上建议少量大文件优于大量小文件,以减少扫描开销
- 核心功能
- CTAS(CREATE TABLE AS SELECT):可直接读取 S3 数据并根据查询结果创建新表(原表的子集),查询结果会写入新的 S3 位置
- 工作组(Workgroups):控制查询权限,设置数据扫描量配额,限制和监控查询成本
- Iceberg 支持(ACID 特性)
- Iceberg 是一个不改变底层存储的数据表元数据层
- 作用:让数据湖具备数据仓库的管理特性,分离数据与元数据,保证不可变性与版本控制
- 架构位置:位于 Glue(Spark)与 S3/Data Catalog 之间,Athena 建表时可选择 Iceberg 作为底层元数据实现,Data Catalog 只是 Iceberg 的后端之一
- 在 Jupyter Notebook 中运行 Athena 查询时,可选择 Athena SQL 或 Spark SQL 作为底层执行引擎
- 跨源数据访问
- 通过 Data Source Connectors 连接 RDS、CloudWatch 等数据源
- 支持自定义 Connector,实现对 BigQuery 等第三方数据源的查询
8. 数据迁移
- Application Discovery Service
- 在迁移前发现和分析本地应用与服务器信息
- 分为有无 Agent 两种发现方式
- 无代理方式提供关于虚拟机的信息,比如配置、历史性能记录,CPU 内存硬盘等
- 代理模式能获取更多信息,比如运行的进程、网络连接等信息
- 可以通过 AWS Migration Hub 服务集中观察这些信息,来发现你真正需要搬运上云的服务,以及它们是怎么联系的
- MGN(Application Migration Service)
- 将本地服务器迁移为 AWS 上的 EC2
- 做法是在本地机房安装 MGN 代理,它会拷贝机器生成 EC2 和 EBS 卷
- DMS(Database Migration Service)
- DMS 数据库迁移服务保证数据库在迁移时可用
- 支持同构和异构数据库迁移
- 异构迁移需配合 SCT(Schema Conversion Tool)转换架构
- 支持 CDC(Change Data Capture)捕获实时变更
- DMS 支持多 AZ 部署提供弹性
- DataSync
- 跨机房或异构系统迁移时需要 DataSync Agent
- AWS 内部(S3、EFS、FSx 等)迁移无需 Agent
- 可以定义按时间计划同步数据
- 保留文件的元数据(权限、时间戳等)
- Transfer Family
- 把数据以 FTP 协议形式传输到 S3、EFS
- 让 Route53 给 Transfer Family 提供一个 DNS,让用户通过它访问