01先看全景:这是一座自来水厂目录
第 01 关全景六段水管 · 三个岗位
这座厂子没有一个叫“中台”的商品可买——它是拿 Hadoop 生态一砖一瓦拼出来的,所以每根管子接在哪、谁在管,都说得清。
先说个总印象:这套东西像一座自来水厂。
河水从城外流进来,进厂先过进水口,再一级一级净水池往下走,最后灌瓶、进城市管网、拧开你家的水龙头。
你现在看到的每一张报表、每一个页面数字,都是这条管子里流出来的水。

一、先破一个误会:这不是“买了一套中台”

很多人以为数据中台是个产品:签合同、装机、导数据,就有了。这套不是。这里没有一个叫“中台”的软件,只有一整套开源组件,被人一根线一根线接起来,接成了一条流水线。

为什么非得自己拼?因为现成的东西解决不了这三件事:

自己拼的好处很土,但很实在:口径写在表里,表挂在链路上,链路有监控。数字对不上时,能一层一层往下查到是哪张表、哪个任务、哪一天的数据。

二、拆开看:六段水管,一段一段对

整条链就六段。下面每段都按同一个格式讲:像什么、其实是什么、真名叫什么、接错了会怎样。

顺着读一遍,你就知道一个数字从源库爬到手机页面,中间被搬了几次、被改了几次。

🌊 河水(源业务系统)

像什么:城外那条河。水好不好,取决于上游谁在往里排。

其实是什么:各个业务系统自己的库,数据天生带着人家的口径和毛病,你没法要求它干净。

真名
Oracle / SQL Server 上的 CMS、EBS、BMS 等源业务系统
在哪
各业务系统自己的数据库,不归数据中台管

搞错了会怎样:把源库当查询库用,几十个场景同时连上去拉数,源库先垮,业务系统跟着停。

🚪 进水口(入湖,落地成 SDI)

像什么:厂门口那道进水闸,带滤网和流量表。进来的水先在这儿过一遍,原样存一池。

其实是什么:把源库的表按全量或增量搬进湖里,一行不改,落成贴源层;后面所有加工都从这一池水开始。

真名
DataX(批量)、CDM(初始化批量 / 增量批量)、CDL(增量实时,Oracle 先过 DRS 再到 CDL)
落地表
贴源层 SDI,命名 gk{公司缩写}_{系统名}_{系统类型},例 gkjx_cms_dis6
在哪
海豚里 Worker 分组 datax、环境名 datax

搞错了会怎样:进水口不按清单进水、谁想接就接,湖里很快出现五张都叫“销售明细”的表,名字各不一样。

💧 四级净水池(SDI → DWI → DWR → DWS)

像什么:四口依次往下的池子。第一池是原水,第二池加药沉淀,第三池过滤,第四池出水前把硬度调好。

其实是什么:同一份数据在湖里按四层各存一遍,越往后越干净、越汇总、行数越少;而且要能单独回查,不能只剩个结果。

真名
SDI 贴源 → DWI 明细 → DWR 汇总明细 → DWS 汇总
库名
dwi_gk_hudi / dwr_gk_hudi / dm_gk_hudi
谁在搅
Spark SQL,统一从 Kyuubi 进来写

搞错了会怎样:跳过中间层,直接从贴源层拼报表。口径规则散落在几十个 SQL 里,改一次规则要改几十处。

🍶 灌装线(DM / ADS 结果表)

像什么:灌装车间。水到这儿不再论吨,按瓶灌、贴标签、装箱,一瓶对应一个页面上的一个位置。

其实是什么:面向具体场景和页面的结果表。页面要什么,就在这一层拼好什么,前面四层的复杂到这儿收口。

真名
DM / ADS 应用层,例 dm_gk_hudi.ads_pur_ps_channel、dm_gk_hudi.ads_sad_se_jx_dtl
在哪
湖里 dm_gk_hudi 库;出湖后进仓 dm_gk_dws

搞错了会怎样:结果表不按场景命名、字段随手加,半年后没人知道那张 ads_ 开头的表是谁的、能不能删。

🚇 城市管网(Doris)

像什么:埋在地下的城市主管网。厂里水再好,管网漏了、压力不够,楼上照样没水。

其实是什么:对外供数的 OLAP 库。页面和报表直连它查,查得快不快、稳不稳,用户第一时间就能感觉到。

真名
Doris,湖里出来靠 SeaTunnel 送(Hudi → Doris)
硬规矩
副本必须 3(replication_allocation = "tag.location.default: 3")、禁 Auto Bucket、≤2000 万行禁用动态分区
看压力
Grafana 面板 10.160.4.111:8182

搞错了会怎样:开了 Auto Bucket,tablet 数量失控、小文件爆炸,查询越跑越慢,最后只能重建表。

🚰 水龙头(帆软 / Superset / adhoc 页面)

