
简介华为大数据中台架构分享是一份面向企业架构师、数据平台工程师及数字化转型负责人的专业PDF文档。内容以华为云数据中台解决方案DAYU为主线系统梳理数据中台背景洞察、顶层设计思路及落地目录针对数据孤岛、数据缺乏标准、数据难理解等常见痛点给出统一数据采集与整合平台的建设框架。同时结合智慧工厂、全球运营指挥中心、智慧物流与智能仓储等业务场景展示数据资产中心与数据能力中心如何使能业务数字化运营并提及数据采集、处理计算、服务分析等模块。资源包中仅含1个PDF文件大小约15.98MB内容结构完整适合作为数据中台规划建设的参考材料。该文档目前已受到632人关注学习对于正在规划数据平台或希望了解华为DAYU方案细节的读者具有较高参考价值。1. 大数据中台架构分享到底在分享什么看到“华为大数据中台架构分享.pdf”这个标题我第一反应不是去问文档里有几张架构图而是想中台架构讲了这么多年真正能落地的判断依据是什么。早期项目做数据平台通常是把 Hadoop、Spark、Hive 装好就算交差后来发现业务部门要的不是集群而是能直接回答“昨天新增了多少用户、这批货为什么积压”的指标。大数据中台就是把存储、计算、数据模型和服务能力统一收口让数据被业务按需消费。这里要讲的内容适合正在做数仓、数据平台或者准备转型中台的工程师也适合想搞清楚中台和平台有什么区别的技术管理者。下面按从架构设计到落地部署再到治理和调优的顺序展开。2. 大数据中台的分层架构与关键技术选型2.1 从平台到中台边界在哪里很多团队把 Hadoop 集群叫平台把加了调度和元数据管理的叫中台其实关键差异在职责边界。数据平台管的是资源和组件比如你给 Hadoop 配了 200 个 NodeManager给 Hive 配了 3 个 metastore这是平台视角。中台是在平台之上多了一层“业务可理解的数据资产”和一套“统一服务接口”它要回答的是某个指标在哪个层加工、由哪个团队维护、下游哪些报表在用。做中台架构分享前先把这个边界画清楚否则后面很容易做成“平台 plus 数据目录”。我见过不少中台项目只做了数据地图和权限控制却没有把指标口径管起来结果报表系统还是各自写各自的 SQL。中台的本质是“复用”不是“集中”。2.2 分层设计采集、存储、计算、服务、治理典型的大数据中台分为五层。接入层负责把业务库、日志、消息队列里的数据统一采集进来常用工具是 Flume、DataX、Kafka存储层由分布式文件系统、对象存储和实时存储构成对应 HDFS、MinIO、HBase计算层包含批处理、流处理、OLAP 和即席查询典型组件是 Spark、Flink、Doris、Presto服务层通过 API 网关和查询引擎把数据输出给业务系统治理层贯穿全链路管元数据、质量、血缘和安全。华为的实践里分层并不是每个项目都五层齐备有些轻量项目会把服务层合并到计算层。下面用一个表格说明每一层的主责和常见组件层级主责常见组件选型要点接入层数据同步与事件采集Kafka、DataX、Flume实时性要求决定用 CDC 还是批量存储层文件、表、索引HDFS、MinIO、Iceberg、HBase冷热分离必须在建设初期设计计算层批流处理与 OLAPSpark、Flink、Doris、Presto大查询并发与资源隔离的平衡服务层数据 API 与指标服务微服务网关、Kyuubi统一接口避免业务直连数仓治理层元数据、质量、血缘Atlas、DataHub、自研血缘是排查问题的关键对于一个中台架构分享文档读者最容易忽略的是存储层的设计。很多人直接把 HDFS 当成一个大文件夹没有区分临时表、明细表、汇总表的使用频率。建议在建集群之前先规定 HDFS 目录的写法比如 /warehouse/{业务域}/{分层}/{表名}并在 Hive 里用 location 指向对应目录。这样可以避免表数据散落在不同路径下导致后来的治理工具无法自动扫描。在数据中台之上还可以延伸出 AI 中台但 AI 中台治理的是特征、模型和样本与数据中台处理的对象不一样架构上要提前预留出目录空间否则后续做算法对接时还得分区迁移。2.3 技术选型Hadoop 生态、MPP 与湖仓一体的取舍做中台选型时我一般不会一开始就选全家桶而是根据查询时效和数据规模来定。传统上是 HDFS Hive Spark 的离线方案优点是生态成熟、跑批可靠但即席查询性能一般MPP 引擎如 Doris、StarRocks、ClickHouse 在处理高并发点查和聚合上优势明显适合支撑报表和数据服务新一代湖仓格式如 Iceberg、Hudi 则解决了 HDFS 上文件管理和增量更新难的问题。三者的关系不是互斥很多中台是同时跑两套离线数仓负责全量加工OLAP 引擎负责加速查询。代码层面最容易出问题的是 Spark 与 Hive 的元数据共享。常见做法是让 Spark 和 Hive 共用同一个 Hive MetastoreSparkSession 里配置 hive.metastore.uris。下面给出一个启动 Spark SQL 的配置片段用于对接已有的中台元数据服务spark-sql \ --conf spark.sql.warehouse.dir/warehouse \ --conf spark.hadoop.hive.metastore.uristhrift://metastore-host:9083 \ --conf spark.sql.catalogImplementationhive \ --conf spark.sql.adaptive.enabledtrue上面这段命令的关键参数有三个。spark.sql.warehouse.dir 指定中台表数据的根目录所有建表路径都从这里派生spark.hadoop.hive.metastore.uris 指向 Metastore 的 Thrift 地址保证 Spark 新建的表能被其他组件看到spark.sql.adaptive.enabled 开启自适应执行让 Spark 根据数据量动态调整 shuffle 分区不做这一步大查询很容易因为分区数过多而拖慢整个架构。在写中台主题相关分享时这组参数通常会被一笔带过但实际排查性能问题时最先要检查的也是它们。3. 大数据中台架构下的集群部署与基础参数配置3.1 最小集群规划4 节点起步怎么放角色中台落地第一步不是调参数而是决定机器上放哪些角色。一个最小可用的大数据中台至少需要 4 台物理机或虚机角色分配可以参考下面的表格1 台做 Master放 NameNode、ResourceManager、Hive Metastore2 台做 Worker放 DataNode、NodeManager、Doris BE1 台做服务和监控放 Kafka、Zookeeper、Grafana。更小规模可以合并成 3 台但要把 Zookeeper 独立出去否则 Kafka 和 HBase 的协调服务会互相影响。节点分配的角色CPU/内存建议磁盘master-1NameNode, ResourceManager, metastore16C32G4x1TB SSDworker-1DataNode, NodeManager, Doris BE32C64G8x4TB HDDworker-2DataNode, NodeManager, Doris BE32C64G8x4TB HDDservice-1Kafka, Zookeeper, Grafana8C16G2x1TB SSD需要注意数据中台的资源规划要与数据规模挂钩。如果每天新增几十 GB 数据4 节点可以跑一年如果每天新增 TB 级就要在 worker 上按 3 副本预留 3 倍以上空间。不要先把副本数调成 1 来省空间中台数据是资产磁盘损坏导致的元数据不一致比慢查询更难恢复。3.2 用脚本自动配置 Hadoop 和 Hive 的核心参数手动改几十个配置文件是集群部署中最容易出错的地方。常见的做法是先用一套统一的模板生成 core-site.xml、hdfs-site.xml、yarn-site.xml再通过 ansible 或 shell 分发到所有节点。这里给出一个简化版的配置脚本片段它把核心参数写成一个 shell 数组然后逐项替换模板中的占位符。#!/bin/bash NN_HOSTmaster-1 CLUSTER_NAMEbigdata declare -A HDFS_CONF( [dfs.replication]3 [dfs.nameservices]$CLUSTER_NAME [dfs.blocksize]268435456 [dfs.namenode.handler.count]100 ) for key in ${!HDFS_CONF[]}; do sed -i s|value$key/value|value${HDFS_CONF[$key]}/value|g /tmp/hdfs-site.xml done scp /tmp/hdfs-site.xml worker-1:/opt/hadoop/etc/hadoop/ scp /tmp/hdfs-site.xml worker-2:/opt/hadoop/etc/hadoop/这段脚本的核心逻辑是遍历关联数组把 hdfs-site.xml 模板里的同名 value 替换成实际值再分发到 worker 节点。dfs.blocksize 设置为 256MB 是为了避免小文件过多中台场景里每个 Map 任务处理的数据块越大namenode 内存占用越少dfs.namenode.handler.count 表示 namenode 处理 RPC 的线程数在并发写入高的架构里低于 100 会出现明显等待。这里有一个容易被忽略的问题如果分发配置后没有同步更新集群里的其他节点那么 worker 上的 DataNode 会用旧配置启动和 NameNode 的地址对不上导致上架节点失败。提示不要在生产集群上反复格式化 NameNode。元数据丢失时优先考虑 Quorum Journal Manager 或备机恢复格式化会把中台的元数据全部重置。3.3 中台服务化微服务网关与数据 API中台和传统数仓的另一个区别是服务化。数仓通常只提供 JDBC/ODBC 连接业务方要自己写连接池和权限逻辑中台则会提供一个统一的 Query API 网关业务只申请接口不关心底层跑的是 Spark 还是 Doris。实现上可以在前端放一个 Nginx把 /api/query 转发到后端的查询服务查询服务再根据 SQL 类型路由到不同引擎。下面是我常用的一个 Docker 启动脚本片段用 nginx 镜像把查询请求代理到两个后端服务docker run -d --name datahub-gateway \ -p 8080:8080 \ -v /opt/gateway/nginx.conf:/etc/nginx/nginx.conf:ro \ -e BACKEND_OFFLINEspark-service:8081 \ -e BACKEND_ONLINEdoris-service:8082 \ nginx:1.24-alpine这个脚本将网关容器映射到宿主机 8080 端口BACKEND_OFFLINE 和 BACKEND_ONLINE 两个环境变量会在 nginx.conf 里被读取用来区分离线查询和实时查询。这样做的好处是中台内部的引擎变化不会影响到业务侧的数据接口也是做架构分享时要强调的“服务封装”思路。参数后面的端口需要与后端服务实际运行端口一致否则 Nginx 会在日志里报 502这也是上线中台后最常见的故障之一。4. 数据中台的数据治理、冷热归档与血缘管理4.1 数仓分层不只是命名规范是计算成本边界中台数据一般按 ODS、DWD、DWS、ADS 四层来组织。ODS 层保留原始数据不做太多清洗DWD 层做维度建模和明细整合DWS 层做主题汇总ADS 层面向具体应用。分层越清晰数仓的计算成本就越可控业务改需求时只改 ADS不会动到 DWD 的底层任务。很多团队把分层停留在目录命名上没有把每层的数据生命周期区分开导致 ODS 表无限膨胀。分层定位生命周期典型表名ODS原始数据备份3-6 个月ods_sales_orderDWD明细整合1 年dwd_sales_order_detailDWS主题汇总2 年dws_sales_order_sumADS应用数据按需保留ads_sales_order_rpt我一般会在 ODS 层统一做主表字段包括 etl_time、source_system并在建表时按日期分区。这样做的好处是回刷历史数据时可以精确只刷某个分区而不会把整张表锁住。下面给出一张 ODS 表的 Hive 建表语句CREATE EXTERNAL TABLE IF NOT EXISTS ods.sales_order ( order_id STRING COMMENT 订单号, goods_id STRING COMMENT 商品ID, quantity INT COMMENT 数量, amount DECIMAL(12,2) COMMENT 金额, etl_time TIMESTAMP COMMENT 抽取时间 ) PARTITIONED BY (dt STRING COMMENT 分区日期) STORED AS PARQUET LOCATION /warehouse/ods/sales_order;这段 DDL 里有几个关键点。external 表删数据文件时不会连带删除元数据适合中台统一管理原始数据PARTITIONED BY (dt STRING) 让每天写入一个分区查询时通过 dt 裁剪文件STORED AS PARQUET 是列式存储比文本格式节省空间也更容易被 Spark 谓词下推。注意如果把 dt 定义为时间类型之后的动态分区插入会多一步格式转换字符串类型在 Hive 里做等值过滤足够。4.2 冷热数据分离归档表的设计与调度中台运行一年以上最大的存储压力来自历史分区。设定一个简单的规则90 天内的数据是热数据放到 HDFS 的 SSD 目录超过 90 天的归档到冷存储降低副本数或用对象存储。实际操作中我会为每张业务表建一张对应的归档表归档表结构与原表一致但存储路径不同并使用 ROW FORMAT 相同、文件格式相同只是分区名带 arch 前缀。常见的做法是使用下面的 SQL 将 120 天前的数据从热表迁移到归档表并清理原表分区-- 动态分区方式把历史数据写入归档表 INSERT OVERWRITE TABLE ads.sales_order_arch PARTITION (dt) SELECT order_id, goods_id, quantity, amount, etl_time, dt FROM ods.sales_order WHERE dt date_sub(current_date(), 120); -- 删除原表中已归档的分区 ALTER TABLE ods.sales_order DROP IF EXISTS PARTITION (dt2024-01-01);上面的 INSERT OVERWRITE 写法利用了 Hive 的动态分区不需要在语句里写死每个分区只要 SELECT 最后一个字段是分区字段即可。归档之后要修改 HDFS 存储策略把归档表目录设置成归档副本比如执行 hdfs storagepolicies -setStoragePolicy -path /warehouse/ods/sales_order_arch -policy COLD。这样做了以后冷数据查询变慢是正常的因为读取时要从冷存储取回中台在服务层应该把冷数据查询路由到专用接口避免阻塞热数据查询。4.3 数据血缘用依赖解析找人也找故障源头数据治理里最容易失效的是血缘管理。中台数以千计的表、任务、报表之间如果只有“业务文档”而没有自动化血缘一旦某个 DWD 层表数据异常下游报表会存在一天才发现。搭建血缘的常见方案是解析 SQL。Hive 和 Spark SQL 都提供 EXPLAIN 或 lineage hook可以把执行计划里的输入输出表记录下来。对于更完整的依赖图可以在每天调度任务执行前扫描 SQL 文件里的 INSERT 和 FROM 子句写入一条依赖关系表。以调度平台的依赖记录为例我一般会把下面这段信息写入血缘表任务名、目标表、源表、执行时间和调度状态。当上游表出问题时通过依赖表反查所有下游任务能快速圈定影响面。血缘表本身也是中台数据的一部分建议放到独立 schema而不是随意建在业务库里避免随着业务表归档而被清理掉。这里可以用一个简单的 SQL 查询某张表被谁引用SELECT task_name, target_table, source_table, exec_date FROM meta.lineage WHERE source_table dwd_sales_order_detail AND exec_date current_date() ORDER BY task_name;这个查询适合做故障广播早上发现 dwd_sales_order_detail 数据异常立刻执行一遍把所有依赖它的任务列表拉出来通知相应负责人。血缘表里的 task_name 建议用“调度平台任务 ID 加负责人”的格式可以写成 task_name而不要用中文描述方便脚本解析。日常维护时最重要的是保证血缘记录不是一次性导入而是每次调度都增量写入否则时间一长依赖关系会失真。5. 调优与验证中台上线后必须会做的三个动作5.1 用 Spark SQL 替换 Hive 跑批先把参数调对中台跑批从 Hive 切到 Spark 后如果不改参数很可能比原来更慢。常见问题是对分区小文件处理不好以及动态分区插入时 reduce 数太少。我一般会把 spark.sql.shuffle.partitions 设为可用 CPU 核心数的 2 到 3 倍并把 spark.sql.adaptive.coalescePartitions.minPartitionNum 设为较小值让 AQE 自动合并小分区。命令和参数说明下spark-submit \ --conf spark.sql.shuffle.partitions200 \ --conf spark.sql.adaptive.enabledtrue \ --conf spark.sql.adaptive.coalescePartitions.minPartitionNum10 \ --conf spark.sql.adaptive.coalescePartitions.initialPartitionNum200shuffle.partitions 控制所有 shuffle 阶段的分区数设置过大会产生大量小文件开启动态合并后minPartitionNum 给出一个下界避免极端情况下把数据压到一个执行器。参数不是“越大越好”需要观察 Spark UI 中每个 task 处理数据量单个 task 在 100MB 到 1GB 之间比较合适。5.2 用 EXPLAIN 验证中台查询是否命中分区裁剪调优时不能只凭经验我推荐在发布任何新报表前跑一次 EXPLAIN检查过滤条件下推到存储层。以 Hive 和 Spark SQL 为例在 SQL 前加 EXPLAIN 可以看到 Scan 操作扫描的分区列表。如果发现扫描了全表说明 dt 过滤没有生效需要检查分区字段是否被函数包裹例如 dt date_sub(2024-01-01, 0) 会被识别为条件但 dt date_sub(current_date(), 120) 在某些版本里不会下推。可以在执行前用 SHOW PARTITIONS 确认分区字段值再决定写常量还是变量。5.3 三类任务的上线验证清单中台架构分享最后值得留给我们自己的是一份可执行的验证清单而不是漂亮的架构图。第一检查元数据新表能否被 Hive、Spark、数据服务网关同时访问第二检查数据质量对 DWD 层的核心表做 count、sum、null 比例三方校验第三检查冷热归档查询归档表目录的存储策略是否生效以及恢复读取耗时。上面这几个动作加起来不超过半小时但能把中台交付阶段的问题拦截在一线。这里给一个简单的验证脚本片段用来检查归档目录策略hdfs storagepolicies -getStoragePolicy -path /warehouse/ods/sales_order_arch输出里如果显示 COLD 说明归档策略已生效。如果输出显示 UNSPECIFIED就要检查目录路径是否与 Hive location 一致很多时候是因为建表使用了默认路径而策略设置在了自定义路径上。这个细节很容易被忽略但在冷热数据分离的中台架构里却是存储成本控制的关键。本文还有配套的精品资源点击获取