如何选择离线数据集成方案 - 全量&增量

2023-05-16

1 前言

我在上一篇中介绍了实时集成与离线集成该怎么选择,接着介绍一下离线集成中的增量与全量的选择问题。

要设计方案,我们先分析一下数据产生的方式。我们把音视频流这种非结构化的数据集成从这里排除出去,因为这种音视频流一般都是专业的厂商和系统来处理。我们围绕数据分析领域常见的半结构化、结构化数据来看。

结构化和半结构化数据主要来源于各种设备和系统中运行的软件,包括写入各种数据库的数据、服务器中的日志。如果数据本身可以实时传输过来,那么我们就尽可能采用这种方式,但是实际工作中更多的场合是离线。尤其是项目的一期,更容易使用离线集成。

实时集成就相当于收快递,需要商家和物流企业先期投入大量建设,才能让快递便捷的传输到你手里。而这种什么都准备好的情况,大部分时候都是企业IT建设相对成熟的情况下才有。

日志这种文件流,如果采用实时采集,就属于实时集成范围。如果离线传输,就是传个文件,本身就没有太多需要讲述的。下面我们就讨论下从数据库中实施离线集成的方法。

2 数据库的数据

一提到传统数据库,就想到了结构化数据。但是数据库其实可以存储各种能存储的下的数据,比如音视频文件其实可以存储到LOB类型的二进制大对象字段中。而半结构化数据,可以存储到string、text、CLOB等字符型二进制大对象字段中。工业控制系统产生的时序数据,也可以存储到数据库中。

而数据库中的数据操作有插入、更新、删除,不同种类的操作会对集成有影响。

如果要对一个数据库做全库的集成,首先要决定哪些表是我们要入仓的。一定不要不经分析就把数据集成到数据仓库或者数据中台中。按照维度建模的理念,需要以需求为导向去构建模型,所以,集成的数据表一定是要明确有需求。这样我们就能确定一个范围,而不是全部。

划定范围,我们就会遇到非结构化数据入库的问题,因为MaxCompute本身是不支持大字段的,最长的字段长度是string,只有8M。至于数据库的LOB存储什么,五花八门,我见过照片、音频、Word文档、这些要集成,统统都需要传输到OSS,而不是MaxCompute。目前这种数据,还需要单独开发程序去集成到OSS。

剩下的我们就可以理解为结构化和半结构化数据了,一般能用string存的下的都可以集成到MaxCompute。例如一些XML、JSON半结构化数据,之前在数据库是存储在CLOB类型的字段中的,但是本身并不是超过8M。

接下来我们就需要评估该如何集成数据了-增量还是全量。

3 增量还是全量

回顾之前在实时还是离线的章节总结的集成原则。

集成原则:

1 费用紧张,资源有限,尽可能使用离线集成。

2 批处理数据(主要指源端数据是批量产生,或者双十一式爆发式产生)集成,尽量走离线。如果确实预算非常充足,资源非常丰富,也可以走实时集成(很多时候,源端都可能扛不住)。

3 交易型数据集成,尽量走实时,如果资源有限可以走离线。

4 大表,例如数据超过200W、存储超过1G,尽量走实时,这种表一般在业务系统中数量不会超过表数量的20%。离线集成时效性很难满足要求,当然也不是不行。一般离线集成的表在1-10亿这个级别也是可以一战(与系统资源相关)。再大基本上就很难了,集成时间过久,业务系统没有足够的快照空间,事务会报错,集成就会失败。

5 小表,例如常年不动的代码表,10W以下的小表,大概都能在30秒-3分钟内完成,建议走离线。毕竟实时挺贵,这些小表,还是打包搞过来比较适合。

我们看到我把数据分为“批处理”、“交易型”、“大表”、“小表”。很明显,“批处理”和“交易型”是一个对照组,“大表”和“小表”是一个对照组。

先看下什么是“批处理”,主要是指数据并不是由业务系统的业务事件产生,而是由数据库或者应用后台运行的数据运行,其特点是一次操作的数据或者产生的数据是多条(几万到数亿)记录。“批处理”操作主要在做后台数据库版本发布的批量运维,夜间批量做数据处理,几个表关联生成一张新的表。这种操作瞬时产生大量的数据操作,少则几万,多则数亿,且发生时间相对短暂。对应的“交易型”则是实时发生,是由实际的业务发生时产生。并不是定时任务和运维人员提交到数据库的,是由应用提交到数据库的。

“大表”和“小表”需要画一条线,根据数据库系统的能力来评估。一般按照二八原则,或者一九。就是说一般数据库中90%表都是小表,根据数据库的规模,可以是10万也可以是100万。

1.全量集成

