数据仓库架构理论和实践,数据仓库建模指南

数据仓库架构理论和实践,数据仓库建模指南

背景

在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据。在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据(DB)两类。对于业务DB数据来说,从MySQL等关系型数据库的业务数据进行采集,然后导入到Hive中,是进行数据仓库生产的重要环节。

如何准确、高效地把MySQL数据同步到Hive中?一般常用的解决方案是批量取数并Load:直连MySQL去Select表中的数据,然后存到本地文件作为中间存储,最后把文件Load到Hive表中。这种方案的优点是实现简单,但是随着业务的发展,缺点也逐渐暴露出来:

  • 性能瓶颈:随着业务规模的增长,Select From MySQL -> Save to Localfile -> Load to Hive这种数据流花费的时间越来越长,无法满足下游数仓生产的时间要求。
  • 直接从MySQL中Select大量数据,对MySQL的影响非常大,容易造成慢查询,影响业务线上的正常服务。
  • 由于Hive本身的语法不支持更新、删除等SQL原语,对于MySQL中发生Update/Delete的数据无法很好地进行支持。

为了彻底解决这些问题,我们逐步转向CDC(Change Data Capture)+ Merge的技术方案,即实时Binlog采集 + 离线处理Binlog还原业务数据这样一套解决方案。Binlog是MySQL的二进制日志,记录了MySQL中发生的所有数据变更,MySQL集群自身的主从同步就是基于Binlog做的。

本文主要从Binlog实时采集和离线处理Binlog还原业务数据两个方面,来介绍如何实现DB数据准确、高效地进入数仓。

整体架构

整体的架构如上图所示。在Binlog实时采集方面,我们采用了阿里巴巴的开源项目Canal,负责从MySQL实时拉取Binlog并完成适当解析。Binlog采集后会暂存到Kafka上供下游消费。整体实时采集部分如图中红色箭头所示。

离线处理Binlog的部分,如图中黑色箭头所示,通过下面的步骤在Hive上还原一张MySQL表:

  1. 采用Linkedin的开源项目Camus,负责每小时把Kafka上的Binlog数据拉取到Hive上。
  2. 对每张ODS表,首先需要一次性制作快照(Snapshot),把MySQL里的存量数据读取到Hive上,这一过程底层采用直连MySQL去Select数据的方式。
  3. 对每张ODS表,每天基于存量数据和当天增量产生的Binlog做Merge,从而还原出业务数据。

我们回过头来看看,背景中介绍的批量取数并Load方案遇到的各种问题,为什么用这种方案能解决上面的问题呢?

  • 首先,Binlog是流式产生的,通过对Binlog的实时采集,把部分数据处理需求由每天一次的批处理分摊到实时流上。无论从性能上还是对MySQL的访问压力上,都会有明显地改善。
  • 第二,Binlog本身记录了数据变更的类型(Insert/Update/Delete),通过一些语义方面的处理,完全能够做到精准的数据还原。

Binlog实时采集

对Binlog的实时采集包含两个主要模块:一是CanalManager,主要负责采集任务的分配、监控报警、元数据管理以及和外部依赖系统的对接;二是真正执行采集任务的Canal和CanalClient。

当用户提交某个DB的Binlog采集请求时,CanalManager首先会调用DBA平台的相关接口,获取这一DB所在MySQL实例的相关信息,目的是从中选出最适合Binlog采集的机器。然后把采集实例(Canal Instance)分发到合适的Canal服务器上,即CanalServer上。在选择具体的CanalServer时,CanalManager会考虑负载均衡、跨机房传输等因素,优先选择负载较低且同地域传输的机器。

CanalServer收到采集请求后,会在ZooKeeper上对收集信息进行注册。注册的内容包括:

  • 以Instance名称命名的永久节点。
  • 在该永久节点下注册以自身ip:port命名的临时节点。

这样做的目的有两个:

  • 高可用:CanalManager对Instance进行分发时,会选择两台CanalServer,一台是Running节点,另一台作为Standby节点。Standby节点会对该Instance进行监听,当Running节点出现故障后,临时节点消失,然后Standby节点进行抢占。这样就达到了容灾的目的。
  • 与CanalClient交互:CanalClient检测到自己负责的Instance所在的Running CanalServer后,便会进行连接,从而接收到CanalServer发来的Binlog数据。

对Binlog的订阅以MySQL的DB为粒度,一个DB的Binlog对应了一个Kafka Topic。底层实现时,一个MySQL实例下所有订阅的DB,都由同一个Canal Instance进行处理。这是因为Binlog的产生是以MySQL实例为粒度的。CanalServer会抛弃掉未订阅的Binlog数据,然后CanalClient将接收到的Binlog按DB粒度分发到Kafka上。

离线还原MySQL数据

完成Binlog采集后,下一步就是利用Binlog来还原业务数据。首先要解决的第一个问题是把Binlog从Kafka同步到Hive上。

Kafka2Hive

