数据湖是大数据时代的核心基础设施。
随着企业数据量的爆发式增长,传统的数据仓库已经无法满足需求。数据湖,以其灵活的数据存储和处理能力,成为越来越多企业的选择。
本文分享数据湖建设的架构设计经验,包括数据湖的概念和价值、整体架构设计、数据接入、存储、计算、治理、服务各层的设计要点,以及高可用和高并发的保障措施。结合实际项目经验,说说数据湖建设中的坑和最佳实践。
一、什么是数据湖
先说说什么是数据湖。
1. 数据湖的定义
数据湖(Data Lake),是一个以原始格式存储大量数据的系统或存储库。
和数据仓库不同,数据湖不需要预先定义数据结构(Schema on Read),可以存储结构化、半结构化、非结构化的数据。数据可以来自各种数据源:数据库、日志、文件、图片、视频等。
数据湖的概念,最早由Pentaho的CTO James Dixon在2010年提出。他把数据仓库比作"瓶装水"(经过净化、包装、结构化),把数据湖比作"天然湖泊"(保持原始状态,各种水都有)。
2. 数据湖和数据仓库的区别
| 对比项 | 数据湖 | 数据仓库 |
|---|---|---|
| 数据格式 | 原始格式,结构化/半结构化/非结构化 | 结构化,预先定义Schema |
| Schema | Schema on Read(读时定义) | Schema on Write(写时定义) |
| 数据类型 | 所有类型 | 主要是结构化数据 |
| 存储成本 | 低(对象存储) | 高(专用存储) |
| 灵活性 | 高,适合探索性分析 | 低,适合固定报表 |
| 用户 | 数据科学家、数据工程师 | 业务分析师、管理层 |
| 数据质量 | 原始数据,质量参差不齐 | 经过清洗,质量高 |
3. 数据湖的价值
数据湖的价值:
- 存储所有数据:可以存储任何类型、任何格式的数据
- 灵活分析:不需要预先定义Schema,可以随时探索数据
- 成本低:基于对象存储,存储成本低
- 支持多种计算:可以用Spark、Flink、Presto等多种引擎计算
- 数据共享:统一的数据存储,方便各部门共享数据
4. 数据湖的挑战
数据湖也有挑战:
- 数据沼泽:如果没有治理,数据湖会变成数据沼泽,数据混乱,找不到有用的数据
- 数据质量:原始数据质量参差不齐,需要治理
- 性能:直接查询原始数据,性能可能不好
- 安全和权限:数据量大,安全和权限管理复杂
- 元数据管理:需要完善的元数据管理,否则数据无法被发现和使用
所以,数据湖不是简单地把数据堆在一起,而是需要完善的架构和治理。
二、数据湖整体架构
说说数据湖的整体架构设计。
1. 分层架构
一个典型的数据湖架构,分为以下几层:
- 数据接入层:负责从各种数据源采集数据
- 存储层:负责存储原始数据和处理后的数据
- 计算层:负责数据的清洗、转换、分析
- 治理层:负责元数据、数据质量、安全权限
- 服务层:负责对外提供数据服务
每一层,都有各自的职责和设计要点。
2. 数据分层
在存储层内部,通常会把数据分为几层:
- ODS层(原始数据层):存储原始数据,不做任何处理
- DWD层(明细数据层):清洗后的明细数据
- DWS层(汇总数据层):按主题汇总的数据
- ADS层(应用数据层):面向应用的数据
这种分层,和数据仓库的分层类似。好处是:
- 原始数据保留,可以随时重新计算
- 各层职责清晰,便于维护
- 数据质量逐层提升
3. 技术选型
各层的技术选型:
- 数据接入:Flume、Logstash、DataX、Sqoop、Kafka、Flink CDC
- 存储:HDFS、S3、OSS、Azure Data Lake
- 计算:Spark、Flink、Presto、Trino、Hive
- 元数据:Hive Metastore、AWS Glue、DataHub
- 数据质量:Great Expectations、Apache Griffin
- 调度:Airflow、DolphinScheduler、Azkaban
- 查询服务:Presto、Trino、StarRocks、ClickHouse
技术选型要根据实际情况,没有最好的,只有最合适的。
三、数据接入层设计
数据接入层,是数据湖的入口。
1. 数据源类型
常见的数据源:
- 关系型数据库:MySQL、PostgreSQL、Oracle等
- 日志:应用日志、Nginx日志、系统日志
- 消息队列:Kafka、RocketMQ、Pulsar
- 文件:CSV、JSON、Parquet等
- NoSQL:MongoDB、HBase、Redis
- API:第三方API、内部服务API
- 非结构化数据:图片、视频、音频
2. 接入方式
不同的数据源,接入方式不同:
- 批量接入:每天或每小时同步一次,用DataX、Sqoop等工具
- 实时接入:通过CDC(变更数据捕获)实时同步,用Flink CDC、Canal、Debezium
- 日志接入:通过Flume、Logstash、Filebeat采集日志
- 消息接入:直接消费Kafka等消息队列
- 文件接入:上传到对象存储,触发处理流程
3. 接入层设计要点
- 可靠性:数据不能丢,要有重试和容错机制
- 幂等性:重复消费不会导致数据重复
- 扩展性:能支持数据源的增加和数据量的增长
- 监控:接入状态、延迟、失败率要可监控
- Schema管理:数据源Schema变化时,要能感知和处理
4. 常见问题
- 数据延迟:实时接入的延迟要控制在秒级
- 数据重复:网络抖动导致重复发送,要有幂等处理
- Schema变化:上游表结构变化,下游要能兼容
- 数据倾斜:某些数据源数据量特别大,要做分片处理
四、存储层设计
存储层,是数据湖的基础。
1. 存储选型
常见的存储方案:
- HDFS:Hadoop生态的标准存储,适合大数据量
- 对象存储(S3/OSS):云原生方案,成本低,扩展性好
- 本地存储:小规模数据湖可以用
现在的趋势是用对象存储,因为:
- 成本低,存储和计算分离
- 扩展性好,无限扩容
- 高可用,数据多副本
- 支持多种计算引擎
2. 文件格式
数据湖中的文件格式,很重要:
- 原始层:保持原始格式(JSON、CSV、日志等)
- 处理层:用列式存储格式(Parquet、ORC)
Parquet是目前最流行的列式存储格式,优点:
- 压缩率高,节省存储空间
- 查询性能好,只读取需要的列
- 支持嵌套数据结构
- 兼容性好,各种计算引擎都支持
3. 分区设计
分区是提升查询性能的关键。
- 按时间分区:最常用,如按天、按月分区
- 按业务维度分区:如按地区、业务线分区
- 多级分区:如年/月/日,或业务线/日期
分区设计的原则:
- 分区字段要是常用的过滤字段
- 分区数不要太多,一般几十到几百个
- 每个分区的数据量不要太小(避免小文件问题)
4. 小文件问题
小文件是数据湖的常见问题。
小文件多了,会导致:
- NameNode内存压力大(HDFS)
- 查询性能差(需要打开很多文件)
- 元数据管理复杂
解决方法:
- 写入时合并小文件
- 定期执行小文件合并任务
- 使用Hudi、Iceberg等表格式,自动管理小文件
五、计算层设计
计算层,是数据湖的核心。
1. 计算引擎选型
- Spark:最通用的大数据计算引擎,批处理能力强
- Flink:流处理能力强,也支持批处理
- Presto/Trino:交互式查询,速度快
- Hive:传统的数据仓库引擎,稳定但慢
现在的趋势是流批一体,用Flink或Spark同时处理流和批。
2. 批处理和流处理
- 批处理:每天或每小时处理一次,适合T+1的报表和分析
- 流处理:实时处理,适合实时大屏、实时风控等场景
数据湖通常是批流结合:
- 批处理处理历史数据,生成离线报表
- 流处理处理实时数据,生成实时指标
3. 计算层设计要点
- 资源管理:用YARN或K8s管理计算资源
- 任务调度:用Airflow或DolphinScheduler调度任务
- 数据倾斜处理:对倾斜的数据做特殊处理
- 性能优化:合理设置并行度、缓存、广播变量等
- 容错:任务失败要能重试,数据要能重算
六、治理层设计
治理层,是数据湖从"沼泽"变成"湖"的关键。
1. 元数据管理
元数据是数据湖的目录,没有元数据,数据就无法被发现和使用。
元数据包括:
- 表结构:字段名、字段类型、注释
- 数据血缘:数据从哪里来,到哪里去
- 数据统计:数据量、分区信息、更新时间
- 数据质量:质量规则、质量报告
工具:Hive Metastore、AWS Glue、DataHub、Apache Atlas
2. 数据质量
数据质量是数据湖的生命线。
数据质量规则:
- 完整性:非空检查
- 唯一性:主键不重复
- 一致性:关联数据一致
- 准确性:数据在合理范围内
- 及时性:数据按时更新
工具:Great Expectations、Apache Griffin、自研规则引擎
3. 安全和权限
数据湖的数据量大,安全和权限很重要。
- 认证:用户身份认证(Kerberos、LDAP)
- 授权:基于角色的访问控制(RBAC)
- 加密:数据传输加密、存储加密
- 脱敏:敏感数据脱敏
- 审计:数据访问审计
工具:Ranger、Sentry、云厂商的权限管理
4. 数据生命周期管理
数据不是越多越好,要管理数据的生命周期。
- 热数据:最近的数据,频繁访问,存在高性能存储
- 温数据:较旧的数据,偶尔访问,存在普通存储
- 冷数据:历史数据,很少访问,存在低成本存储
- 归档数据:需要长期保存的数据,存在归档存储
定期清理不需要的数据,降低存储成本。
七、服务层设计
服务层,是数据湖对外的窗口。
1. 数据服务方式
- SQL查询:通过Presto、Trino等引擎,用SQL查询数据湖
- API服务:把数据封装成API,供业务系统调用
- 数据导出:把数据导出到MySQL、ES等系统
- BI报表:对接BI工具(Tableau、Superset等)
- 数据共享:把数据共享给其他部门或合作伙伴
2. 服务层设计要点
- 高并发:支持大量并发查询
- 低延迟:查询响应时间要短
- 高可用:服务不能中断
- 限流降级:流量大时要有限流和降级机制
- 监控告警:服务状态、性能、错误率要可监控
八、高可用设计
说说数据湖的高可用设计。
1. 存储高可用
- 数据多副本:HDFS默认3副本,对象存储多副本
- 跨机房复制:重要数据跨机房备份
- 数据校验:定期校验数据完整性
- 快照:对重要数据做快照,防止误删
2. 计算高可用
- 资源池化:计算资源池化,任务失败可以重试
- 任务重试:任务失败自动重试
- 检查点:流处理做检查点,失败后可以恢复
- 多活:重要的计算任务多活部署
3. 服务高可用
- 负载均衡:多个服务节点,负载均衡
- 故障转移:节点故障时,流量自动切换
- 降级:依赖的服务不可用时,降级处理
- 熔断:防止故障扩散
九、高并发设计
说说数据湖的高并发设计。
1. 查询性能优化
- 分区裁剪:查询只扫描需要的分区
- 列裁剪:只读取需要的列
- 谓词下推:过滤条件下推到存储层
- 索引:对常用字段建索引
- 预计算:常用的查询结果预计算,存到汇总层
2. 资源隔离
- 不同业务用不同的资源池
- 重要任务优先调度
- 大查询限制资源,避免影响小查询
- 分时调度:大任务在低峰期执行
3. 缓存
- 元数据缓存:缓存表结构、分区信息
- 查询结果缓存:缓存常用查询的结果
- 数据缓存:缓存热数据
- 应用层缓存:在服务层加缓存
十、踩过的坑
说说数据湖建设中踩过的坑。
坑一:数据沼泽
一开始,我们把所有数据都扔进数据湖,没有治理。结果,数据越来越多,但没人知道有什么数据、数据在哪里、数据质量如何。数据湖变成了数据沼泽。
解决:
- 建立元数据管理系统
- 制定数据规范
- 数据接入时必须登记元数据
- 定期清理无用数据
坑二:小文件问题
实时写入导致大量小文件,查询性能越来越差。
解决:
- 写入时做小文件合并
- 定期执行小文件合并任务
- 使用Hudi或Iceberg表格式
坑三:数据质量差
原始数据质量差,直接影响下游分析。
解决:
- 建立数据质量规则
- 数据接入时做质量检查
- 质量不达标的数据隔离
- 定期出数据质量报告
坑四:性能不达标
直接查询原始数据,性能很差,用户抱怨查询慢。
解决:
- 建立汇总层,预计算常用指标
- 使用列式存储格式
- 优化分区和分桶
- 使用更快的查询引擎(Presto、StarRocks)
坑五:权限混乱
数据湖的数据没有权限控制,谁都能看所有数据,有安全风险。
解决:
- 建立统一的权限管理系统
- 基于角色的访问控制
- 敏感数据脱敏
- 数据访问审计
十一、最佳实践
总结一些最佳实践:
- 先治理,后建设:数据治理要和数据湖建设同步进行,不要等数据堆成山了再治理
- 分层存储:ODS、DWD、DWS、ADS分层,职责清晰
- 列式存储:处理后的数据用Parquet或ORC格式
- 合理分区:按时间和业务维度分区,提升查询性能
- 小文件合并:定期合并小文件,保持性能
- 元数据先行:数据接入必须登记元数据
- 质量监控:建立数据质量监控,及时发现问题
- 权限管控:从一开始就做好权限管理
- 成本控制:定期清理无用数据,控制存储成本
- 持续优化:数据湖建设是长期的过程,要持续优化
十二、写在最后
数据湖建设,是一个系统工程,不是简单地买一套工具就完事了。
它涉及数据接入、存储、计算、治理、服务等多个方面,需要架构设计、技术选型、团队协作、流程规范等多方面的配合。
高可用和高并发,是数据湖的基本要求。存储要可靠,计算要弹性,服务要稳定,查询要快速。
2022年了,数据湖技术已经比较成熟,Hudi、Iceberg、Delta Lake等表格式的出现,让数据湖的治理更加方便。云厂商也提供了托管的数据湖服务,降低了建设门槛。
但无论技术怎么发展,数据治理的理念是不变的:数据要有组织、有质量、有安全、有价值。
最后,用一句话总结:"数据湖建设,技术是基础,治理是关键,价值是目标。高可用保障数据不丢,高并发保障服务可用,治理保障数据有用。"
愿你的数据湖,不是数据沼泽,而是真正有价值的数据资产。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录