先说大小表,这个比较简单,一旦划定了大小表。就可以确定,小表是可以全部使用全量集成的。所以,这个边界是全量离线集成的边界。剩下的大表,就困难了。大表的意思就是全量集成不能完成,或者对数据库的负载过大,搞不定。这部分就需要考虑增量集成了。

2.增量集成

因为小表全量集成很暴力了,无所谓什么,都能集成过来。而大表的增量要怎么获取呢?真的很难。我有一句总结:没有一个业务系统的时间戳字段是可信的。大家可以去证明我是错误的,我的见识是浅薄的,但是这就是从业十多年的我的见识。

首先,增量集成需要数据库表不能有物理删除,这很难实现。即便业务系统在设计之初有这种设计,也难以避免后台人工运维引入非正常操作问题。

其次,标识数据被更新和插入的时间字段(时间戳)不可信。除了业务系统可能并不更新这个字段外,还同样存在人工运维引入非正常操作的问题。

3.批处理表的增量集成

即便如此,仍然有表,是可以容易实现增量识别的,而这种表往往还是大表。我们前面提到的“批处理”表就是这种表,因为这类表是批量写入的,操作频次是有限且是批量的(常见的数据交换表也是这种表)。这种表的数据,较为容易获得增量。

方法:

  1. 找到主键。因为增量数据需要与全量合并,所以主键非常重要。
    1. 了解数据写入特征。数据变动的范围多大,哪个字段是每日生成新数据的业务日期字段,这关系到增量集成的增量时区范围多大。例如,会更新当前月的数据,会更新最近N天的数据。
    2. 了解业务。为什么会产生这样的数据,业务是什么,数据该如何使用。
    3. 调研数据。从数据中验证之前得到的信息,是否完全正确,这非常重要。最经常的问题就是数据变动的范围,与描述不一致。这是因为调研总是短暂的,而数据不会骗人。例如运行了一个历史日期的数据,例如过了一个假期才处理问题。
  2. 事件表的增量集成

还有另外一种表,自然就可以做到增量识别。这类表就是事件型表,这类表只有insert,没有update和delete。例如刷了一次门禁卡。

到这里,我其实并没有解决所有表的集成。我只解决了小表、部分大表(批量表、事件表),这就是现实。大部分时候,我们只能采取加大离线集成的并行度,并忍受数个小时离线集成时长。而离线集成很难解决的这些表的集成,往往也是最适合实时集成的表。这就是我给的答案,离线集成不完美,解决不了我们获取数据的完整性的问题。

4总结

全量和增量都是一种选择,如果表都很小,我们整个库都可以全量集成。而增量则更多的时候是一种奢望,系统运行的越久,离线增量集成的问题就会暴露的越多。在这个时候,我要说:选择要大于努力,建议去看看实时集成是不是可以帮助到你。另外一个方面,我们回顾上一章节,实时集成集成小表并不划算,集成批量表会导致进程崩溃。

所以,没有完美的工具,只有完美的方案。只有针对客户现场的实际情况,做出最适合客户的现场方案才是我们的最终选择。

原文链接