整个Kafka2Hive任务的管理,在美团数据平台的ETL框架下进行,包括任务原语的表达和调度机制等,都同其他ETL类似。而底层采用LinkedIn的开源项目Camus,并进行了有针对性的二次开发,来完成真正的Kafka2Hive数据传输工作。

对Camus的二次开发

Kafka上存储的Binlog未带Schema,而Hive表必须有Schema,并且其分区、字段等的设计,都要便于下游的高效消费。对Camus做的第一个改造,便是将Kafka上的Binlog解析成符合目标Schema的格式。

对Camus做的第二个改造,由美团的ETL框架所决定。在我们的任务调度系统中,目前只对同调度队列的任务做上下游依赖关系的解析,跨调度队列是不能建立依赖关系的。而在MySQL2Hive的整个流程中,Kafka2Hive的任务需要每小时执行一次(小时队列),Merge任务每天执行一次(天队列)。而Merge任务的启动必须要严格依赖小时Kafka2Hive任务的完成。

为了解决这一问题,我们引入了Checkdone任务。Checkdone任务是天任务,主要负责检测前一天的Kafka2Hive是否成功完成。如果成功完成了,则Checkdone任务执行成功,这样下游的Merge任务就可以正确启动了。

Checkdone的检测逻辑

Checkdone是怎样检测的呢?每个Kafka2Hive任务成功完成数据传输后,由Camus负责在相应的HDFS目录下记录该任务的启动时间。Checkdone会扫描前一天的所有时间戳,如果最大的时间戳已经超过了0点,就说明前一天的Kafka2Hive任务都成功完成了,这样Checkdone就完成了检测。

此外,由于Camus本身只是完成了读Kafka然后写HDFS文件的过程,还必须完成对Hive分区的加载才能使下游查询到。因此,整个Kafka2Hive任务的最后一步是加载Hive分区。这样,整个任务才算成功执行。

每个Kafka2Hive任务负责读取一个特定的Topic,把Binlog数据写入original_binlog库下的一张表中,即前面图中的original_binlog.db,其中存储的是对应到一个MySQL DB的全部Binlog。

上图说明了一个Kafka2Hive完成后,文件在HDFS上的目录结构。假如一个MySQL DB叫做user,对应的Binlog存储在original_binlog.user表中。ready目录中,按天存储了当天所有成功执行的Kafka2Hive任务的启动时间,供Checkdone使用。每张表的Binlog,被组织到一个分区中,例如userinfo表的Binlog,存储在table_name=userinfo这一分区中。每个table_name一级分区下,按dt组织二级分区。图中的xxx.lzo和xxx.lzo.index文件,存储的是经过lzo压缩的Binlog数据。

Merge

Binlog成功入仓后,下一步要做的就是基于Binlog对MySQL数据进行还原。Merge流程做了两件事,首先把当天生成的Binlog数据存放到Delta表中,然后和已有的存量数据做一个基于主键的Merge。Delta表中的数据是当天的最新数据,当一条数据在一天内发生多次变更时,Delta表中只存储最后一次变更后的数据。

把Delta数据和存量数据进行Merge的过程中,需要有唯一键来判定是否是同一条数据。如果同一条数据既出现在存量表中,又出现在Delta表中,说明这一条数据发生了更新,则选取Delta表的数据作为最终结果;否则说明没有发生任何变动,保留原来存量表中的数据作为最终结果。Merge的结果数据会Insert Overwrite到原表中,即图中的origindb.table

Merge流程举例

下面用一个例子来具体说明Merge的流程。数据仓库架构理论和实践,数据仓库建模指南数据仓库架构理论和实践,数据仓库建模指南数据仓库架构理论和实践,数据仓库建模指南数据仓库架构理论和实践,数据仓库建模指南

原文地址:https://www.cnblogs.com/ii33/p/11444014.html

时间: 2024-07-30 13:30:40

数据仓库架构理论和实践,数据仓库建模指南的相关文章

[数据仓库]-0023-独一无二的数据仓库建模指南系列教程升级版

2018最新最全大数据技术.项目视频.整套视频,非那种淘宝杂七杂八网上能免费找到拼凑的乱八七糟的几年前的不成体系浪费咱们宝贵时间的垃圾,详细内容如下,视频高清不加密,需要的联系QQ:3164282908(加Q注明博客园). 课程名称: 独一无二的数据仓库建模指南系列教程升级版 本课程也有部分免费的视频课程<数据仓库建模指南系列教程>,大家可以前往学习和了解 https://edu.hellobi.com/course/54/lessons [温馨提示:1. 你可以在PC端浏览器或者微信收藏该页

搭建数据仓库第05篇:逻辑建模–2–范式建模

目录 前言 使用情景 如何来范式建模 使用的效果 小结 前言 上篇讲述了一些抽象的概念模型和逻辑模型设计的东西,接下来就该讲述如何来一步一步的利用Inmon和Kimball数据仓库的理论来建设数据仓库的模型,主要分几块吧,一个是范式建模,然后是维度建模(分几篇总结),最后是因地制宜,按照自己的平台来考虑如何综合的考虑Inmon和Kimball数据仓库的理论的应用. 本篇将会讲述范式建模部分.当然3范式的概念也不再赘述,度娘全都有. 使用情景 提起数据仓库建模,谁都会知道Inmon的以范式建模为理

