深入理解数仓开发(二)数据技术篇之数据同步
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 就代表状态变化为待支付的时间。
id | order_id | proc_time | order_status | modified_time |
---|---|---|---|---|
1 | 1001 | 下单时间 | 已下单/支付中/支付成功 | 状态修改时间 |
通常,用于分区的时间戳字段分为四种:
- 业务表中用于标识数据记录更新的时间戳字段(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、数据同步 数据同步我们之前在数仓当中使用了多种工具,比如使用 Flume 将日志文件从服务器采集到 Kafka,再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志,并将采集到的变更日志(json 格…...

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

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

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

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

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

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

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

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

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

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.源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/detai…...

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

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

动态规划:分割等和子集
参考资料:代码随想录 题目链接:. - 力扣(LeetCode) 这道题是01背包问题的抽象,这道题的难点在于怎么绕明白遍历顺序是从后往前。 题目中给的nums数组,以nums[1,5,11,5]为例,可以分析为有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 开源社区...

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

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

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

Vs Code插件位置:
Vs Code插件位置: C:\Users\dell.vscode\extensions...

521源码-免费源码-子比主题最新版7.6绕授权破解完整教程
首先,zibll主题授权是向api.zibll.com发送请求,api.zibll.com就验证这个请求,如果参数(比如header)正确那么授权成功,然而众所周知,服务器可以修改本地host文件,来实现某些特定功能,把host文件加…...

前端基础入门三大核心之HTML篇:Webpack、Vite、Grunt、Gulp的场景与实战运用
前端基础入门三大核心之HTML篇:Webpack、Vite、Grunt、Gulp的场景与实战运用 一、Webpack:模块打包与优化的集大成者基本概念与作用应用场景实战例 二、Vite:快速开发的现代化构建利器基本概念应用场景实战例 三、Gulp:任务自动化…...

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)
文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…...

HarmonyOS之ArkUI布局设计常见细节
这里写目录标题 1. Button设置带有渐变色的背景图片无效1.1 问题分析1.2 成功案例 2. 路由跳转失败2.1 问题分析 1. Button设置带有渐变色的背景图片无效 1.1 问题分析 说明:设置颜色渐变需先设置backgroundColor为透明色。 Button($r(app.string.login), { type…...

元宇宙虚拟线上会议,可应用于哪些行业和领域?
随着科技的飞速进步和互联网的广泛普及,线上元宇宙会议以其独特的魅力和优势,逐渐崭露头角,积木易搭旗下的元宇宙数字营销平台——视创云展,为线上元宇宙会议提供了全方位的服务,不仅涵盖了场景搭建、数字人互动、在线…...

【C++刷题】优选算法——递归第二辑
全排列 vector<vector<int>> vv; void dfs(vector<int>& nums, vector<int>& v, vector<bool>& check) {if(v.size() nums.size()){vv.push_back(v);return;}for(int i 0; i < nums.size(); i){if(check[i] false){v.push_ba…...

【GO基础】1. Go语言环境搭建
Go语言环境搭建 Go的三种安装方式Go标准包安装Windows 安装验证是否安装成功 4.Go的第一个程序 Hello World.go Go的三种安装方式 Go有多种安装方式,可以选择自己适合的。这里介绍三种最常见的安装方式: Go源码安装:这是一种标准的软件安装…...

Py之llama-parse:llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略
Py之llama-parse:llama-parse(高效解析和表示文件)的简介、安装和使用方法、案例应用之详细攻略 目录 llama-parse的简介 llama-parse的安装和使用方法 1、安装 2、使用方法 第一步,获取API 密钥 第二步,安装LlamaIndex、LlamaParse L…...

Python库之Scrapy的高级用法深度解析
Python库之Scrapy的高级用法深度解析 引言 Scrapy是一个强大的Web爬虫框架,它提供了丰富的功能和灵活的扩展性,使得在Python中编写爬虫变得简单而高效。本文将深入探讨Scrapy的高级用法,帮助读者充分利用Scrapy的强大功能。 目录 引言Scr…...