当前位置: 首页 > news >正文

银行数仓分层架构

一、为什么要对数仓分层

实现好分层架构,有以下好处:
1清晰数据结构:
每一个数据分层都有对应的作用域,在使用数据的时候能更方便的定位和理解。

2数据血缘追踪:
提供给业务人员或下游系统的数据服务时都是目标数据,目标数据的数据来源一般都来自于多张表数据。若出现目标数据异常时,清晰的血缘关系可以快速定位问题所在。而且,血缘管理也是元数据管理重要的一部分。

3减少重复开发:
数据的逐层加工原则,下层包含了上层数据加工所需要的全量数据,这样的加工方式避免了每个数据开发人员都重新从源系统抽取数据进行加工。

4数据关系条理化:
源系统间存在复杂的数据关系,比如客户信息同时存在于核心系统、信贷系统、理财系统、资金系统,取数时该如何决策呢?数据仓库会对相同主题的数据进行统一建模,把复杂的数据关系梳理成条理清晰的数据模型,使用时就可避免上述问题了。

5屏蔽原始数据的影响:
数据的逐层加工原则,上层的数据都由下一层的数据加工获取,不允许跳级取数。而原始数据位于数仓的最底层,离应用层数据还有多层的数据加工,所以加工应用层数据的过程中就会把原始数据的变更消除掉,保持应用层的稳定性。

二、银行数仓常见的四层架构

银行数仓分层与阿里大数据之路的分层架构类似,核心思想都是分层治之
1)【贴源层】
具备源系统数据归集到数仓的缓冲层;

2)【标准层】
具备数据标准化及合并全量数据的标准层。

3)【主题层】
具备主题划分及明细数据整合的主题层。

4)【应用层】
具备提供数据服务给下游系统使用的集市层,或称为应用层。

【总结】
这是银行项目常见的分层架构,在此基础上可以根据银行本身的业务特性继续细分,如标准层可在细化为:数据预处理、数据轻度汇总层等等
在这里插入图片描述

三、详解各层的主要职责

1、【ODM(Origin Data Manager)贴源层】
主要用于源系统提供的 T-1 增量文本数据按源系统一致的数据结构入库到数据库。为什么要把源系统数据(简称源数据)入库到数据库,而不是直接合并到全量数据呢?存在以下原因:

1)将文本数据转为为二维表实则是将非结构化数据转化为结构化数据,利于服务器的存储、计算、使用,同时也对数据的下游使用方更友好。直接处理文本数据的话,要先把文本数据加载到内存上,要是数据大小超过 GB 级别,对服务器内存压力可不小。所以该处理方式对服务器硬件要求高,假如把文本数据先通过数据库落地到磁盘上,可以减轻后续处理的硬件压力。另外,文本数据本身是没有结构的,直接处理时还得虚拟成二维表才容易处理,但是文本数据加载到数据库后自动形成二维表,便于后续处理。

2)由于 ODM 位于数仓的最底层,一旦源数据入库出错,可从最底层隔断后续的数据加工流程,避免把错误的源数据入库到标准层引发连环生产问题。

3)当发现上层数据异常时,可通过 ODM 排查根因是否出现在源数据上。

ODM 的建设分为源数据抽取及源数据入库两部分。源数据抽取的处理方式有两种,一种是由源系统的技术团队按照数仓要求的接口格式,抽取数据推送到数仓来实现,另一种是由专门的 ETL 团队负责源数据抽取及源数据入库的实现。部分企业会选择第一种实现方式,这是因为缺乏专门的 ETL 团队承担,或者不希望 ETL 团队多接活(接锅)。事实上,为了从根本上保证数仓的数据质量,还是用第二种方式实现才是最好的,这也是企业建设数仓时会忽略的一点。

ODM 看似是数仓里的最底层,也是最容易实现的层级,因为数据结构与源系统一致,保证数据正常入库即可。但是保证数据正常入库,真的是那么容易实现吗?大家是否遇到过以下问题:

源数据抽取到数仓,没有任何保证数据完整性的措施,过段时间后才发现数仓漏数了,又得从源系统进行数据初始化;