马蜂窝数据仓库架构实践

http://km.ciozj.com/Detail.Aspx?AI=98315&CI=2 数据中台的概念非常接近传统数据仓库+大数据平台的结合体.它是在企业的数据建设经历了数据中心.数据仓库等积累之后,借助平台化的思路,将数据更好地进行整合与统一,以组件化的方式实现灵活 Part.1 马蜂窝数据仓库与数据中台 最近几年,数据中台概念的热度一直不减.2018 年起,马蜂窝也开始了自己的数据中台探索之路. 数据中台到底是什么?要不要建?和数据仓库有什么本质的区别?相信很多企业都在关注这些问题. 我

搭建数据仓库第04篇:逻辑建模–1–概要

目录 前言 原则 内容 小结 前言 上一篇讲述了数据仓库模型设计中的业务建模和领域概念建模,接下来就自然而然的来到了逻辑数据建模LDM(Logical Data Model)的阶段,这个阶段可以说是建模最重要的一环(也就是维度建模).逻辑建模涉及到了整个数据仓库所有层次的模型设计,从DW到DM甚至到了OLAP.当然重点的设计还是在DW和DM层当中. 有些地方逻辑建模的范畴更加宽泛,包含了前面的业务主题和领域概念模型的设计(看下图). 本篇只是涉及了狭隘的部分(红色框住的部分). 内容 了解了逻辑

基于阿里云数加MaxCompute的企业大数据仓库架构建设思路

摘要: 数加大数据直播系列课程主要以基于阿里云数加MaxCompute的企业大数据仓库架构建设思路为主题分享阿里巴巴的大数据是怎么演变以及怎样利用大数据技术构建企业级大数据平台. 本次分享嘉宾是来自阿里云大数据的技术专家祎休 背景与总体思路 数据仓库是一个面向主题的.集成的.非易失的.反映历史变化的数据集合用于支持管理决策. 原文链接:http://click.aliyun.com/m/43803/ 数加大数据直播系列课程,主要以基于阿里云数加MaxCompute的企业大数据仓库架构建设思路为主

Vertica: 基于DBMS架构的列存储数据仓库

介绍 Vertica(属 于HP公司),是一个基于DBMS架构的数据库系统,适合读密集的分析型数据库应用,比如数据仓库,白皮书中全名称为VerticaAnalytic Database.从命名中也可以看到,Vertica代表它数据存储是列式的,Analytic代表适合分析型需求,DB代表本身是数据库,支持 SQL. 优势 和传统关系型数据库系统以及其他列式数据(仓)库相比,Vertica存在下面三点最关键的优势. 列存储 Vertica对磁盘上的数据采用列式存储,显而易见,列存储可以在数据读取的

Flume在企业大数据仓库架构中位置及功能

Flume在企业大数据仓库架构中位置及功能 hadoop 数据仓库 flume 数据仓库架构 1.如下图所示,外部数据中,关系型数据库导入到HDFS用sqoop,由Nginx产生的文件实时监控用Flume获得. 在HDFS或Hbase中,如果要进行实时查询用Impala(内存),如果是分析可以用Hive,Mapreduce分析.用Oozie来调用工作流执行任务. 2.左边是数据的来源:系统日志文件,应用文件(应用系统收集APP产生的日志),点击流(点击产生的日志),销售点(订单信息).通过Flu

EDW on Hadoop(Hadoop上的数据仓库)技术选型和实践思考

在这篇文章中, 将讨论EDW on Hadoop 有哪些备选方案, 以及我个人的倾向性, 最后是建构方法.  欢迎转载, 但必须注明原贴(刘忠武,  http://www.cnblogs.com/harrychinese/p/edw_on_hadoop.html). 数据仓库发展已经有二十多年了, 我们先看看数据仓库发展的趋势: 在数据规模小的时候, 采用单节点RDBMS作为存储和执行引擎, 比如Oracle/PostgreSQL/MySQL都行; 当数据规模大了后, 或者时间窗口很紧时, 多采

数据仓库架构设计

一. 数据仓库架构,是IT架构的一个分支,随着数据在企业的核心作用的增强,数据仓库的架构日益重要.数据仓库架构由于其技术选择非常广泛,看上去复杂,不过背后有一套比较稳定的思路,这也是数据仓库架构设计的一个要点,稳定中蕴含变化,变化中蕴含稳定. 总 体来说,数据仓库架构分成两大块,一是硬件架构,二是软件架构.硬软架构又可以分成封闭式和开放式.封闭式硬件架构代表厂商有teradata,其硬件是 专属的,必须使用特殊的硬件才能运行.开放式硬件架构的代表有oracle,可以运行在各种硬件上,不过开放和封