深入数仓离线数据同步:问题分析与优化措施

这篇具有很好参考价值的文章主要介绍了深入数仓离线数据同步:问题分析与优化措施。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

在数据仓库领域,离线数仓和实时数仓是常见的两种架构类型。离线数仓一般通过定时任务在特定时间点(通常是凌晨)将业务数据同步到数据仓库中。这种方式适用于对数据实时性要求不高,更侧重于历史数据分析和报告生成的场景。

然而,采用离线同步方式可能会引发业务数据与数据仓库数据不一致的问题。本文的目标是深入分析这些问题的根本原因,并提供一些建议来优化同步流程,以确保数据的一致性。

二、场景

在大数据平台中,业务部门常常需要查看历史某一天的表数据。为了记录历史数据的变化,离线数仓常见的解决方案是拉链表和快照表。而由于拉链表的查询方式较为复杂不便直观的展现问题,因此在这里我选择使用快照表作为示例,以便更清晰地阐述离线数仓的数据一致性问题。

快照表是用来存储某个时间点的所有数据-通常粒度是天,相当于是对每天的业务数据做了一次快照,存储当天的全量数据;例如:快照表12号分区中的数据是从历史到11号的所有数据,13号分区中的数据是从历史到12号的所有数据,其他的以此类推,示例如下:

  1. [Mysql] 业务数据 - 用户表全量数据:
id name phone gender create_time update_time
1 jack 111 2023-06-01 13:00:00 2023-06-01 13:00:00
2 jason 222 2023-06-01 13:00:00 2023-06-01 13:00:00
3 tom 333 2023-06-01 13:00:00 2023-06-01 13:00:00
  1. [数仓]由于离线数仓是T+1处理,故2023-06-02时数仓快照表数据如下:
id name phone gender create_time update_time dt[分区字段]
1 jack 111 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-01
2 jason 222 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-01
3 tom 333 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-01

加粗为分区字段

  1. [Mysql] 2023-06-02 业务数据新增了一名用户,且更改了tom的手机号,此时表数据如下:
id name phone gender create_time update_time
1 jack 111 2023-06-01 13:00:00 2023-06-01 13:00:00
2 jason 222 2023-06-01 13:00:00 2023-06-01 13:00:00
3 tom 444 2023-06-01 13:00:00 2023-06-02 09:00:00
4 tony 555 2023-06-02 10:00:00 2023-06-02 10:00:00

加粗为更新/新增数据

  1. [数仓]由于离线数仓是T+1处理,故2023-06-03时数仓快照表数据如下:
id name phone gender create_time update_time dt[分区字段]
1 jack 111 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-01
2 jason 222 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-01
3 tom 333 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-01
1 jack 111 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-02
2 jason 222 2023-06-01 13:00:00 2023-06-01 13:00:00 2023-06-02
3 tom 444 2023-06-01 13:00:00 2023-06-02 09:00:00 2023-06-02
4 tony 555 2023-06-02 10:00:00 2023-06-02 10:00:00 2023-06-02

加粗为更新/新增数据

以上是快照表的表现形式,接下来我们看下具体实现

三、实现

离线数仓(T+1)中关于快照表的实现方式有两种:全量同步和增量同步。

值得强调的是,这些同步任务的执行方式并不局限于特定的工具或框架,例如sqoop/spark;因此在本文中我们将使用SQL语句来表达数据处理过程。

需要注意的是这两种实现方法都有可能导致数据不一致的问题,下一节将对此进行详细讨论和解释。

3.1、全量同步

  1. 全量同步顾名思义是将业务数据用户表全量同步一份到数仓快照表中的指定分区内,该方式简单粗暴,这里以:2.1、示例中的 2023-06-02业务数据新增了一名用户,且更改了tom的手机号为例;过程如下:

深入数仓离线数据同步:问题分析与优化措施,数据仓库,大数据,数据库,数据仓库,大数据,数据分析

  1. sql语句:
# 2023-06-03凌晨执行的全量同步sql语句
INSERT INTO 数仓快照表 PARTITION (date='2023-06-02')
select * from 业务用户表 where update_time < '2023-06-03 00:00:00';

3.2、增量同步