本文为阿里云原创内容,未经允许不得转载。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何选择离线数据集成方案 - 全量&增量 的相关文章

  • 图像阶梯效应

    图像阶梯效应现象产生原因 在利用二阶偏微分方程进行平滑图像过程中 xff0c 有时会出现 阶梯效应 或者是 块效应 即图像处理后某些区域内灰度相同 区域内灰度相同 xff0c 表示该区域任意一点其灰度值的一阶导数为0 这说明随着迭代次数增加
  • 邻接矩阵

    逻辑结构分为两部分 xff1a V和E集合 xff0c 其中 xff0c V是顶点 xff0c E是边 因此 xff0c 用一个一维数组存放图中所有顶点数据 xff1b 用一个二维数组存放顶点间关系 xff08 边或弧 xff09 的数据
  • JavaScript

    1 a 任何数值除以0都会导致错误而终止程序执行 但是在JavaScript中 xff0c 会返回特殊的值 xff0c 因此不会影响程序的执行 比0大的数除以0 xff0c 会得到无穷大 xff0c 所以js用infinity来x显示出来
  • -操作系统

    1进程同步的引入背景 xff1a 在多道程序环境下 xff0c 进程是并发执行的 xff0c 不同进程之间存在这不同的相互制约关系 为了协调进程之间的相互制约关系 xff0c 引入了进程同步的概念 2在有n个进程共享一个互斥段 xff0c
  • -网络基础

    1 物理层 xff1a RJ45 CLOCK IEEE802 3 xff08 中继器 集线器 网关 xff09 数据链路 xff1a PPP FR HDLC VLAN MAC xff08 网桥 xff0c 交换机 xff09 网络层 xff
  • 恒生面试准备

    目录 1 flex布局 2 vue的特性有哪些 xff1f 3 Vue中父子组件的传值的方式有几种 xff1f 它们有什么数据上的限制 4 项目中用了vue组件传值的方式有哪些 5 项目中用到的组件 6 浏览器输入url到渲染网页的过程 7
  • 同程艺龙一面

    目录 1 说说HTML5 2 link标签要放到head之后 xff0c script标签要放到body标签结束之前 xff0c 为什么 3 HTML语义化重要性 4 meta中的viewport干嘛的 5 P标签中的文字如何水平垂直居中
  • 杭州端点一面

    目录 1 vue双向绑定 2 Promise了解过吗 xff1f promise all解释一些 xff0c 为什么可以链式回调 3 let和var的区别 4 深拷贝和浅拷贝区别和实现方式 5 父子组件传值 6 了解webpack吗 xff
  • iOS 中 cell和 label 的自适应高度

    之前我们使 的 cell 一直都是同样的高度 或者某行固定 度 实际开发中经常要让 cell 根据 Model 中文本的长短动态的更改高度 1 获取文本高度 计算一段文本在限定宽高内所占矩形大 iOS7计算文本 度 法 CGRect bou
  • C++获取含有中文的字符串长度

    在Windows下 xff0c 中文字符在C 43 43 中的内存占用为2字节 xff0c 此时采用字符串长度获取函数得到的结果会将一个中文字符识别为两个长度 xff1a include lt stdio h gt include lt s
  • IOS中自定义cell大小的两种方法

    第一种 xff1a 自定义cell xff0c 不用xib的 xff0c 用已经封装好的类Category m类 第一步 xff1a label 的自定义高度 xff0c 用的是 xff08 封装好的方法 xff09 根据 label 中的
  • mysql的2003-Can‘t connect to MySQL server on ‘localhost‘(10061“Unknown error“)错误解决方法

    在我们对mysql的数据库进行连接时出现2003 Can 39 t connect to MySQL server on 39 localhost 39 10061 34 Unknown error 34 的错误 xff0c 截图如下 xf
  • python实现朗读内容

    项目描述 pyttsx3 是 Python 中的文本到语音转换库 与替代库不同 xff0c 它可以脱机工作 xff0c 并且与Python 2和3兼容 pyttsx3 的官网pyttsx3 皮皮 pypi org https pypi or
  • python计算圆的面积

    提示 xff1a 笔记希望对你有帮助 文章目录 前言1 事先准备2 代码书写3 代码运行总结 前言 提示 xff1a 本次我们的代码的是通过pycharm实现的 下面让我们使用python对我们的圆的面积以及周长进行一个简单的计算 1 事先
  • Windows环境下edge浏览器点击下载没有反应

    项目场景 xff1a 系统 xff1a windows 11 家庭中文版 浏览器 xff1a Microsoft Edge版本 104 0 1293 54 正式版本 64 位 问题描述 edge浏览器点击下载没有反应 原因分析 xff1a
  • python怎么查看安装了哪些库

    这里写目录标题 前言方法1方法2 前言 有时候我们在使用python的时候 xff0c 想知道自己安装哪些了第三方库以及第三方库的版本 xff0c 下面来介绍一下方法 方法1 我们可以通过命令提示符输入相关的命令进行查看 xff0c 命令如
  • python 安装dmPython

    文章目录 前言下载达梦数据库安装dmPython模块引用模块解决方法 代码演示 前言 使用python连接我们的连接达梦数据库 下载达梦数据库 达梦数据库的官网链接 达梦数据库的下载链接 安装dmPython模块 找到达梦数据库的安装目录
  • python requests cookie的获取和使用

    文章目录 前言一 cookie是什么 xff1f 二 使用步骤开始代码实现会话是什么然后写入我们的账号信息 使用session访问登陆账号的url获取账号的书架上的数据 完整的代码补充比较暴力的获取方式 前言 我们在使用爬虫中会用到很多账号
  • pyspark报错 org.apache.spark.SparkException: Python worker failed to connect back.

    项目场景 xff1a 使用pycharm工具将spark分析完的数据存储到MySQL数据库中 问题描述 在程序执行过程中发生以下报错 xff1a org span class token punctuation span apache sp
  • python的tkinter(图形用户界面)

    目录标题 什么是图形用户界面 xff08 GUI xff09 Tinter函数和参数说明 xff08 常用 xff09 Lable 标签 xff1a 效果Button 按钮 效果 Entry 文本框 效果 Text xff08 多行文本框