一旦源数据抽取出现异常,缺乏预警通知机制,只有在数仓加载数据时才发现数据尚未推送过来,影响后续数据加工;

源系统出现数据模型的新增或变更后,没有及时通知数仓,到数仓加载数据出现报错时才发现,逼着数仓进行紧急变更。

上述问题的出现,就是因为没有把握到 ODM 建设的核心,构建一条完善的数据抽取——数据入库的 ETL 路线。ODM 建设的核心有以下方面:

1)建立数据抽取——数据入库的全流程校验机制。进行数据抽取时,把落地的文本数据记录数与源系统抽取记录数进行匹对,即可完成数据抽取的完整性校验。进行数据入库时,把入库的记录数与文本数据的记录数进行匹对,即可完成数据入库的完整性校验。

2)使用元数据管理工具,定时同步源系统的数据结构到数仓进行比对,当发现差异时及时预警。

3)由于数据抽取及数据入库的处理流程都是固定的,可固化为一套程序,未来源系统出现新增或者变更需求时,只需处理好映射关系即可,无须重复开发处理流程。

4)建设预警机制,笔者比较推荐使用短信预警通知,这样无论是否在公司,都可以实时了解到 ETL 作业的执行情况,及时对异常进行处理。当然,由于生产环境的操作权限在运维团队手上,预警机制还需要运维团队配合一起实现。

2、【SDM(Standard Data Manager)标准层】
SDM 的数据处理主要分为两部分,一部分是源数据清洗及标准化,另一部分是合并全量数据。

由于源数据的质量参差不齐,为了使数仓内的数据是标准规范的,所以对源数据要按照数据标准,进行数据清洗和标准化转换(PS:由于源数据已入库到 ODM,所以数据清洗及标准化转换都是在数据库层面进行,再次体现 ODM 建设的必要性)。数据标准由数据管理团队负责制定的,所以数仓建设团队也要与数据管理团队深度合作才能做好数据标准化的动作。

这里可能有个疑问,数据清洗与标准化的动作能否放在 ODM 完成呢?答案是不能,因为 ODM 目标是要求入仓数据与源数据完全一致。若 ODM 已对源数据进行了清洗与标准化动作,未来排查数据异常时就不能根据 ODM 来排查根因是否出于源数据了。

合并全量数据的方式有三种,分别为全量更新、增量变更及增量流水。

全量更新,数据抽取时把源系统表的数据全量抽取过来,该更新方式只需把 SDM 对应表的数据先清空,在入库标准化后的数据即可。

增量变更及增量流水,数据抽取时把源系统表内变化的数据抽取过来。两者区别是,增量变更的数据除了包含新增数据外,还包含对历史数据有变更的数据,而增量流水的数据只包含新增数据。

增量流水的数据处理方法相对简单,直接把增量数据入库到表内即可。增量变更的数据一般采用拉链模型来处理,这样既保证可以查询到任意时刻的历史全量快照,也可以减少数仓的存储空间。拉链模型,顾名思义,就是把历史变化的数据一环扣一环,就像链子一样串联起来。当查询数据时,按照扣环上的时间标识进行查询即可。具体实现方式为第一次入库的全量数据,把开始时间记录为入库日期,结束时间记录为永久日期(比如 2999-12-31)。后续入库增量的数据涉及历史数据变更时,把出现变更的旧数据的结束时间记录为当前入库的日期,再把新数据的开始时间记录为当前入库的日期,结束时间记录为永久日期,并写入到表里。这样,要查询历史时点数据,根据开始日期和结束日期的范围查询即可。
在这里插入图片描述
但是,拉链模型有两个明显的缺陷,一个是当发现拉链表内某一扣环的数据异常时,拉链表应如何恢复准确性与完整性,另一个是随着数据不断增加,拉链表会越来越大,每日拉链操作的效率会越来越低。