增量同步顾名思义是将业务数据用户表按天为粒度将增量数据与数仓快照表中的前一天数据进行join对比后放入到指定分区内,关于增量同步的实现不在本文赘述,对此感兴趣的读者可参考笔者的另一篇文章:数仓日常维护:剖析每日增量同步的内部机制

四、数据一致性问题

以上述快照表为例,可能引发一致性问题的情况是指在执行层的Spark或Sqoop任务启动和执行期间,业务数据库表的数据发生了变化,从而导致快照表与业务表的数据不一致。这种不一致性问题可能会对数据处理和分析产生负面影响,示例如下:

假设业务表在2023年6月2日新增了“Tony”修改了“Tom”手机号这两条数据。在凌晨定时任务启动后,引擎初始化及加载数据时,业务数据中的“Tony”发生了变更,其“update_time”字段也随之变化。然后,执行引擎再次通过“update_time”字段读取业务数据时,由于变更,它可能会错过“Tony”这条记录。这将导致数仓快照表中2023年6月2日分区的数据缺失“Tony”用户信息,造成了当天数据不一致的问题,过程如下:

深入数仓离线数据同步:问题分析与优化措施,数据仓库,大数据,数据库,数据仓库,大数据,数据分析

上图采用全量同步方式,增量同步同样会有此问题

以上问题的本质是数据同步执行层在启动或数据加载过程中,由于业务数据库表数据的动态变化,特别是在数据加载期间或引擎启动期间发生的数据更新操作,导致了读取到的数据无法准确地反映业务表在特定时间点的状态。这样的数据变化可能会使得快照表在某些情况下缺少或错误地反映了业务表的最新状态,导致了数据不一致的问题。

五、解决方案

4.1、加锁

同步任务在凌晨前启动,当时钟指向零点时,对需要同步的数据库表进行锁定,以防止其他更改操作干扰数据读取,确保数据一致性。

然而,这种方式存在明显弊端。首先,要求业务库支持锁操作,并且同步任务必须具备相应的锁权限。更重要的是,这种方式会对业务库产生较大影响,因此不推荐使用。值得一提的是,Flink-CDC 1.x版本的全量同步采用的就是使用了这种对表加锁的策略,不过该痛点已在2.x版本后改为增量快照读取机制从而解决了加锁问题

对此感兴趣的读者可参考笔者另一篇文章:深入解析 Flink CDC 增量快照读取机制

4.2、实时同步

实时同步是一种有效解决数据一致性问题的方法,因其同步方式大多是采用binlog + checkpoint分布式快照的形式故不会存在漏读情况,但这可能需要对现有技术架构做出较大的改变。实时同步具体实现不在本文赘述,感兴趣的同学可以看笔者另一篇文章:Flink实时数仓同步:拉链表实战详解

4.3、binlog修正

此思路灵感来源于 Flink-CDC 2.x 的增量快照读取机制。这种修正方式相对简单,且不会对现有的离线数仓架构产生改变,仍然可以使用 Spark 或 其他执行引擎。对此感兴趣的读者可参考笔者另一篇文章:深入解析 Flink CDC 增量快照读取机制

具体思路如下:相较于之前的离线同步,新增了一个读取 binlog 消息修正的步骤。当同步任务读取完业务数据后,它会读取从零点到当前时间内的 binlog 日志。如果发现了 update 操作的日志,则判断该条日志中 after 数据的 update_time 是否属于当前快照表的时间范围。若属于,则将 after 数据补充到已读取的业务数据中。

深入数仓离线数据同步:问题分析与优化措施,数据仓库,大数据,数据库,数据仓库,大数据,数据分析

这种方法能够有效解决离线数仓同步数据一致性的问题,而且不需要修改现有的离线数仓架构。因此,对于那些不想对原有技术架构做出变更的人来说,这种方法值得推荐。文章来源地址https://www.toymoban.com/news/detail-817483.html

六、相关文档

  • 数仓日常维护:剖析每日增量同步的内部机制
  • 深入解析 Flink CDC 增量快照读取机制
  • Flink实时数仓同步:拉链表实战详解
  • 数据仓库表设计理论
  • 数据治理设计理论
  • 数据仓库设计理论
  • 数据仓库发展历史

