TL;DR
- 场景:从0搭一套离线数仓,需要框架/组件/服务器/规模估算与命名规范
- 结论:优先稳定版本组合;发行版更省运维;容量估算要叠加副本+预留+膨胀系数
- 产出:一套可落地的选型清单、容量/节点估算公式、ODS/DWD/DWS/ADS/DIM命名模板
总体架构设计
技术方案选型
- 框架选型
- 软件选型
- 服务器选型
- 集群规模的估算
框架选型
Apache或第三方发行版(CDH、HDP、Fusion Insight)
Apache社区版本
优点:
- 完全开源免费
- 社区活跃
- 文档、资料详实
缺点:
- 复杂的版本管理
- 复杂的集群安装
- 复杂的集群运维
- 复杂的生态环境
第三方发行版本
CDH、HDP、Fusion Insight Hadoop遵从Apache开源协议,用户可以免费的任意的修改并使用Hadoop,正因如此,市面上有很多厂家在ApacheHadoop的基础上开发了自己的产品,如Cloudera的CDH,Hortonworks的HDP,华为的FusionInsight等,这些产品的优点是:
- 主要功能和社区版本一致
- 版本管理清晰,比如:Cloudera、CDH3、CDH4等,后面加上补丁的版本:CDH4.1.0 patch
- 比ApacheHadoop在兼容性、安全性、稳定性上有增强,第三方发行版通常都是经过了大量的测试验证,有众多部署实例,大量的运用到各种生产环境中
- 版本更新快,如CDH每个季度会有一个Update,每一年都有一个Release
- 基于稳定版的ApacheHadoop,并应用了最新Bug修复、Feature的patch
- 提供了部署、安装、配置工具,大大提高了集群的安装效率,可以在几个小时之内安装好集群。
- 运维简单,提供了管理、监控、诊断、配置修改的工具,管理配置方便,定位问题快速,准确,使运维工作简单,有效
主要的版本有如下的这些:
- CHD:最成型的发行版本,拥有最多的部署案例,提供强大的部署、管理和监控工具,国内使用最大的版本,拥有强大的社区支持,当遇到问题,能够通过社区、论坛等网络资源快速获取解决方法
- HDP:100%开源,可以进行二次开发,但没有CDH稳定,国内使用相对较少
- Fusion Insight:华为基于Hadoop2.7.2版开发的,坚持分层,解耦,开放的原则,得益于高可靠性,在全国各地政府、运营商、金融系统有较多案例
软件选型
- 数据采集:DataX、Flume、Sqoop、Logstash、Kafka
- 数据存储:HDFS、HBase
- 数据计算:Hive、MapReduce、Tez、Spark、Flink
- 调度系统:Airflow、azkaban、Oozie
- 元数据管理:Atlas
- 数据质量管理:Griffin
- 即席查询:Impala、Kylin、ClickHouse、Presto、Druid
- 其他:MySQL
框架,软件尽量不要选择最新的版本,选择半年前左右的稳定版本。
服务器选型
选择物理机还是云主机:
- 机器成本考虑:物理机的价格 > 云主机的价格
- 运维成本考虑:物理机需要有专业的运维人员,云主机的运维工作由供应商完成,运维相对容易,成本相对较低
集群规模
如何确认集群规模(假设:每台服务器20T硬盘,128GB内存) 可以从计算能力、CPU、内存、存储量等方面考虑集群规模。 假设:
- 每天的日活500万,平均每人每天有100条日志信息
- 每条日志大小1K左右
- 不考虑历史数据,半年集群不扩容
- 数据3个副本
- 离线数据仓库应用
这种情况下,需要多大的集群规模? 要分析的数据有两部分:日志数据+业务数据
- 每天日志数据量:500W1001K / 1024 / 1024 = 500G
- 半年需要存储量:500G * 3 * 180 / 1024 = 260T
- 通常要给磁盘预留 20%-30%的空间: 260*1.25 = 325T
- 数据仓库应用有1-2倍的数据膨胀325T * 1.5 = 500T
- 需要大约25个节点
其他未考虑的因素:数据压缩、业务数据 以上估算的生产环境,实际上除了生产环境以外,还需要开发测试环境,这也需要一定数量的机器。
系统逻辑架构
服务器软件配置如下所示:
数据仓库命名规范
数据库命名
- 命名规则:数仓对应分层
- 命名示例:ods/dwd/dws/dim/temp/ads
数仓各层对应数据库
- ods层 => ods_{业务线|业务项目}
- dw层 => dwd_{业务线|业务项目} + dws_{业务线|业务项目}
- dim => dim_维表
- ads => ads_{业务线|业务项目} (统计指标等)
- 临时数据 => temp_{业务线|业务项目}
(备注:本项目未使用)
表命名(数据库表命名)
数据仓库分层命名规范详解
ODS层(Operation Data Store)
- 命名格式:
ods_{业务线|业务项目}_[数据来源类型]_{业务} - 详细说明:
- 业务线/项目:如
finance(金融)、retail(零售)、logistics(物流) - 数据来源类型(可选):
db(数据库)、log(日志)、api(接口)、file(文件) - 业务:具体业务名称,如
user_login(用户登录)、order_payment(订单支付) - 示例:
ods_finance_db_user_info(金融业务线数据库用户信息)ods_retail_log_page_view(零售业务线页面浏览日志)ods_projectX_api_transaction(X项目接口交易数据)
- 业务线/项目:如
DWD层(Data Warehouse Detail)
- 命名格式:
dwd_{业务线|业务项目}_{主题域}_{子业务} - 详细说明:
- 主题域:如
user(用户)、order(订单)、product(商品)、marketing(营销) - 子业务:具体业务细分,如
register(注册)、pay(支付)、refund(退款) - 示例:
dwd_finance_user_register(金融用户注册明细)dwd_retail_order_pay(零售订单支付明细)dwd_projectX_product_view(X项目商品浏览明细)
- 主题域:如
DWS层(Data Warehouse Summary)
- 命名格式:
dws_{业务线|业务项目}_{主题域}_{汇总相关粒度}_{汇总时间周期} - 详细说明:
- 汇总相关粒度:如
user(用户级)、shop(店铺级)、city(城市级) - 汇总时间周期:
d(日)、w(周)、m(月)、q(季)、y(年) - 示例:
dws_finance_user_balance_d(金融用户余额日汇总)dws_retail_shop_sales_m(零售店铺销售额月汇总)dws_projectX_city_traffic_w(X项目城市流量周汇总)
- 汇总相关粒度:如
ADS层(Application Data Store)
- 命名格式:
ads_{业务线|业务项目}_{统计业务}_{报表form|热门排序topN} - 详细说明:
- 统计业务:具体统计指标,如
active_user(活跃用户)、conversion_rate(转化率) - 报表形式:
report(标准报表)、dashboard(仪表盘)、top10(TOP10排行) - 示例:
ads_finance_active_user_report(金融活跃用户报表)ads_retail_conversion_rate_dashboard(零售转化率仪表盘)ads_projectX_product_sales_top10(X项目商品销量TOP10)
- 统计业务:具体统计指标,如
DIM层(Dimension)
- 命名格式:
dim_{业务线|业务项目|pub公共}_{维度} - 详细说明:
- 公共维度使用
pub标识,业务专属维度使用业务线/项目标识 - 维度:如
date(日期)、region(区域)、category(类目) - 示例:
dim_pub_date(公共日期维度表)dim_finance_region(金融区域维度表)dim_projectX_product_category(X项目商品类目维度表)
- 公共维度使用
应用场景示例
-
电商业务完整链路:
- ODS:
ods_retail_db_order_master - DWD:
dwd_retail_order_payment - DWS:
dws_retail_shop_sales_d - ADS:
ads_retail_daily_sales_report - DIM:
dim_retail_product_category
- ODS:
-
金融风控场景:
- ODS:
ods_finance_log_user_behavior - DWD:
dwd_finance_risk_transaction - DWS:
dws_finance_user_risk_score_m - ADS:
ads_finance_risk_alert_top100 - DIM:
dim_pub_region
- ODS:
创建数据库
我们启动Hive,进行操作:
create database if not exists ods;
create database if not exists dwd;
create database if not exists dws;
create database if not exists ads;
create database if not exists dim;
create database if not exists tmp;
执行结果如下图所示:
错误速查
| 症状 | 根因 | 定位修复 |
|---|---|---|
| 集群上线后很快磁盘告急 | 容量估算只算原始日志量,没叠加副本/预留/膨胀/历史保留 | 对照估算链路:原始量→副本→周期→预留→膨胀;核对 HDFS 使用率与增长曲线;把副本数、20–30%预留、1–2倍膨胀写入容量模型;按节点盘位反推节点数并预留扩容空间 |
| 组件能装起来但频繁兼容问题 | 追新版本或混装版本,生态兼容矩阵没做 | 逐项核对:Hadoop/Hive/Tez/Spark/HBase/Kafka 依赖与编译目标;看发行版支持列表;采用发行版推荐组合或锁定社区稳定组合;避免“最新”并做组件版本统一规划 |
| 安装部署周期过长、反复踩坑 | 纯社区版缺少一体化部署/运维工具,流程复杂 | 统计安装耗时与人工步骤;梳理:安装、配置、监控、诊断的缺口;若资源允许选发行版;若社区版则明确自动化(Ansible/脚本)与监控告警体系 |
| 运维定位慢、改配置风险大 | 缺少集中管理、监控、诊断工具与配置变更流程 | 复盘故障:监控指标缺失、日志分散、配置无审计;引入统一管理与监控;建立配置变更流程与回滚机制;关键组件日志集中化 |
| 数仓分层混乱、表名不可读 | 无统一命名规范或规范未覆盖来源/主题/粒度/周期 | 抽样检查 ODS/DWD/DWS/ADS/DIM 是否能从表名读出含义;按给定模板固化:ODS含来源类型;DWD含主题域与子业务;DWS含粒度与周期;ADS含报表形态;DIM区分pub与业务线 |
| Hive建库建表后权限/资源冲突 | 环境隔离不足,生产/测试/开发共用资源或缺少资源队列 | 检查是否区分环境;看 Yarn/队列、Hive metastore、HDFS 目录规划;明确开发/测试/生产环境资源与元数据隔离;按环境划分队列与存储路径 |
其他系列
🚀 AI篇持续更新中(长期更新)
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南! AI研究-132 Java 生态前沿 2025:Spring、Quarkus、GraalVM、CRaC 与云原生落地
💻 Java篇持续更新中(长期更新)
Java-218 RocketMQ Java API 实战:同步/异步 Producer 与 Pull/Push Consumer MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务已完结,Dubbo已完结,MySQL已完结,MongoDB已完结,Neo4j已完结,FastDFS 已完结,OSS已完结,GuavaCache已完结,EVCache已完结,RabbitMQ已完结,RocketMQ正在更新... 深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解