3、【FDM(Finance Data Manager)金融主题层】
为了让复杂的源数据变得容易理解及使用,必须按照相同的金融主题把数据整合到同一套模型中,对 SDM 数据进行明细级的数据整合汇总。主题设计的数量不宜太多,否则整个 FDM 就达不到简化的作用。FDM 是数仓模型设计的关键,ODM 与 SDM 的数据结构都与源系统数据结构一致(SDM 的数据结构会多一层标准化),模型设计难度不大,但是 FDM 要化繁为简,非常考验建模师对业务的理解及建模经验。FDM 是后续数据分析及数据集市加工的基础,核心是数据关系的简化及复用,设计不好反而会成为整个数仓的累赘,食之无味弃之可惜。由于文章篇幅关系,FDM 的金融主题划分与建模思路未来会展开新的文章进行讨论。

可能会有疑问,能否不建设 FDM,集市数据及数据分析直接从 SDM 进行呢?答案是能,但是后续维护的代价非常大,主要有以下原因:

1)FDM 的核心之一是数据复用,缺乏 FDM 的话,相同数据加工都必须编写重复的处理逻辑实现,技术团队的开发量会大大增加;

2)FDM 的核心之二是数据关系简化,缺乏 FDM 的话,每个数据开发工程师都要理解各个源系统之间的数据关系,开发门槛极高,最终导致技术团队实施成本过高;

3)假如 ADM 是从 SDM 加工获得,源系统发生任意变更,都会影响到 ADM,这时 ADM 的稳定性就无从谈起。笔者的公司曾经试过信审系统重构从而新信审系统的数据模型变化极大,而当时数仓缺乏共性整合的 FDM,导致本次变更对依赖数仓的数据应用造成难以估量的影响。而且由于需求分析阶段没有识别到这个风险点,最终导致信审系统重构项目被迫延迟 2 个月才能上线,而数仓为了减少对数据应用的影响,把源系统的变更放在 SDM 内实现,这就是 FDM 的重要性。有 FDM 的话,所有源系统的变更都可以在 SDM 加工到 FDM 的过程进行屏蔽,这样数仓会更加适应源系统引发的变更。

另外,为什么 FDM 是明细级数据的加工呢?这是为了建设数据自助分析平台做准备的。假如是高度汇总的指标数据,业务人员一旦对指标口径发生变更,技术人员就会疲于奔命的变更指标的逻辑代码来满足业务人员的需求。而明细级数据可以为业务人员提供自由组合的业务逻辑,技术人员只需要不断扩展 FDM 就可以满足业务人员频繁变动的需求了。

4、【ADM(Application Data Manager)应用层】
应用层就是以特定业务场景为目标而高度汇总的数据,一般以数据集市的形态呈现,比如大家常说的营销集市、风险集市、绩效集市。由于数据集市的建设对应的是特定且独立的业务场景,几无共性可言,所以必须对每类集市进行单独说明。

四、对比与总结
银行数仓分为四层:贴源层、标准层、主题层、应用层。
阿里大数据之路将数仓分为四层:ODS层(源数据层)、DWD层(数据明细层)、DWS层(轻度汇总层)、DIM层(维度层)、ADS层(数据应用层)
若数仓数据量比较大,业务逻辑比较复杂还可以再次基础上,创建DWT层(数据主题层),在轻度汇总层的基础上,再按照主题进行基于业务逻辑的汇总,方便数据数据应用层的调用和加工。

相关文章:

银行数仓分层架构

一、为什么要对数仓分层 实现好分层架构,有以下好处: 1清晰数据结构: 每一个数据分层都有对应的作用域,在使用数据的时候能更方便的定位和理解。 2数据血缘追踪: 提供给业务人员或下游系统的数据服务时都是目标数据&…...

Go并发编程的学习代码示例:生产者消费者模型

