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

离线数仓的优化及重构

@

目录
  • 1. 背景
  • 2. 优化
  • 3. 改造
    • 3.1. 重构
    • 3.2. 优化

1. 背景

大概就是有那么一个数仓,然后简略结构如下:

flowchart LRFile -->|Parse|MySQL-->|Python|Hive

从其他封闭系统产生的日志文件,经由本系统的后端部分近线解析,将结果直接存入MySQL,而后由数仓部分使用Python脚本洗入Hive,但这实在是太慢了。

在代码当中埋了一些输出点之后,经过对行为日志的分析,我们发现最慢的部分是在数据转换的Python脚本部分

更进一步地,Python脚本的结构大概是:

flowchart LRMySQL -->|JSON|Python-->|Table|Hive

也就是说,MySQL当中存储的是JSON格式的数据,原设计是直接向Elasticsearch进行推送的,后来追加了一个存入Hive的通道

那么进一步分析Python脚本的流程,大概是:

flowchart LRMySQL -->|WHERE state=0 LIMIT ...|Python-->|Table|HivePython-->|UPDATE state=1 WHERE ... IN|MySQL

问题就出现在,Python脚本对MySQL数据解析状态的更新上

由于采用的是UPDATE且附带WHERE条件,所以每次更新状态的时候,似乎都会把整个表锁上,详见这个[1]和这个[2]

而且由于这个表同时还有推送ES的一个通道,可能还有其他地方在同时访问,所以整张表会锁很久

2. 优化

找到了症结,接下来就是想办法了

既然问题出现在数据回流上,那么能不能想办法去掉这个步骤?

经过对MySQL表结构的分析,我们发现其中的某个字段与时间戳相关

也就是说,这张表的数据,在这个字段上是有序的

那么我们可以将这个字段作为关键字,记录此次数据处理到了哪个位置

优化后的大致结构如下:

flowchart LRPython-->|WHERE timestamp < ...|MySQLMySQL-->|JSON|PythonPython-->|Table|HivePython-->|UPDATE timestamp|RecordRecord-->| timestamp|Python

这样一来,数仓部分对这张表就只有读取部分,去掉写入,不再产生相关的锁,大大提升了运行效率

3. 改造

3.1. 重构

但是好景不长,过了一段时间,这部分的表现又不如人意,于是决定重构,大致的结构如:

flowchart LRFile -->|Parse|HDFS-->|Bash|Hive-->|Python|ES

此次将日志文件直接解析到HDFS,再通过Bash直接建表到Hive,最后推送至ES

数仓结构大概是:

flowchart LRHDFS-->|Bash|ODSODS-->|SQL|DWDODS-->|SQL|APPAPP-->|Python|ES

APP直接从ODS加工有两个考虑:

  1. 其一是某个特殊字段仅在APP有效,所以DWD没有保存,只能从ODS 取数

  2. 其二是提高并行度,使得DWDAPP可以同时加工

除此之外还有控制结构:

在这里插入图片描述
大概是,有四个控制脚本,有一个控制表

控制表的部分效果如下:

  1. 记录远程文件名称,及其解析到的对应的HDFS文件的名称

  2. 记录该文件的解析状态,例如说已落ODS

几个控制脚本的部分作用如下:

1.sh

  1. 根据控制表当中的记录,选取还未处理的HDFS文件,在Hive当中建立对应的表

  2. 处理完成之后更新这些记录的状态

2.sh

  1. 根据控制表当中的记录,选取已经落到ODS的表,加工数据到DWD

  2. 处理完成之后更新这些记录的状态

3.sh

  1. 根据控制表当中的记录,选取已经落到ODS的表,加工数据到APP

  2. 处理完成之后更新这些记录的状态

3_5.sh

  1. 根据控制表当中的记录,选取已经落到APP的表,推送数据到ES

  2. 处理完成之后更新这些记录的状态

  3. 此环节暂时跳过

4.sh

  1. 根据控制表当中的记录,选取已经落到DWDAPP的表,删除其在ODS的数据

  2. 根据控制表当中的记录,选取已经推送到ES的表,且数据已过保留期限,删除其在APP的数据

  3. 处理完成之后更新这些记录的状态

