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

深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步

        数据同步我们之前在数仓当中使用了多种工具,比如使用 Flume 将日志文件从服务器采集到 Kafka,再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志,并将采集到的变更日志(json 格式)保存到 Kafka,同样再由一个 Flume 同步到 HDFS。使用 DataX 每天 0 点将需要全量同步的数据全量采集到 HDFS。

        数据同步主要的作用就是实现不同数据源的数据流转,对于大数据系统来说,包含把数据从业务系统同步进入数据仓库和把数据从数据仓库当中同步进入数据服务和数据应用两个方面。

1.1、三种同步方式

1.1.1、直连同步

        直连同步是指通过定义好的规范接口 API 和基于动态链接库的方式直接连接业务数据库,比如 ODBC/JDBC 等规定了统一规范的标准接口,不同数据库厂商基于这套接口实现了自己的驱动,支持完全相同的函数调用和 SQL 实现。

        直连同步就是通过 JDBC/ODBC 连接数据库来往数仓进行写入,但是这种方式对数据库系统的性能影响比较大,尤其是执行大批量的数据同步可能会严重拖垮业务系统的性能。如果业务系统采用主备策略,则可以从备库抽取数据,避免对业务系统产生性能影响。但是终究这不是一种好办法。

1.1.2、数据文件同步

        通过约定好的文件编码、大小、格式等,直接从源系统生成数据的文本文件(比如把数据库的二进制文件转为文本文件),由专门的文件服务器传输到目标系统,对于常见的关系型数据库,这种方式比较简单实用。

        另外,对于互联网日志数据,通常是以文本文件形式保存的,所以也适合这种方式。

1.1.3、数据库日志解析同步

        现在大多数主流的数据库都已经实现了使用日志文件进行系统恢复,比如 MySQL 的 binlog,通过数据库日志可以实现增量同步的需求,不仅延迟可以控制在毫秒级别,而且对数据库性能影响也比较小,目前这种方式也是广泛应用于从业务系统到数仓的增量同步应用中的。

        通过数据库日志解析同步的效率虽然高,但是依然存在一些问题:

  • 数据延迟。当业务系统做批量补录时可能会使数据更新量超出系统处理的峰值,导致数据延迟。
  • 投入较大。需要在业务数据库和数仓之间部署一个专门用来实时同步的系统(比如 MaxWell,Cannal,这倒是也不算太大问题)。
  • 数据漂移和遗漏。数据漂移一般是对于增量表而言的。具体解决方案下面会专门介绍。

1.2、阿里数据仓库的同步方式 

         关于阿里云数据仓库的同步方式这里简单介绍,对于批量数据同步,阿里云使用的就是人家自研的 DataX;而关于实时数据同步,我们之前使用的是 MaxWell,而阿里云使用的是自家的 TT(TimeTunnel),具有高性能、实时性、高可用、可扩展等特点,被阿里巴巴广泛应用于日志收集、数据监控、广告反馈、量子统计、数据库同步等领域。TT 是一种基于生产者、消费者和 Topic 的消息中间件(基于 HBase),不管是日志服务器中的日志还是业务系统中的数据都可以通过 TT 来进行同步到 MaxCompute。

1.3、数据同步中的问题与决绝方案

这里主要介绍数据漂移

1.3.1、数据漂移问题

        数据漂移一般是对增量表而言的,它指的是数据在同步到数仓(ODS 层)过程中,由于网络延迟或者系统压力的原因,导致上一个分区的数据进入了下一个分区(今天的数据到了明天)。

        由于 ODS 层有着面向历史的细节数据查询需求,这就要求数据采集到 ODS 层后必须按照时间进行分区存储(离线数仓基本都是按天进行分区)

说明

        尽管离线数仓一般是以天为单位来进行数据分析,但并不是说我们就等到每天 0 点才开始同步前一整天的数据。

        事实上,数据同步策略分为全量/增量同步,对于订单表这种本身就非常大,而且变化也特别大的表一般都是采用实时同步策略(增量)。阿里巴巴采用 TT(TimeTunnel)来实现对业务数据库的实时数据同步(原理就是监听 binlog),但是一般并不是一条数据同步一次,而是累积一定时间间隔进行同步(比如每 15 分钟)

    这里使用订单表来说明数据漂移是怎么发生的,对于我们的业务数据表,它并不会像我们在数仓建表那样为每个业务过程建立一张表,而是通过 update 操作来实现业务过程的变化,比如当 order_status 为已下单时,proc_time 就代表下单时间;当 order_status 为待支付时,modified_time 就代表状态变化为待支付的时间。

idorder_idproc_timeorder_statusmodified_time
11001下单时间已下单/支付中/支付成功状态修改时间

 通常,用于分区的时间戳字段分为四种:

  • 业务表中用于标识数据记录更新的时间戳字段(modified_time,比如订单表中当订单状态变化为待支付、支付成功的识货,modified_time 就会发生变化)
  • 数据库日志(binlog)当中用于标识数据记录更新的时间戳字段(log_time)
  • 业务表中用于记录业务过程发生时间的时间戳字段(proc_time,比如下单时间、支付时间)
  • 数据被抽取到的时间戳字段(extract_time, Flume 中的数据在写入到 Kafka 之后,如果没有 Event Header ,那么数据的时间默认就是写入到 Kafka 的时间)