文章目录 前言代码仓库核心概念main.go(有详细注释)结果总结参考资料作者的话 前言 Go并发编程学习的简单代码示例:生产者消费者模型。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (g…...

求a的n次幂

文章目录 求a的n次幂程序设计程序分析求a的n次幂 【问题描述】要求利用书上介绍的从左至右二进制幂算法求a的n次幂; 【输入形式】输入两个正整数,一个是a,一个是n,中间用空格分开 【输出形式】输出一个整数 【样例输入】2 10 【样例输出】1024 【样例输入】3 4 【样例输出】…...

word脚标【格式:第X页(共X页)】

不得不吐槽一下这个论文,真的我好头疼啊。我又菜又不想改。但是还是得爬起来改 (是谁大半夜不能睡觉加班加点改格式啊) 如何插入页码。 格式、要求如下: 操作步骤: ①双击页脚,填好格式,宋体小四和居中都…...

Linux --- 软件安装、项目部署

一、软件安装 1.1、软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 1.2、安装JDK 上述我们介绍了Linux系统软件安装的四种形式,接下来我们就通过第一种(二进制发布包)形式来安装 JDK。 JDK…...

MATLAB应用笔记

其他 1、NaN值 MATLAB判断数据是否为NaN可以直接使用函数:isnan() 三、数据分析 1、相关性 均值、方差、协方差、标准差、相关系数 mean() %均值 nanmean()%去除NAN值求均值 var() %方差 cov() %协方差 std() %标准差 corrcoef(B,b) %R 相关系数plot()…...

ERTEC200P-2 PROFINET设备完全开发手册(6-2)

6.2 诊断与报警实验 首先确认固件为 App1_STANDARD, 将宏定义改为: #define EXAMPL_DEV_CONFIG_VERSION 1 参照第6节的内容,编译和调试固件,并在TIA Portal 中建立RT项目。启动固件后,TIA Portal 切换到在线,可以看…...

算法套路八——二叉树深度优先遍历(前、中、后序遍历)

算法套路八——二叉树深度优先遍历(前、中、后序遍历) 算法示例:LeetCode98:验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只…...

视频批量剪辑:如何给视频添加上下黑边并压缩视频容量。

视频太多了,要如何进行给视频添加上下黑边并压缩视频容量?今天就由小编来教教大家要如何进行操作,感兴趣的小伙伴们可以来看看。 首先,我们要进入视频剪辑高手主页面,并在上方板块栏里选择“批量剪辑视频”板块&#…...

那些你需要知道的互联网广告投放知识

作为一个合格的跨境电商卖家,我们除了有好的产品之外,还要知道怎么去营销我们自己的产品。没有好的推广,即使你的产品有多好别人也是很难看得到的。今天龙哥就打算出一期基础的互联网广告投放科普,希望可以帮到各位增加多一点相关…...

【hello Linux】进程程序替换

目录 1. 程序替换的原因 2. 程序替换原理 3. 替换函数 4. 函数解释 5. 命名理解 6.简陋版shell的制作 补充: Linux🌷 1. 程序替换的原因 进程自创建后只能执行该进程对应的程序代码,那么我们若想让该进程执行另一个“全新的程序”这 便要用…...

【网络应用开发】实验4——会话管理

目录 会话管理预习报告 一、实验目的 二、实验原理 三、实验预习内容 1. 什么是会话,一个会话的生产周期从什么时候,到什么时候结束? 2. 服务器是如何识别管理属于某一个特定客户的会话的? 3. 什么是Cookie,它的…...

Linux服务器怎么分区

Linux服务器怎么分区 我是艾西,linux系统除了从业某个行业经常要用到的程序员比较熟悉,对于小白或只会用Windows系统的小伙伴还是会比较难上手的。今天艾西简单的跟大家聊聊linux系统怎么分区,让身为小白的你也能一眼看懂直接上手操作感受程序…...

传统机器学习(四)聚类算法DBSCAN

传统机器学习(四)聚类算法DBSCAN 1.1 算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。 该算法将具有足够密度的区域划分为簇,并在…...

“华为杯”研究生数学建模竞赛2020年-【华为杯】A题:ASIC 芯片上的载波恢复 DSP 算法设计与实现(附获奖论文及matlab代码实现)

目录 摘 要: 1.问题重述 1.1 问题背景 1.2 问题提出 1.3 研究基础 2.模型假设和已知...

1043.分隔数组以得到最大和

题目: 给你一个整数数组 arr,请你将该数组分隔为长度 最多 为 k 的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。 返回将数组分隔变换后能够得到的元素最大和。本题所用到的测试…...

微服务治理框架(Istio)的认证服务与访问控制

本博客地址:https://security.blog.csdn.net/article/details/130152887 一、认证服务 1.1、基于JWT的认证 在微服务架构下,每个服务是无状态的,由于服务端需要存储客户端的登录状态,因此传统的session认证方式在微服务中不再适…...

数据结构 | 排序 - 总结

排序的方式 排序的稳定性 什么是排序的稳定性? 不改变相同数据的相对顺序 排序的稳定性有什么意义? 假定一个场景: 一组成绩:100,88,98,98,78,100(按交卷顺序…...

crontab -e 系统定时任务

crontab -e解释 crontab 是由 “cron” 和 “table” 两个单词组成的缩写。其中,“cron” 是一个在 Linux 和类 Unix 操作系统中用于定时执行任务的守护进程,而 “table” 则是指一个表格或者列表,因此 crontab 就是一个用于配置和管理定时任…...

前后端交互系列之Axios详解(包括拦截器)

目录 前言一,服务器的搭建二,Axios的基本使用2.1 Axios的介绍及页面配置2.2 如何安装2.3 Axios的前台代码2.4 Axios的基本使用2.5 axios请求响应结果的结构2.6 带参数的axios请求2.7 axios修改默认配置 三,axios拦截器3.1 什么是拦截器3.2 拦…...

定时任务之时间轮算法

初识时间轮 我们先来考虑一个简单的情况,目前有三个任务A、B、C,分别需要在3点钟,4点钟和9点钟执行,可以把时间想象成一个钟表。 如上图中所示,我只需要把任务放到它需要被执行的时刻,然后等着时针转到这个…...

实验4 Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础; ②运用Matplotlib,实现数据集的可视化; ③运用Pandas访问csv数据集。 2. 实验内容 ①绘制散点图、直方图和折线图,对数据进行可视化; ②下载波士顿数房价据集,并…...

【软件工程】为什么要选择软件工程专业?

个人主页:【😊个人主页】 文章目录 前言软件工程💻💻💻就业岗位👨‍💻👨‍💻👨‍💻就业前景🛩️🛩️🛩️工作环…...

5类“计算机”专业很吃香,人才缺口巨大,就业前景良好

说到目前最热门的专业,计算机绝对占有一席之地,是公认的发展前景好、人才缺口大的专业。有人称该专业人数如此众多,势必会导致人才饱和,但是从当前社会互联网发展的趋势来看,计算机专业在很长一段时间都是发展很好的专…...

数仓选型对比

1、数仓选型对比如下(先列举表格,后续逐个介绍) 数仓应用目标产品特点适用于 适用数据类型数据处理速度性能拓展 实施难度运维难度性能优化成本传统数仓(SQLServer、Oracle等关系型数据库)面向主题设计的,为 分析数据而设计基于Oracle、 SQLServer、MyS…...

二叉树的遍历(前序、中序、后序)Java详解与代码实现

递归遍历 前序,中序,后序 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, Tree…...

如何找出消耗CPU最多的线程?

如何找出消耗CPU最多的线程? 1.使用 top -c 找出所有当前进程的运行列表 top -c 2.按P(Shiftp)对所有进程按CPU使用率进行排序,找出消耗最高的线程PID ​​​ 显示Java进程 PID 为 136 的java进程消耗最 3.使用 top -Hp PID,查出里面消…...

【论文笔记】Attention Augmented Convolutional Networks(ICCV 2019 入选文章)

目录 一、摘要 二、介绍 三、相关工作 卷积网络Convolutional networks: 网络中注意力机制Attention mechanisms in networks: 四、方法 1. 图像的自注意力Self-attention over images: 二维位置嵌入Two-dimensional Positional Enco…...

虚幻图文笔记:Character Creator 4角色通过AutoSetup For Unreal Engine插件导入UE5.1的过程笔记

在UE5端安装AutoSetup For Unreal Engine插件 AutoSetup For Unreal Engine是Reallusion官方提供的免费插件,官方下载地址,下载到的是一个可执行文件,点击安装,记住安装的位置⬇ 看装完毕后会打开一个文件夹,这里就是对…...

JAVAWeb04-DOM

1. DOM 1.1 概述 1.1.1 官方文档 地址: https://www.w3school.com.cn/js/js_htmldom.asp 1.1.2 DOM 介绍 DOM 全称是 Document Object Model 文档对象模型就是把文档中的标签,属性,文本,转换成为对象来管理 1.2 HTML DOM(文档…...