到了这里,关于深入数仓离线数据同步:问题分析与优化措施的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 离线数仓建设之数据导出

    为了方便报表应用使用数据,需将ADS各项指标统计结果导出到MySQL,方便熟悉 SQL 人员使用。 创建car_data_report数据库: 1.1.2 创建表 ① 里程相关统计 创建ads_mileage_stat_last_month表,存储里程相关统计数据。 ② 告警相关统计 创建ads_alarm_stat_last_month表,存储告警相关的统计数据。

    2024年03月16日
    浏览(49)
  • 【从0开始离线数仓项目】——数据仓库的环境搭建(1)

    目录 一、服务器环境准备 1.2 编写集群分发脚本xsync 1.3 SSH无密登录配置 1.4 JDK准备 1.5 环境变量配置说明 二、集群所有进程查看脚本 三、Zookeeper安装 3.1 分布式安装部署 3.2 ZK集群启动停止脚本 3.3 客户端命令行操作 CentOS 7 怎么从命令行模式切换到图形界面模式 切换至root权限

    2024年02月13日
    浏览(39)
  • 看这篇就明白大数据实时数仓、离线数仓、数据湖之间的关系

      20世纪70年代,MIT(麻省理工)的研究员致力于研究一种优化的技术架构,该架构试图将业务处理系统和分析系统分开,即将业务处理和分析处理分为不同层次,针对各自的特点采取不同的架构设计原则,MIT的研究员认为这两种信息处理的方式具有显著差别,以至于必须采取完

    2024年02月08日
    浏览(48)
  • 【ElasticSearch】深入探索 ElasticSearch 对数据的聚合、查询自动补全、与数据库间的同步问题以及使用 RabbitMQ 实现与数据库间的同步

    在本文中,我们将深入探讨 ElasticSearch 在数据处理中的关键功能,包括数据聚合、查询自动补全以及与数据库的同步问题。 首先,我们将聚焦于 ElasticSearch 强大的聚合功能,解释什么是聚合以及如何通过 DSL 语句和 RestClient 实现各种聚合操作。这一功能能够让我们更深入地了

    2024年02月08日
    浏览(57)
  • 通过ETL自动化同步飞书数据到本地数仓

    使用飞书的企业都有将飞书的数据自动同步到本地数据库、数仓以及其他业务系统表的需求,主要是为了实现飞书的数据与业务系统进行流程拉通或数据分析时使用,以下是一些具体的同步场景示例: 组织架构同步 :当企业在飞书上创建或修改组织架构信息时,需要实时同

    2024年02月16日
    浏览(35)
  • 一百八十六、大数据离线数仓完整流程——步骤五、在Hive的DWS层建动态分区表并动态加载数据

    经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。 1、Hive的DWS层建库建表语句 --如果不存在则创建hurys_dc_dws数据库 create database if not exists hurys_dc_dws; --使用hurys_

    2024年02月07日
    浏览(48)
  • 一百八十二、大数据离线数仓完整流程——步骤一、用Kettle从Kafka、MySQL等数据源采集数据然后写入HDFS

    经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。 项目行业属于交通行业,因此数据具有很多交通行业的特征,比如转向比数据就是统计车辆左转、右转、直行

    2024年02月07日
    浏览(53)
  • 离线数仓(一)【数仓概念、需求架构】

            今天开始学习数仓的内容,之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的,相信会有很大的收获。         数据仓库( Data Warehouse ),是 为企业制定决策,提供数

    2024年02月20日
    浏览(41)
  • 数仓用户行为数据分析

    分层优点:复杂的东西可以简单化、解耦(屏蔽层作用)、提高复用、方便管理 SA 贴源  数据组织结构与源系统保持一致 shm 历史层  针对不同特征的数据做不同算法,目的都是为了得到一份完整的数据 PDM 明细层 做最细粒度的数据明细,最高扩展性和灵活性,企业级的数据

    2024年02月08日
    浏览(42)
  • 技术干货|如何利用 ChunJun 实现数据离线同步?

    ChunJun 是⼀款稳定、易⽤、⾼效、批流⼀体的数据集成框架,基于计算引擎 Flink 实现多种异构数据源之间的数据同步与计算。ChunJun 可以把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中,从⽽为企业提供全⾯的数据共享,目前已在上千家公司部署且稳定运⾏

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包