像什么:你家厨房那个龙头。你只关心拧开有没有水、水压稳不稳,不关心厂里几台泵在转。

其实是什么:报表、自助分析、即席取数三类出口,全都直连 Doris 的表,拧开就有数。

真名
帆软 FineReport、Superset、adhoc 查询平台(/adhoc)
交付
字段口径说明、DDL、映射文档、验算报告

搞错了会怎样:页面里写死一段 SQL 自己算口径,链路上查不到它。数字错了只能靠人肉翻页面。

三、一张图看完这条水管

把六段画在一条线上就是下面这张图。从左往右就是水的方向,中间那格四小格是四级净水池;下面一排是三个岗位。

一座自来水厂:六段管子,三个岗位 水的方向 → 城外的河,从这儿进厂 河水 Oracle 进水口 DataX/CDM 四级净水池 SDI DWI DWR DWS 灌装线 ADS 城市管网 Doris 水龙头 帆软 BI 总水闸 Kyuubi 值班室 海豚 化验室 监控 上排是水的路线,下排是三个岗位守着整条线 SDI 贴源 → DWI 明细 → DWR 汇总明细 → DWS 汇总 → ADS 结果 → Doris 供数 库:dwi_gk_hudi / dwr_gk_hudi / dm_gk_hudi(湖)· dm_gk_dws(仓)

四、厂里就三个岗位,记住名字就够

管子再多,真要认人的只有三个岗:一个管开门,一个管排班,一个管化验。哪一步出问题,先找这三个岗。

它们站的位置不一样,混着记最容易乱,下面按“站在哪、管什么”分开写。

🚦 总水闸(Kyuubi)

像什么:厂门口那道总闸。不管你是哪个车间的,用水都得从这道闸过,闸上还有一本登记簿。

其实是什么:所有 Spark SQL 的统一 JDBC 入口。谁在什么时候跑了什么 SQL,都在这一层留痕。

真名
Kyuubi,入口 jdbc:kyuubi://…:10009(办公室 .50 / .236,VPN .100)
硬规矩
DEV 账号必须带 kyuubi.engine.share.level.subdomain=<子域>

搞错了会怎样:平台的要求是必须带这个子域标记;不带会不会被平台 KILL,目前没拿到证据(10 月 24 日那两次超时,也可能只是元数据行锁),所以别把它当已证实的结论讲——但照规矩带,别省。用 SQL 注释或连上后 SET 冒充,平台都不认。

⏰ 值班室(DolphinScheduler 海豚)

像什么:厂里的值班室,墙上挂着时刻表:几点开哪台泵、先开哪台后开哪台、哪台坏了重开几次。

其实是什么:作业编排和依赖调度。谁等谁、出错重试几次、漏了怎么补数,全写在这张时刻表上。

真名
DolphinScheduler,三套厂区:生产 / UAT / 开发(开发环境不开启调度)
项目编码
生产 BI_PRD 148405435832576、SIT 149223761565792、ETL 生产 136016656440288、ETL SIT 12302943659968、SUPP 12923899913280
节点约定
业务 SQL 用 SQL 组件选 KYUUBI;入湖 DATAX(worker=datax);出湖 SEATUNNEL(worker=seatunnel);中转用 SHELL 跑 echo 1

搞错了会怎样:依赖检查只认“上次成功”、不认“今天跑没跑”,08:00:05 就放行;上游 10 月 3 日下线了,下游照样天天准点搬一遍旧数据。

🔬 化验室(监控)

像什么:化验室墙上那排表:水质多少、压力多少。哪个格子红了,立刻有人去打铃。

其实是什么:分四段看数据——源到贴源、入湖任务、湖仓调度、湖到仓到页面。哪一段漏了,一眼能看出是管子的问题还是水的问题。

真名
Prometheus + Grafana、DS 实例失败率、入湖湖仓到帆软全链路监控、自建一致性检查
看什么
表级监控字段:finereport_name(哪个页面)、dws_table(哪张表)、job_name(哪个任务)、job_owner(谁负责)

搞错了会怎样:只盯任务成功失败、不看数据本身,任务全绿,页面数字照样是错的。

五、这座厂是一年年长出来的,不是一次建成的

看时间线就明白:2022 年下半年先吵架构、写规范,2023 年才大批进水,后面几年全在补工具和监控。

下表按语雀知识库 313 篇文档的创建时间排。文档的节奏,基本等于项目推进的节奏。

