2. AWS数据平台架构与可观测性挑战

要谈可观测性,先要把“被观测的对象”画清楚。AWS 数据平台很少是单一服务,而是由存储、计算、编排、消息、权限与网络共同拼装出的数据流系统。典型组合是:Kinesis Data Streams 或 MSK 承接实时事件,Lambda 做轻量转换,Glue 做批式 ETL 与元数据编目,EMR 跑 Spark 重计算,S3 作为数据湖底座,Redshift 承担数仓查询,Step Functions 或 Airflow(MWAA)负责编排。可观测性难点恰恰来自这些组件“各管一段”:每个服务都有自己的日志、指标和追踪,但数据从一端流到另一端时,责任边界和观测边界并不重合。

典型数据流与观测点分布

下面这张图把一条“流批一体”的典型链路展开,标出每一跳的观测载体与最容易出现的盲区。注意图中“观测点”指的是该环节原生可采集的信号,而不是已经配置好的告警。

AWS 数据平台典型链路:数据流(上)与观测信号(下) Kinesis / MSK 事件接入 Lambda 轻量转换 Glue ETL 批式清洗 EMR Spark 重计算 S3 数据湖 分区存储 Redshift 数仓查询 编排层:Step Functions / MWAA 调度、依赖、重试、SLA 触发 各环节原生观测信号与盲区 Kinesis / MSK IncomingRecords WriteProvisionedThroughput IteratorAge(消费延迟) 盲区:分区热点 盲区:消费组位点 Lambda Invocations / Errors Duration / Throttles ConcurrentExecutions 盲区:冷启动占比 盲区:下游超时归因 Glue / EMR JobRunState / DPU 使用 Spark Stage 重试 Shuffle 读写量 盲区:数据倾斜 盲区:小文件膨胀 S3 BucketSizeBytes NumberOfObjects 5xx / 4xx 错误率 盲区:分区新鲜度 盲区:跨账户访问 Redshift QueryDuration WLM 队列等待 DiskSpaceUsed 盲区:长事务锁 盲区:COPY 失败静默

批流一体带来的观测语义冲突

批处理与流处理的“健康”定义不同。批任务关心的是“这一轮是否在 SLA 前完成、产出分区是否完整”,流任务关心的是“消费延迟是否持续增长、是否有数据积压”。当两者共用同一套 S3 数据湖时,问题就出现了:Glue 作业写入的分区,可能被下游 Redshift Spectrum 或 EMR 读取;如果 Glue 作业失败但未触发告警,下游看到的只是“查询结果变少”,而不是“上游失败”。这就是典型的观测语义断层——上游的失败信号没有传递到下游的消费侧。

更隐蔽的是“静默失败”。例如 Lambda 函数因为下游 S3 权限被撤销而持续报错,但 Kinesis 的 IteratorAge 仍在增长,看起来只是“消费慢”;又比如 Glue 作业成功结束,但实际写入的记录数为 0,JobRunState 显示 SUCCEEDED,而数据质量指标无人校验。可观测性工程在这里要做的,不是增加更多仪表盘,而是建立跨服务的因果链:把“上游事件数 → 中间处理数 → 下游落库数”串成可对比的计数关系。

无服务器与多账户的观测盲区

无服务器组件(Lambda、Glue、Step Functions)把基础设施隐藏了,也把部分观测入口隐藏了。Lambda 的日志默认进 CloudWatch Logs,但每个函数的日志组是独立的;Step Functions 的执行历史保留时间有限(标准工作流 90 天,Express 工作流更短),如果不在执行时把关键状态导出,事后很难复盘。Glue 的 Spark UI 只在作业运行期间可访问,作业结束后日志中的 Stage 信息需要主动解析才能还原数据倾斜。

多账户场景进一步放大了难度。生产账户、数据账户、分析账户各自拥有独立的 CloudWatch 命名空间和 S3 桶。一个跨账户的 Glue 作业读取数据账户的 S3,写入分析账户的 Redshift,它的日志分散在三个账户中。如果没有集中化的日志归档(例如通过 CloudWatch Logs 订阅过滤到中央日志账户的 S3,再用 Athena 查询),排障时需要在多个控制台之间切换,时间成本极高。

一个实用的判断标准:如果某个数据链路的“端到端记录数”无法在 5 分钟内从单一查询中得到,那么这条链路的可观测性就存在结构性缺口。补齐的方向通常不是加监控,而是统一日志落点和统一追踪 ID。

可观测性难点归纳

场景 典型盲区 可观测性切入点
批流一体 上游失败未传递到下游消费侧 端到端记录数对比、分区新鲜度指标
无服务器 日志分散、执行历史短、冷启动不可见 结构化日志 + 追踪 ID 贯穿、日志集中归档
多账户 信号分散在多个账户,无法关联 中央日志账户、跨账户指标聚合、统一标签
消息中间件 分区热点、消费组位点不透明 IteratorAge 分片级监控、消费延迟告警
数仓加载 COPY 失败静默、长事务锁等待 STL_LOAD_ERRORS 巡检、锁等待视图监控