行业新闻
企业对数据访问的便捷性、高效性的需求从未降低,并且对数据实时性要求越来越高,需求点包括海量离线分析、实时数据预警布控、全文检索、人工智能等,但当前不管商用还是开源领域,湖仓一体架构只是一个过渡方案,并未真正体现一体化结构,要实现同一业务数据的离线分析、全文检索等场景,需要显性地将一份数据存储到多个对应引擎,带来了数据冗余存储、维护成本高、学习成本高等问题,另外大数据初期阶段就是针对不同的场景,开发独立的引擎解决对应问题,所以出现了很多独立的框架和引擎,随着技术的发展,将会出现大一统的引擎,降低架构的复杂性,减少数据搬迁,让关注重心回到业务本身。
在当前大数据、数据湖蓬勃发展的阶段,已经很少有人再讲数据仓库,再谈数据仓库似乎已经过时了。曾经我也有这样的想法,但是随着对不同行业需求理解的加深,数据仓库这套指导理论,还是有很强的实用性和必要性,特别是对刚涉足大数据领域的新人,深入理解其底层逻辑,对大数据体系的理解会有很大的帮助。
首先从逻辑架构上理解数据仓库与其他组件系统的关系,明确其所处的位置,才能从整体上理解它的作用。如下图所示:
从数据的流入流出过程,可以分为三层:源数据、数据仓库、数据应用,数据仓库只是一个中间桥梁。
从上图可以知道,数据仓库本身不生产数据,数据是从业务系统采集到数据仓库,也体现了为什么叫“仓库”,而不是“工厂”。从业务系统采集数据到数据仓库的过程叫做“ETL”(抽取Extra, 转化Transfer, 装载Load);
一般企业:一般企业可能拥有一系列的业务系统以支持其日常运营和战略决策,这些系统往往是企业资源计划(ERP)系统的重要组成部分。其中包括:财务管理系统、供应链管理系统、客户关系管理系统、人力资源管理系统、库存管理系统、采购系统、生产管理系统、项目管理系统等;
政务行业:政务行业会使用各种业务系统来提高行政效率、服务质量和公共管理水平,能够支持政府的日常运营和提供公共服务。其中包括:房地产管理系统、社会保障系统、医疗卫生信息系统、教育管理系统、税务管理系统、城市管理系统等;
电信行业:电信行业是一个高度技术化的领域,拥有多种复杂的业务系统以支持其广泛的服务和运营,确保电信服务的稳定性、高效性和创新性方面起着至关重要的作用。其中包括:计费系统、号码管理系统、营销管理系统、客户关系管理系统、运营支撑系统、欺诈管理系统等;
公安行业:公安行业使用多种专业的业务系统来维护社会治安、预防和侦破罪案,以及提供公共服务,并提高了工作效率和数据追踪的准确性。其中包括:110报警服务系统、户籍管理系统、交通管理系统、出入境管理系统、治安管理系统、信息指挥调度系统等;
除了企业、单位的内部业务系统数据,数据仓库还会从外部采集数据,以提高数据仓库的数据应用能力。
通过ETL工具从数据源中提取数据,然后进行转换并加载到存储底层。存储底层的选择,在传统上可以是标准的关系型数据库,随着大数据的发展,更多地选择MPP数据库、Hadoop体系等。
元数据也是在这一层创建,包括业务元数据描述数据情境信息,技术元数据描述如何访问数据,包括数据的位置和结构,管理元数据描述权属和管理流程,包括所有权、管理权、使用权和审批流程等。
企业可以通过各种数据集成方法从源系统中提取数据并进行修改,从而提高一致性,助力快速分析。集成方法包括ETL(提取、转换、加载)、ELT、实时数据复制、批量加载处理、数据转换以及数据质量和其他服务,所以数据仓库日常的管理和运维工作,大部分精力就是保持ETL的正常和稳定。
数据应用是用户借助工具与数据仓库的数据进行交互,访问工具包括明细查询型应用、数据探索型应用、标签画像型应用、统计分析型应用等;
数据仓库的功能架构总体分成数据集成、数据存储与管理、数据共享与分析三大功能模块,如下图所示:
数据仓库是面向主题的、集成的、相对稳定的、反映历史变化的数据集合,主要用于支持管理决策和信息的全局共享,是一个经过优化的数据库,用于分析来自事务系统和业务应用的数据的关系型数据库。这是业界对数据仓库的定义,为了更好理解这几个关键词,我将我对其的理解图形化,如下图所示:
那为什么要面向主题?对于业务系统而言,数据是基于OLTP操作组织优化的,面向某一业务场景和用户提供的功能。数据仓库从各业务系统采集数据后,需要重新整理组织数据,使用面向主题的形式才更加有利于分析。以大型图书馆为例子,图书馆有各种各样的图书、杂志、报纸、影音资料等,这些信息资源都是有秩序地分类存放的,比如,所有有关历史的书放在历史区、科技类的放在科技区,而不是按购买时间或者书的颜色来分类,方便人们查找阅读。在数据仓库中,也是按照这样的“分类”存储数据的,数据被分类存储是为了更好地服务某个特定“主题”或领域,比如销售、财务、客户等。每个主题都包含了与之相关的信息,这样做的目的是为了那些对某一领域感兴趣或某一领域工作的人,能够快速、方便地获取他们需要的所有信息。
所以,数据仓库被设计为面向主题的,就意味着它是围绕着一个个具体的主题或业务领域来组织和存储数据,这样不仅有助于维护数据的结构性,还易于从多个角度分析数据,支持决策和策略制定。
数据仓库本身不生产数据,都是从分散的业务系统数据库中采集集成的,这点应该很好理解,不必细说。
业务系统数据库的数据通常实时更新,数据根据需要及时发生变化,添加、修改、删除等操作。数据仓库的数据主要提供企业决策分析使用,所设计的数据操作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询操作,但修改和删除操作很少,通常只需要定期加载、刷新,如按日、按周、按月等周期性变化。
业务系统的数据库主要关心当前某一个时间段内的数据,而数据仓库中的数据通常包含历史信息,数据仓库记录了企业从过去某一个时间点到目前的各个阶段的信息,通过这些信息,可以对企业发展历程和未来趋势做出定量分析和预测。
在理解数据仓库分层设计内容之前,是不是想问一个问题:数据仓库为什么要分层?
数据仓库分层架构设计的满足了数据应用对各层数据的需求,也体现了分层的好处,具体的分层内容和应用场景,如下图所示:
上图是典型的数据仓库分层,在不同的企业和行业,会根据实际的业务场景进行调整,有三层、四层、五层等,没有很硬性的分层规定。
如下图所示,其实这算不上一张技术架构图,只是为了说明传统的数据仓库,与下文讲到的数据湖、湖仓一体做对比,在技术选型很简单。
从上图可以知道,传统的数据仓库技术架构很简单,就是选定一款数据库,依靠数据库能力处理结构化数据,完成数据分层管理,数据统计分析决策。
如果将上面的分层架构设计认为是数据仓库的第一层方法论,那维度建模应该是第二层方法论,这是前人经验总结沉淀下来的实践。以产品销售为例,分别列举了其星型模型和雪花模型的设计示例,如下图所示:
上图是典型的数据仓库维度建模的模型,从维表数据结构、复杂性和性能、易用性、维护性的角度做了对比,实际上用得比较多的是星型模型,也建议使用星型模型,其总体上趋于简单、好理解、使用方便。
围绕业务过程来设计,事实表一般分为三类,事务事实表、周期快照事实表、累积快照事实表,具体用途和区别,如下图所示:
如上图所示的事务事实表,用于DWD层较多。周期快照事实表用于DWS层较多。累积快照事实表用得较少,主要也是用于DWD层。
维度表是维度建模的基础和灵魂,每一个维度是否观察事物的一个视窗,通过维度框定数据的范围,分析其在该维度视窗下的业务意义。其中维度沉淀尤为重要,关系到后续数据应用的便利性,要做好维度沉淀需要对业务有深入的理解。
缓慢变化维其实是维度建模的一个特性,或者是一个如何解决数据随时间变化的问题,将在下文“变更数据的一般处理方式”中,再举例说明。
例如我们要分析产品销售情况,可以从产品维、地区维、时间维做统计分析。看它某个地区的时间趋势上的变化,每个月的销售情况,环比、同比等。
其实可以把维度的一个切片看做是一个视窗,如照相机镜头框住的,通过二维、三维的方式分析数据。在可视化上,最简单的是通过折线图直观呈现趋势。
表级规范比较推荐的是按数仓分层作为表的前缀,直观清晰知道该表的所在分层。业务域和数据域都需要前期做了明确的业务规划才能定义出来,所以在实际落地一般没有很严格的遵守。具体规范建议,如下图所示:
一般建议规范,并不是强制要求。其中表的扩展字段是比较有必要再详细说明的。
ETL创建时间字段。该字段的作用是标识每条数据记录从业务系统采集到数据仓库的首次时间(要求只写入一次,不作更改),可用于数据质量的及时性指标计算(ETL创建时间-业务创建时间)、跟踪数据到达数据仓库的时间周期;
ETL修改时间字段。该字段的作用是标识每条数据记录从业务系统采集到数据仓库的最新时间(每次写入、修改都更新),也可用于数据质量的及时性指标计算(ETL修改时间-业务更新时间)、跟踪数据到达数据仓库的时间周期、以及作为后续数据处理的增量标识(因为有些数据可能没有业务更新时间);
ETL批次ID。该字段主要用于数据对账和跟踪,按批次记录数据量,按批次核对数据,但是也要求业务系统的数据有批次的概念,有相应的对账信息;
记录IDU标识。该字段主要适用于CDC日志类数据,完整记录数据变化过程,包括Insert、Delete、Update;
其实里面很多要求都可以单独整理一篇来细说,如数据安全管理、数据血缘、数据权责管理等,以后有机会再整理了。
前面提到的缓慢变化维,一般有四种处理方式,直接覆盖、拉链表、扩展字段、历史轨迹表,需要综合项目的实际情况来抉择,没有最好只有最合适。具体处理方式和场景,如下图所示:
一个好的数据仓库建设过程,其实也类似软件开发的生命周期过程,包括需求分析、设计、开发、测试等环节,如下图所示:
其中需求分析、源数据分析是很容易被数据开发人员忽视,但是是很重要的环节。每个环节的输出,都是下一环节的输入,只有每个环节都做到实处,才能保证数仓建设质量。
源数据分析是数据真正执行进入数据仓库前,从技术的角度进行验证,可以从数据源注册、数据探查、数据定义三个方面分析,如下图所示:
数据的清洗转换目标是得到一份高质量的数据,包括删除脏数据、格式转换为统一、内容变换为标准、根据关键内容关联更多信息,丰富原内容,减少关联。简单示例如下图所示:
以上是数据仓库的主要内容,只是整理了一个大方框,里面有很多细节并没有涉及,并且在实际的建仓过程中,要根据行业的业务特性做调整,还是那句话,没有最好的设计,只有最合适的。
从当前发展的现状看,我认为数据湖架构更适合一个大型组织,数据仓库更适合一个公司或企业。下文也会进一步从技术、存在的问题等说明。
其实也说明了数据湖的出现,并不是单纯地替换数据仓库,而是扩展数据仓库的能力,从面向统计的决策分析,过渡到更实时、更直接支撑业务应用的场景。
十八般武艺,能用的够用上了,基于开源技术搭积木式解决问题。下图采用自Hudi的网站,旨在为了说明技术组件的多样性,如下图所示:
其实还是很多引擎没体现出来,如全文检索ElasticSearch、图数据库、分布式消息队列、资源调度引擎等,每一个引擎都针对特定场景,解决某单一问题。要想组装一个覆盖完整业务场景的数据湖平台,其技术复杂性非常大。
面向企业的数据仓库技术与低廉的数据湖存储技术相结合,为企业提供一个统一的、可共享的数据底座,避免传统的数据湖、数据仓库之间的数据移动和复制,将原始数据、加工清洗数据、模型化数据,共同存储于一体化的“湖仓”中,既能面向业务实现高并发、精准化、高性能的历史数据、实时数据的查询服务,又能承载分析报表、批处理、数据挖掘等分析型业务。最终目标都是充分发挥两者的优势并提升企业数据管理和分析效率。
实时数仓是要从技术上,进一步提高数据应用的时效性,但是出现数据延迟可见是由于平台支持程度导致的,在客观上数据是无延迟的,但是由于物理割裂、计算模型必然会有延迟,自然无法实现。
为了实现批流一体,业界提出了Lambda、Kappa的架构,如下图所示:
以上的流批一体架构还是很复杂,更简单的是基于全场景的MPP数据库构建实时数仓,如下图所示:
该架构适用于一般的公司级和企业实时数仓构建,不管从技术复杂性、人员技能要求、成本收益上考虑,都是一个比较好的选择。
不管技术如何发展、架构如何演进,其实数仓的建设都是为了数据价值化,从数据资源到数据资产,再到数据产品和数据知识。