该数仓使用Azkaban进行调度,设定自动任务为每10分钟自动运行一次。每次任务运行之前都会检查运行历史,如上次任务未结束则跳过此次运行,如连续失败五次则触发企业微信机器人进行预警,其他情况正常运行

由于各部分互不依赖,则可以设置成平行结构:

flowchart TBStart --> bash_1Start --> bash_2Start --> bash_3Start --> bash_4bash_1 --> Endbash_2 --> Endbash_3 --> Endbash_4 --> End

3.2. 优化

首先是关于bash_1的,我们发现解析到HDFS的文件体量过小,影响运行效率,故决定先进行一个HDFS文件的合并,使用hdfs dfs -cat,传入多个文件的路径,将其输出到Hive表的文件夹下,合并成为一个文件

然后是结构问题,原平行结构对环境的影响压力过大,在合并小文件后运行效率有所提升,在不触及数据更新容忍度的情况下,将Azkaban改为顺序结构,人为的加上依赖

flowchart TBStart --> bash_1bash_1 --> bash_2 bash_2 --> bash_3 bash_3 --> bash_4 bash_4 --> End

  1. mysql update加锁分析:是加行锁还是表锁?具体加锁加哪儿?_update表锁-CSDN博客 ↩︎

  2. 面试官:MySQL的UPDATE语句会加哪些锁? | 毛英东的个人博客 ↩︎

http://www.jsqmd.com/news/432862/

相关文章:

  • 把激光雷达干到500线以上,华为乾崑到底图什么?
  • ydata-profiling 汉化魔改
  • 【开题答辩全过程】以 基于web的学校田径运动会管理系统开发与实现为例,包含答辩的问题和答案
  • 2026年3月桥梁模板实力厂家,彰显国产技术实力 - 品牌鉴赏师
  • Go - fmt.Scanln()
  • 2026年3月三氟甲基丙烯酸厂家推荐,售后体系完善实用指南 - 品牌鉴赏师
  • 适配国人肤质 自然堂三八赞「美」礼盒开启科学护肤新体验 - 速递信息
  • PLSQLDEV.EXE-无法找到入口
  • Yi.Net平台管理--工作流
  • VS Code 配置 Markdown 环境
  • 2026年3月三氟丙烯厂家权威推荐,高性能稳定性强行业优选 - 品牌鉴赏师
  • 一文带你了解nginx
  • Win10 自用 Bat 脚本小工具
  • Docker:从入门到实战,解锁容器化部署新姿势
  • 安卓手机配置通用多屏协同及自动化脚本
  • 原生部署迁移至K8S
  • 全球化征途的“定海神针”:eRoad 如何重塑跨国企业的合规与效能基石
  • 2026年3月尼龙厂家权威推荐,高性能稳定性强行业优选 - 品牌鉴赏师
  • 2026年3月三氟乙胺厂家权威推荐,高性能稳定性强行业优选 - 品牌鉴赏师
  • xv6如何开始运行第一个用户进程 - Xwj
  • 免 Xcode 的 iOS 开发新选择?聊聊一款更轻量的 iOS 开发 IDE kxapp 快蝎
  • Lenovo在2026年世界移动通信大会推出自适应AI PC、模块化概念产品和Lenovo Qira
  • 2026年3月箱体钣金加工厂家推荐,各类箱体外壳定制加工 - 品牌鉴赏师
  • NTT DOCOMO BUSINESS与Airlinq建立全球物联网战略合作关系
  • SQL server高可用架构——Failover Cluster Instance
  • Centos配置RabbitMQ
  • 2026年2-溴三氟丙烯(BTP)厂家权威推荐,高性能稳定性强行业优选 - 品牌鉴赏师
  • OpenClaw 消息 Channel 快速部署:飞书、钉钉与主流 IM 一体化接入
  • 和小葛去石家庄。
  • 终将成为你 莉兹与青鸟 短评——2026.3.3 鲜花