随机推荐

  • K8s配置文档

    xff01 xff01 xff01 xff01 xff01 xff01 如果看不懂文档点击进入视频k8s配置视频 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff
  • 安装spark

    安装spark 上传安装包文件 spark 2 1 1 bin hadoop2 7 解压安装包 span class token function tar span xvf spark 2 1 1 bin hadoop2 7 C opt m
  • 人大金仓数据库的简单巡查

    人大金仓的简单巡查 查询人大金仓的版本 sys ctl V sys ctl version span class token comment 在ksql命令行工具中查询数据库版本 span span class token keyword
  • 人大金仓数据库的单表查询

    人大金仓数据库的单表查询 查看表的内容 span class token comment 查询数据库的创建语句 span d exam span class token punctuation span course span class
  • JWT和Security 登录权限判断和token访问和让token失效

    文章目录 Spring SecurityJWT无状态的单点登录流程用到的方法configure HttpSecurity http 登录 authenticationSuccessHandler loadUserByUsername 通过t
  • Flutter Container设置 width 无效

    文章目录 布局组件和容器组件BoxContraints机制布局组件 Row Column解决办法参考 布局组件和容器组件 容器类Widget和布局类Widget都作用于其子Widget xff0c 不同的是 xff1a 布局类Widget一
  • Flutter 滚动距离来设置TabBar的位置,点击TabBar滚动的到指定的位置

    文章目录 效果gif定义属性每个组件设置Key获取控件的距离顶部的位置设置监听设置TabBar 点击getY源码 感觉有用的话 xff0c star一下如果想一起学习进步 QQ群766903559 效果gif 定义属性 ScrollCont
  • solidity create2 学习

    文章目录 saltcreatecreate2address this clone factoryshr shl使用 两个值生成唯一的值 xff0c 通过唯一值获取对应的两个值 salt nonce 也可以自己生成 create addres
  • Flutter和Native 通信 pigeon

    文章目录 1 pigeon2 定义接口3 定义sh文件 pigeon sh xff08 lib同级目录创建 xff09 4 运行sh文件 pigeon sh 会生成一下文件5 配置6 使用7 IOS xxx plugin h8 XxxPlu
  • flutter调用go

    文章目录 命令引入greeting aar和使用android中使用Flutter2gopluginPlugin kt参考文档 命令 mkdir demo cd demo go mod init demo 编写greeting go go
  • solidity 学习2.批量转账,存入eth。读取数据。

    pragma solidity 0 4 17 import 39 zeppelin solidity contracts token ERC20 StandardToken sol 39 contract BLEOS is Standard
  • 根据图片获取图片中最多的颜色

    根据网络图片获取背景色 xff0c 用Palette 获取出来的颜色总是不对 Palette p 61 Palette from resource generate int defaultColor 61 ContextCompat get
  • flutter-border

    文章目录 Border继承构造方法BorderStyle和BorderSideBorderStyleBorderSide构造方法 BoxShadow构造方法 BoxShape是Code BorderRadius继承CodeRadius xf
  • ubuntu20.04中安装Flatpak,切换数据源

    安装 Flatpak xff1a sudo apt install flatpak 接着 xff0c 使用以下命令添加 Flatpak 数据源 xff1a sudo flatpak remote span class token opera
  • centeros8 图形化界面设置

    基于性能及通用性等因素的考虑 xff0c 阿里云官方提供的公共Linux系统镜像 xff0c 默认不安装图形化桌面组件 通过管理终端连接Linux实例 执行以下命令 xff0c 安装图形桌面的软件包 yum groupinstall 34
  • 定时器周期计算

    对定时器周期公式的总结 xff1a 1 T 61 xff08 arr 43 1 xff09 PSC 43 1 Tck 其中TCK为时钟频率 xff0c PSC为时钟预分频系数 xff0c arr为自动重装载值 f 61 Tck psc 43
  • [已解决 2020年]你的支付授权失败。请核对你的信息并重试,或尝试其他支付方式。请联系你的银行了解更多信息

    博主更多实战教程 xff1a NET WebApi实战教程 微信小程序实战教程 因为苹果政策的调整 xff0c 目前进行开发者计划加入时 xff0c 有两个模式 如果账号本身是在apple developer app中申请的 xff0c 那
  • LPC1768 IIC通信示——PCF8563

    PCF8563与AT24C02一样 xff0c 是典型的IIC通信器件 xff0c 这里就以它为例 xff0c 编写基于LPC1768硬件IIC的通信代码 xff1a 上图是PCF8563各个寄存器地址 xff0c PCF8563的IIC地
  • 程序员笔试题----字符串的操作

    在程序员面试的过程当中 xff0c 很多时候都会问到对字符串的操作 xff0c 其中包括 xff1a 字符串的逆序 xff0c 字符串的最大字串 xff0c 字符串按单词逆序 xff0c 两个字符串的最大公共子串 xff0c 记录字符串中某
  • 如何选择离线数据集成方案 - 全量&增量

    1 前言 我在上一篇中介绍了实时集成与离线集成该怎么选择 xff0c 接着介绍一下离线集成中的增量与全量的选择问题 要设计方案 xff0c 我们先分析一下数据产生的方式 我们把音视频流这种非结构化的数据集成从这里排除出去 xff0c 因为这