Back
Featured image of post 数据湖及其相关概念性调研

数据湖及其相关概念性调研

数据湖概念性调研

近期数仓建设统一实时数据系统和离线报表无从着手,亟需进行架构上的升级。以下是针对传统数仓的痛点而产生的数据湖概念性调研,也包括一些大数据基本概念的阐述。

数据仓库

  • 数据库(Database)
    传统的关系型数据库的主要应用是联机事务处理OLTP(On-Line Transaction Processing),主要是基本的、日常的事务处理,例如业务报表。 常见的Mysql,Oracle,MariaDB等。

  • 数据仓库(Datawarehouse)
    数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 常见的Hive,Druid等。

E.F.Codd提出了关于OLAP的12条准则:

  • OLAP模型必须提供多维概念视图
  • 透明性准则
  • 存取能力准则
  • 稳定的报表能力
  • 客户/服务器体系结构
  • 维的等同性准则
  • 动态的稀疏矩阵处理准则
  • 多用户支持能力准则
  • 非受限的跨维操作
  • 直观的数据操纵
  • 灵活的报表生成
  • 不受限的维与聚集层次

数据分层

数据分层的目的

  • 清晰数据结构
    每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
  • 数据血缘追踪
    简单来讲可以这样理解,我们最终给业务呈现的是一张能直接使用的业务表,但是它的来源有很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围。
  • 减少重复开发
    规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
  • 把复杂问题简单化
    把一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
  • 屏蔽原始数据的异常
    屏蔽业务的影响,不必改一次业务就需要重新接入数据。

收益

  • 清晰数据结构
    每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解

  • 减少重复开发
    规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算

  • 统一数据口径
    通过数据分层,提供统一的数据出口,统一对外输出的数据口径

  • 复杂问题简单化
    将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题

分层设计

[ODS] -> [DW] -> [APP]
  • 数据运营层( ODS )
    存放接入的原始数据。
  • 数据仓库层(DW)
    存放要重点设计的数据仓库中间层数据。
  • 数据应用层(APP)
    面向业务定制的应用数据

数据运营层ODS

是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的 ETL 之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。

一般来讲,为了考虑后续可能需要追溯数据问题,因此对于这一层就不建议做过多的数据清洗工作,原封不动地接入原始数据即可,至于数据的去噪、去重、异常值处理等过程可以放在后面的DWD层来做。

数据仓库层DW

数据仓库层是我们在做数据仓库时要核心设计的一层,在这里,从 ODS 层中获得的数据按照主题建立各种数据模型。 DW层又细分为 DWD(Data Warehouse Detail)层、DWM(Data WareHouse Middle)层和DWS(Data WareHouse Service)层。

  1. 数据明细层:DWD(Data Warehouse Detail)

该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。

另外,在该层也会做一部分的数据聚合,将相同主题的数据汇集到一张表中,提高数据的可用性。

  1. 数据中间层:DWM(Data WareHouse Middle)

该层会在DWD层的数据基础上,对数据做轻度的聚合操作,生成一系列的中间表,提升公共指标的复用性,减少重复加工。

直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。

  1. 数据服务层:DWS(Data WareHouse Service)

又称数据集市或宽表。按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。

一般来讲,该层的数据表会相对比较少,一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。

在实际计算中,如果直接从DWD或者ODS计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在DWM层先计算出多个小的中间表,然后再拼接成一张DWS的宽表。由于宽和窄的界限不易界定,也可以去掉DWM这一层,只留DWS层,将所有的数据在放在DWS亦可。

数据应用层

主要是提供给数据产品和数据分析使用的数据,一般会存放在 ES、PostgreSql、Redis等系统中供线上系统使用,也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。比如我们经常说的业务数据,一般就放在这里。


传统数仓痛点

传统数仓一般落地在HDFS中,这会导致一些问题

  1. 处理成本大
    批量导入到文件系统的数据一般都缺乏全局的严格schema规范,下游的Spark作业做分析时碰到格式混乱的数据会很麻烦,每一个分析作业都要过滤处理错乱缺失的数据,成本较大。
  2. 读取不友好
    数据写入文件系统这个过程没有ACID保证,用户可能读到导入中间状态的数据。所以上层的批处理作业为了躲开这个坑,只能调度避开数据导入时间段,可以想象这对业务方是多么不友好;同时也无法保证多次导入的快照版本,例如业务方想读最近5次导入的数据版本,其实是做不到的。
  3. 无法高效更新/删除历史数据
    parquet文件一旦写入HDFS文件,要想改数据,就只能全量重新写一份的数据,成本很高。事实上,这种需求是广泛存在的,例如由于程序问题,导致错误地写入一些数据到文件系统,现在业务方想要把这些数据纠正过来;线上的MySQL binlog不断地导入update/delete增量更新到下游数据湖中;某些数据审查规范要求做强制数据删除,例如欧洲出台的GDPR隐私保护等等。
  4. 文件系统负载大
    频繁地数据导入会在文件系统上产生大量的小文件,导致文件系统不堪重负,尤其是HDFS这种对文件数有限制的文件系统。
  5. 回溯成本高
    多份全量存储带来的存储浪费,数仓设计中为了保证用户可以访问数据某个时间段的历史状态,会将全量数据按照更新日期留存多份,故大量未变化的历史冷数据会被重复存储多份,带来存储浪费。
  6. 调度启动晚
    大规模的数据落地HDFS后,只能在凌晨分区归档后才能查询并做下一步处理; 数据量较大的RDS数据同步,需要在凌晨分区归档后才能处理,并且需要做排序、去重以及 join 前一天分区的数据,才能产生出当天的数据。
  7. 更新模式重
    存在较多数据的冗余更新增量数据的分布存在长尾形态,故每日数仓更新需要加载全量历史数据来做增量数据的整合更新,整个更新过程存在大量历史数据的冗余读取与重写,带来的过多的成本浪费,同时影响了更新效率。
  8. 重复读取多
    仅能通过分区粒度读取数据,在分流等场景下会出现大量的冗余 IO。

