管理层数据依赖某一个人
汇总报表由人工从多个来源拼出来。别人无法核对,这个人休假时报表周期就会延后。
如果其中两条以上成立,问题就不在于缺一个报表工具,而在于数据没有统一的归属地,背后也没有处理管道。
汇总报表由人工从多个来源拼出来。别人无法核对,这个人休假时报表周期就会延后。
各部门从不同系统取数,算法也各不相同。会议时间花在争论哪个数字对,而不是讨论下一步做什么。
本期的决策依据的是上期的情况。这段时间差是机会成本,尽管它不会出现在任何财务报表上。
业务系统会覆盖此前的状态。当需要解释某一期的数字,或审计有此要求时,数据无法重建。
数据依次经过三层,每层有各自的可靠性等级。这种分层让您可以定位错误数字的来源,而不必把整条管道重查一遍。
数据按从源端到达的原样载入,不做任何改动。错误记录和重复记录原样保留。
为何需要这一层 当转换逻辑事后发现有误时,可以从头重新计算,无需再次向源系统索取数据。
统一数据类型,去除重复,跨来源对齐主键,并按同一套规则处理缺失值。
为何需要这一层 数据工程师和分析人员从这一层取数。一行一条记录,一个主键一个含义。
按业务主题汇总的表、预先计算好的指标,以及面向报表构建的维度模型。
为何需要这一层 报表直接从这里读取,因此打开很快。每个指标只有一个定义,且已书面确定。
这份清单上没有授权费。成本在运维,而运维正是由我们承担的部分。
数据源
数据接入
存储
数据消费
| 层 | 技术 | 作用 |
|---|---|---|
| 表格式 | Apache Iceberg | 带版本的表,可回读任意时间点的状态,变更表结构时无需重写全部数据。 |
| 存储 | 在越南境内运行的 S3 | 对象存储,与计算层分离,可独立扩容且成本低。 |
| 查询 | Trino | 对对象存储中的数据执行分布式查询,并可在同一条语句中与业务数据库关联。 |
| 编排 | Apache Airflow | 调度并监控数据管道,管理各步骤之间的依赖,失败的步骤可单独重跑而无需全部重来。 |
| 转换 | dbt | 转换逻辑用 SQL 编写,在 git 中管理,配有数据测试和自动生成的文档。 |
| 元数据 | PostgreSQL | 存放表目录、运行历史、数据质量日志和管道配置。 |
| 处理 | Rust 与 Python | 大部分管道和集成工作用 Python。对性能要求高或常驻运行的步骤用 Rust。 |
| 可视化 | Apache Superset | 报表与看板,按角色和组织单位控制访问权限。 |
按每个处理步骤的特点选择语言,而不是所有环节都用同一种语言。
Python 拥有最广的数据类库生态,贵公司的技术团队通常已经熟悉它。数据接入管道、集成工作和大多数转换步骤都用 Python 编写。
常驻运行或处理大数据量的步骤——日志文件解析、事件流规范化、长期运行的服务——用 Rust 编写,可减少服务器资源占用,并消除一类内存错误。
我们不会建议把运行良好的 Python 组件迁到 Rust。只在收益可衡量的地方使用它,并且说明其代价:会写 Rust 的工程师更难找。
数据项目失败的原因通常与技术无关:要么启动得太早,要么建得比实际需要大得多。
我们为一个确实有人在等数据的主题,建起从数据源到报表的完整管道。贵公司先看到结果,再决定是否扩展。