数据采集与清洗:账单数据源接入、任务日志解析、数据标准化处理

做成本分析,最怕什么?

不是数据量大,也不是计算复杂。而是——数据源乱七八糟,格式五花八门,字段对不上号。

我见过太多团队,花了两周搭好分析模型,结果数据一灌进去,账单金额和任务资源对不上。查了三天,发现是时间戳差了8小时。这种坑,踩一次就够了。

所以这一章,咱们就聊聊数据采集和清洗。说白了,就是把云厂商的账单、集群的任务日志,变成一套干净、对齐、可计算的数据集。

2.1 账单数据源接入

先看账单。不同云厂商的账单格式差异很大,但核心字段是相通的。

字段类别 典型字段 说明
时间维度 账单日期、计费周期 按小时或按天粒度
资源维度 实例ID、存储桶名、卷ID 关联到具体资源
费用维度 原价、折扣、实付、单价 区分定价与折扣
用量维度 存储量、请求次数、流量 按量计费的基础
标签维度 项目标签、环境标签 用于成本分摊

我个人习惯,先把账单拉成一张宽表。不管云厂商给的是CSV、JSON还是Parquet,统一转成DataFrame结构。字段名也统一——比如AWS的LineItemType,阿里云的账单类型,我都映射成bill_type。

小技巧: 建议保留原始字段的副本,比如加一列 raw_bill_type。排查问题时,能快速对比映射是否正确。

2.2 任务日志解析

账单有了,接下来是任务日志。这里说的任务,可能是Spark作业、MapReduce任务,也可能是容器Pod。

任务日志里藏着真正的资源消耗。比如一个Spark任务,跑了3小时,用了200个vCore和500GB内存。这些信息,账单里看不到,但日志里有。

我常用的解析流程是这样的:

  1. 日志采集:从YARN ResourceManager或Kubernetes API拉取任务事件。
  2. 字段提取:解析出任务ID、提交时间、结束时间、申请资源量、实际使用量。
  3. 状态过滤:只保留FINISHED或SUCCEEDED状态的任务。失败任务不计入成本。
  4. 资源归一:把vCore·小时、GB·小时算出来。这是后续成本分摊的基础。

核心公式:

资源消耗量 = 资源规格 × 运行时长

例如:200 vCore × 3小时 = 600 vCore·小时

嗯,这里要注意。任务日志里的时间,通常是UTC。而账单里的时间,可能是本地时区。我曾经因为这个问题,对账对了一整天。后来我定了个规矩:所有时间字段,统一转成UTC+0,再存库。

2.3 数据标准化处理

数据接进来了,但还没完。标准化这一步,决定了后续分析的成败。

我把它拆成四个步骤:

  • 字段对齐:账单和日志里,都有的字段——比如时间、资源ID、项目标签——要统一命名和类型。
  • 单位统一:账单里存储单位是GB,日志里可能是MB。不统一,算出来全是错的。
  • 缺失值处理:有些任务没有打标签,或者账单里缺少实例规格。我一般用UNKNOWN填充,而不是直接丢弃。丢了数据,成本就漏了。
  • 关联键构建:这是最关键的一步。用资源ID + 时间窗口作为关联键,把账单和任务日志连起来。
避坑指南: 我曾经遇到过一个场景——同一个资源ID,在账单里是按月汇总的,但在日志里是按小时记录的。直接关联,数据膨胀了上百倍。后来我改用时间范围匹配,才解决了这个问题。

标准化之后的数据,长什么样?我给你看个例子:

| task_id | resource_id | start_time          | end_time            | vcore_hours | mem_gb_hours | cost_usd | project_tag |
|---------|-------------|---------------------|---------------------|-------------|--------------|----------|-------------|
| job_001 | i-abc123    | 2025-03-01 10:00:00 | 2025-03-01 13:00:00 | 600         | 1500         | 12.50    | data_platform |
| job_002 | i-def456    | 2025-03-01 14:00:00 | 2025-03-01 16:00:00 | 400         | 800          | 8.20     | ml_training |

你看,每一行就是一个任务,资源消耗和成本都对齐了。后续做成本分摊、趋势分析,直接拿这张表算就行。

2.4 整体流程框架

说了这么多,我画了一张图,把整个数据采集与清洗的流程串起来。你一看就明白了。

数据采集与清洗流程 云厂商账单(CSV/JSON) 字段映射与格式统一 任务日志(YARN/K8s) 日志解析与资源归一 数据标准化处理 关联宽表(账单+日志) 关键说明 • 时间字段统一为UTC+0,避免时区偏差 • 资源ID + 时间窗口作为关联键,防止数据膨胀 • 缺失标签用UNKNOWN填充,不丢弃数据

你看,流程不复杂。但每一步都有细节。数据采集与清洗,占整个成本分析工作量的60%以上。前面做扎实了,后面的分析就是水到渠成的事。

我个人建议,把清洗逻辑写成可复用的脚本,每次接入新数据源,改改配置就行。别每次都从头写一遍,那是给自己挖坑。