理论上,这几个时间应该是一致的,但是在现实中,四个时间戳的大小关系为:proc_time<log_time<modified_time<extract_time,造成这些差异的原因有:

  • 数据抽取是需要时间的而且得在数据产生之后,所以 extract_time 往往比另外三个时间都晚。
  • 关系型数据库采用预写日志方式来更新数据,所以更新时间modified_time会晚于log_time
  • 业务不能保证 modified_time 一定被更新。
  • 由于网络或系统压力问题,会导致数据延迟写入/数据延迟更新。log_time或者modified_time会晚于proc_time

        通常的做法是选择其中一个字段来进行分区,这就导致了数据漂移。下面是数据漂移常见的几种场景:

  • 根据 extract_time 进行分区。这种情况下最容易出现数据漂移。(比如 Flume 经过一定延迟把数据写入到 Kafka 之后,如果没有 Event Header,那么当 Kafka 的数据被转为 Flume 格式时,Header 中默认的 timestamp 就是写入到 Kafka 的时间 )
  • 根据 modified_time 进行分区。但是业务不能保证 modified_time 一定被更新。
  • 根据 log_time 进行分区。由于网络或者系统压力,可能会出现延迟。
  • 根据 proc_time 进行分区。如果根据 proc_time 进行分区,我们得到的数据就遗漏了业务过程的变化(比如对于待支付、支付成功这些业务过程都是需要通过 modified_time 和 order_status 来确定的)。

数据漂移问题的解决方案(面试题)

1、多获取后一天的数据

        在每个 ODS 表时间分区中多冗余一部分数据,保证数据只多不少,毕竟即使网络延迟再高,很小概率会超过 15 分钟,所以我们可以向后冗余 15 分钟的数据。但是这种方式会有一些误差,比如我 1 号 0 点之前下单,2 号 1 点取消订单,那么对于 1 号,我的数据状态应该是已下单状态,但是由于我把 2 号的部分数据页拉到我的分区了,所以就可能导致记录的状态为订单已关闭。所以对于记录状态更新频繁的场景,我们可以创建拉链表,用时间(起始时间和结束时间)来约束获取记录的状态。

2、多个时间戳字段限制

① 根据 modified_time 获取后一天 15 分钟的数据,并限制多个和业务过程的时间戳(下单、支付、成功)都是当天,然后根据这些数据按照 modified_time 升序排序,获取每个数据(每个订单,可以用 order_id 唯一区分)首次数据变更的那条记录
② 根据 log_time 分别冗余前一天最后15分钟的数据和后一天凌晨开始15分钟的数据,并用 modified_time 过滤非当天数据,并针对每个订单按照 log_time 进行降序排序,取每个订单当天最后一次数据变更的那条记录
③ 将两部分数据根据 order_id 做full join 全外连接,将漂移数据回补到当天数据中。

        总之,数据漂移是不可能杜绝的,毕竟大数据场景下网络延迟和系统压力不可避免,所以只能通过一些规则限制获得相对准确的数据。

相关文章:

深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步 数据同步我们之前在数仓当中使用了多种工具&#xff0c;比如使用 Flume 将日志文件从服务器采集到 Kafka&#xff0c;再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志&#xff0c;并将采集到的变更日志&#xff08;json 格…...

C++语言学习(六)—— 类与对象(二)

目录 一、对象数组 二、对象指针 三、this 指针 四、类类型作为参数类型的三种形式 4.1 对象本身作为参数 4.2 对象指针作为参数 4.3 对象引用作为参数 五、静态成员 5.1 静态数据成员 5.2 静态成员函数 六、友元机制 6.1 友元函数 6.2 友元类 七、类的组合 八、…...

3d选择模型后不能旋转什么原因?怎么解决?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;旋转模型是常见的操作。然而&#xff0c;有时在选择了模型后&#xff0c;却发现无法进行旋转&#xff0c;这可能会让许多用户感到困扰。本文将探讨3D选择模型后不能旋转的可能原因&#xff0c;并提供相应的解决方法。 一、3D选择模型后不能旋…...

从入门到精通:详解Linux环境基础开发工具的使用

前言 在这篇文章中&#xff0c;我将深入学习和理解Linux环境基础开发工具的使用。无论你是初学者还是有一定经验的开发者&#xff0c;相信这篇文章都会对你有所帮助。我们将详细讲解软件包管理器、编辑器、编译器、调试器、自动化构建工具以及版本控制工具的使用。 Linux软件…...

linux(centos 7)安装 node

linux&#xff08;centos 7&#xff09;安装 node 下载对应版本&安装解压配置环境变量使配置文件生效验证是否安装成功附加 目前node最新版本是 node-v22.0.0 官网下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathnode/latest-v22.x/node-v22.0.0-li…...

C++之第九课