时间在干什么
2022-09立项。第 1 篇文档《数据挖掘架构需求》,先把需求写成文
2022-10
(33 篇)
架构选型大爆发:Lambda / Kappa / 混合架构、数据湖、湖仓一体、Hudi、Spark / Hive 参数,还有《数仓设计规范》
2022-11
(43 篇)
方案落地:数据中台架构与方法论、元数据方案、数据质量、数据资产分类、医疗健康数据分级分类、数据安全
2022-12
(12 篇)
数据入湖流程定稿、CDM 问题清单、入湖配置方案、数据集成架构
2023-01
(33 篇)
入湖工程化:入湖第一阶段、CDM / API 文档、并行写 Hudi、大规模入湖与调度
2023-06~11Hudi 增量能力(copy_to_temp_view)、Hudi / 集群优化、入湖湖仓到帆软全链路监控
2024双周迭代发布制度(2024-04 起记录不断)、2024-10 数据库迁移
2025离线 / 实时数据同步解决方案、Superset、ETL 代码工具与数工坊、对外同步流程、权限申请流程
2026迭代发布继续(2026-01 至 2026-09 每月都有记录)、数据中台十五五规划、项目多环境介绍更新

最该看的是 2022-10 和 2022-11 这两个月:一个月 33 篇、一个月 43 篇,架构和方法论都是那两个月定下来的。后面几年没再推翻,只是照着它长。

六、现在这座厂有多大(实测记录,不是文档口径)

下面这些数是上平台实测查出来的,不是文档里的目标值。文档写的是“应该怎样”,这里写的是“现在实际怎样”。

📏 现在的规模
真名
生产湖 dm_gk_hudi、落地库 dm_gk_hudi_sit、最忙那台 worker 10.160.10.26
生产湖
dm_gk_hudi 2,763 张表
落地库
dm_gk_hudi_sit 3,027 张表
单项目任务
756 个任务,分布在 10 台 worker 上
最忙那台
10.160.10.26 一台扛 218 个、排队 3.8 分钟,其余 9 台基本空闲
近 8 天
45,571 成功 / 296 失败 / 529 被杀,失败率 0.65%
失败根因
集中在 SeaTunnel 心跳超时,retry_to_doris 自动重跑后全部成功
SUPP 场景
44 条工作流(42 条在线、08:00 调度,2 条停用)
小窍门看这座厂健不健康,别只看“任务都跑完了”。要看两个数:表数说明量级(2,763 张),单台排队时长说明负载摊没摊平(一台 218 个、3.8 分钟),后者更容易先出事。

2,763 张表是这套体系的体量,也是它的负担:同样的活本来该 10 台机器分,现在快压在一台上。这不是水管坏了,是水压全压在一个接口上。

七、搞错了会怎样(真实事故,不是假设)

这一段最该背下来。前面讲的是管子怎么接,这里讲的是管子接错以后,现场长什么样。

会出事依赖检查只认“上次成功”、不认“今天跑没跑”。08:00:05 就放行,上游 10 月 3 日已经下线,下游仍然天天准点搬一遍旧数据,日志里一条错都没有。
会出事同一张表拆成两个并行分支同时写,INSERT OVERWRITE 互相覆盖。后跑的把手删了,页面上少一天的数,任务状态还是成功的。
注意23:00 之后不要写 Hudi、也不要跨日续跑。跨日跑完,分区落到第二天,口径和月度汇总全乱。

这三条后来都写进了红线清单。第 11 关会把 13 条红线连同踩坑现场一次讲完。

八、一句话记住

🧠 一句话记住

技术是拼的,规范是写的,规模是靠工具化撑起来的。

拼,说的是这套开源组件自己接线、自己排班;写,说的是 313 篇文档里那些分层、命名和红线;工具化,说的是把建表、写 ETL、挂调度、配同步、接页面都做成了平台上的按钮。

真名
这句话出自《数据中台是怎么搭出来的(复盘)》的收尾结论,不是宣传口号

九、往下怎么读

后面 11 关就是把这六段拆开讲。建议按下面这个顺序走,一关没看懂就停在那一关,别硬赶。

  1. 先底座(第 2 关):HDFS、YARN、Spark、Hudi、Kyuubi、Ranger、Datasophon 这些家什各管什么。
  2. 再进水(第 3 关):清单驱动、六道前置检查、DataX / CDM / CDL 三条进水管。
  3. 再净水(第 4 关):SDI → DWI → DWR → DWS → ADS,为什么同一份数据要存好几遍。
  4. 再灌装与排班(第 5、6 关):Spark SQL 怎么把水灌进瓶里,海豚怎么排时刻表。
  5. 再管网(第 7、8 关):SeaTunnel 出湖、Doris 怎么分区分桶、副本为什么必须 3。
  6. 再水龙头(第 9 关):建表平台、数工坊、adhoc、Superset、血缘,把重复活变成流水线。
  7. 再化验(第 10 关):四段式监控,哪一段漏了一眼看得出来。
  8. 最后红线(第 11、12 关):13 条红线与真实事故,以及你手上那几个地址各站在链条的哪一段。

这一关只需要记住一个画面:河水 → 进水口 → 四级净水池 → 灌装线 → 城市管网 → 水龙头,中间站着 Kyuubi、海豚、监控三个岗位。