数据湖

概念

数据湖(Data Lake)是可以存储大量结构化、半结构化和非结构化数据的存储仓库。它是一个以其原生格式存储每种类型数据的场所,对帐户大小或文件没有固定限制。它提供大量数据,以提高分析性能和原生集成。

数据湖就像一个大容器,与真实的湖泊和河流非常相似。就像在湖中有多个支流进入一样,数据湖具有结构化数据,非结构化数据,机器对机器,实时流经的日志。

数据湖使数据更易处理,是一种经济高效的方式来存储组织的所有数据以供以后处理。数据分析师可以专注于发现数据中的有意义的模式,而不是数据本身。

与将数据存储在文件和文件夹中的分层数据仓库不同,Data lake具有扁平的体系结构。数据湖中的每个数据元素都有一个唯一的标识符,并用一组元数据信息进行标记。

数据湖VS数据仓库

参数 数据湖 数据仓库
数据 存储任何内容 仅关注业务流程
处理 大部分未经处理 高度处理
数据类型 非结构化,半结构化,结构化 表格形式和结构
任务 共享数据管理 针对数据检索进行了优化
敏捷 高度敏捷,根据需要配置和重新配置 较之不敏捷,配置固定
用户 数据科学家 业务专业人员
存储 低成本存储 快速响应的昂贵存储
EDW更换 可以作为EDW来源 与EDW互补(不可替代)
模式 读时模式(无预定义) 写时模式(预定义)
数据处理 帮助快速提取新数据 耗时
数据粒度
工具 Hadoop/ Map Reduce 主要商业工具

架构

示例架构

方案选型

存储引擎开源方案主要包括Hudi,Iceberg,Delta三大产品。

Hudi Iceberg Delta
引擎支持 Spark、Flink Spark、Flink Spark
原子语义 Delete/Update/Merge Insert/Merge Delete/Update/Merge
流式写入 支持 支持 支持
文件格式 Avro、Parquet、ORC Avro、Parquet、ORC Parquet
MOR能力 支持 不支持 不支持
Schema Evolution 支持 支持 支持
Cleanup能力 自动 手动 手动
Compaction 自动/手动 手动 手动
小文件管理 自动 手动 手动

Delta的房子底座相对结实,功能楼层也建得相对比较高,但这个房子其实可以说是databricks的,本质上是为了更好地壮大Spark生态, 在delta上其他的计算引擎难以替换Spark的位置,尤其是写入路径层面。

Iceberg的建筑基础非常扎实,扩展到新的计算引擎或者文件系统都非常的方便, 但是现在功能楼层相对低一点,目前最缺的功能就是upsert和compaction两个,Iceberg社区正在以最高优先级推动这两个功能的实现。

Hudi的情况要相对不一样,它的建筑基础设计不如iceberg结实, 举个例子,如果要接入Flink作为Sink的话,需要把整个房子从底向上翻一遍,把接口抽象出来,同时还要考虑不影响其他功能, 当然Hudi的功能楼层还是比较完善的,提供的upsert和compaction功能直接命中广大群众的痛点。

期待架构

  • 平台支持流批一体,统一实时与离线逻辑;
  • 利用Flink + Hudi技术栈搭建实时数仓,构建kafka -> ods -> dwd -> olap的实时数据链条,满足业务近实时需求
  • 利用hive构建数据分析系统,提供前端界面,实现低门槛数据分析

收益与风险

使用数据湖的主要好处如下:

  • 充分帮助产品化和高级分析
  • 提供经济高效的可扩展性和灵活性
  • 从无限的数据类型中提供价值
  • 降低长期持有成本
  • 允许经济的存储文件
  • 快速的适应变化
  • 数据湖的主要优势是不同内容源的集中化
  • 各个部门的用户可能遍布全球,可以灵活的访问数据

使用数据湖的风险如下:

  • 一段时间后,数据湖可能会失去相关性和动力
  • 数据湖的设计风险较大
  • 非结构化数据可能导致无法掌控的混乱、不可用的数据、不同且复杂的工具、企业范围的写作、统一、一致和通用问题
  • 增加了存储和计算的成本
  • 无法从数据打交道的其他与人那里得到见解
  • 数据湖最大的风险是安全和访问控制。有时,数据在没有任何监督的情况下放入湖中,某些些数据具有隐私和监管要求

参考文档

  1. https://www.cnblogs.com/itboys/p/10592871.html
  2. https://segmentfault.com/a/1190000020385389?utm_source=sf-related
  3. https://mp.weixin.qq.com/s?__biz=MzkwOTIxNDQ3OA==&mid=2247532544&idx=1&sn=86b24d40316f6b8d0be6c82606bcfb7f&source=41#wechat_redirect
  4. https://mp.weixin.qq.com/s/2WUZhMnNfY4mzEng9TZ2Uw
  5. https://segmentfault.com/a/1190000040715962
  6. https://zhuanlan.zhihu.com/p/346546088
Built with Hugo
Theme Stack designed by Jimmy