课程列表 今天&#xff0c;我们要学习一种结构&#xff1a;循环结构。 循环的方法有3种。 今天先将第1种for学了&#xff1a; int a;//循环变量 int b; for(a1;a<10;a){//像if那样“打包”cout<<a<<" ";b; } 当然&#xff0c;也可以这样写&#…...

618精选编程书单推荐:优质知识提升你的代码力

前言 在这个快速发展的技术时代&#xff0c;不断学习和提升自己的编程技能是每位程序员的必修课。今天&#xff0c;我为大家精心挑选了一系列编程技术书籍&#xff0c;它们将是你技术成长道路上的宝贵财富。 文章目录 前言编程之路&#xff1a;为何阅读书籍是不可或缺的书籍的…...

使用httpx异步获取高校招生信息:一步到位的代理配置教程

概述 随着2024年中国高考的临近&#xff0c;考生和家长对高校招生信息的需求日益增加。了解各高校的专业、课程设置和录取标准对于高考志愿填报至关重要。通过爬虫技术&#xff0c;可以高效地从各高校官网获取这些关键信息。然而&#xff0c;面对大量的请求和反爬机制的挑战&a…...

使用Java Stream API的map方法将包含Long类型ID的流转换为String数组

在这个例子中&#xff0c;idList是一个包含Long类型ID的列表。我们使用stream()方法创建一个流&#xff0c;然后应用map(String::valueOf)方法将Long类型的ID转换为String类型。最后&#xff0c;我们使用toArray(String[]::new)方法将流中的元素收集到一个新的String[]数组中。…...

centos 安装nginx 并配置https ssl

进入你要安装的目录 一般是/usr/local/ wget https://nginx.org/download/nginx-1.24.0.tar.gz解压安装包&#xff1a;使用以下命令解压下载的Nginx安装包&#xff1a; tar -zxvf nginx-1.24.0.tar.gz在编译和安装Nginx之前&#xff0c;确保您的系统上已安装了必要的编译工具和…...

Jenkins 自动化部署

Post Steps部分 Exec cmmand cd /data/build/test-admin/ rm -f app.jar rm -f Dockerfile cp target/app.jar ./ cp docker/Dockerfile ./docker build -t test-admin . docker tag test-admin 192.168.1.100/test/test-admin:1.2-SNAPSHOT docker push 192.168.1.100/test/…...

VUE3好看的酒网站模板源码

文章目录 1.设计来源1.1 首页界面1.2 十大名酒界面1.3 名酒新闻界面1.4 联系我们界面1.5 在线留言界面 2.效果和结构2.1 动态效果2.2 代码结构 3.VUE框架系列源码4.源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/detai…...

索引压缩技术详解

在现代搜索引擎和信息检索系统中&#xff0c;索引压缩技术是提高存储效率和检索速度的关键手段。本文将深入探讨几种常见的索引压缩技术&#xff0c;包括词典压缩、倒排列表压缩算法、文档编号重排序以及静态索引裁剪。 词典压缩 1.1 基础概念 词典&#xff08;Dictionary&am…...

完全匹配企业需求的替代FTP升级软件怎么找

企业在处理数据传输时&#xff0c;效率和安全性是关键。尽管传统的FTP曾被广泛采用&#xff0c;但因其传输慢、安全性不足和难以管理等问题&#xff0c;已不再满足现代企业的需求。许多企业正在寻找能够满足其需求的FTP替代方案&#xff0c;但市场上选择众多&#xff0c;找到合…...

动态规划:分割等和子集

参考资料&#xff1a;代码随想录 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 这道题是01背包问题的抽象&#xff0c;这道题的难点在于怎么绕明白遍历顺序是从后往前。 题目中给的nums数组&#xff0c;以nums[1,5,11,5]为例&#xff0c;可以分析为有4个物…...

踩坑——纪实

开发踩坑纪实 1 npm安装1.1 查看当前的npm镜像设置1.2 清空缓存1.3 修改镜像1.4 查看修改结果1.5 重新安装vue 2 VScode——NPM脚本窗口找不到3 springboot项目中updateById()失效4 前端跨域4.1 后端加个配置类4.2 CrossOrigin注解 5 路由出口6 springdoc openapi3 swagger3文件…...

java实现websocket的五种方式(mark下)

java实现websocket的五种方式 java 实现 websocket的五种方式_java_萧曵 丶-GitCode 开源社区...

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…...

光耦合器的特性和应用概述

光耦合器又称光电耦合器&#xff0c;是现代电子学中必不可少的元件&#xff0c;确保隔离电路之间安全有效的信号传输。本文探讨了光耦合器的特性及其多样化应用&#xff0c;强调了它们在各种电子系统中的关键作用。 什么是光耦合器&#xff1f; 光耦合器是一种设计用于利用光传…...

工作干到抑郁了,要不要辞职?

在知乎上看到以为网友提问&#xff1a;工作干到抑郁&#xff0c;该不该辞职&#xff1f; 今天和大家聊聊这个话题&#xff0c;如果你也有类似的情况&#xff0c;希望这篇文章能帮到你。 熟悉瑶琴的朋友&#xff0c;都知道瑶琴在去年有一次裸辞的经历。离职前&#xff0c;严重的…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...