近线数仓优化改造

news2024/9/23 21:25:57

近线数仓优化改造

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

1. 背景

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

Parse
Python
File
MySQL
Hive

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

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

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

JSON
Table
MySQL
Python
Hive

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

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

WHERE state=0 LIMIT ...
Table
UPDATE state=1 WHERE ... IN
MySQL
Python
Hive

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

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

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

2. 优化

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

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

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

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

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

优化后的大致结构如下:

WHERE timestamp < ...
JSON
Table
UPDATE timestamp
timestamp
Python
MySQL
Hive
Record

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

3. 改造

3.1. 重构

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

Parse
Bash
Python
File
HDFS
Hive
ES

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

数仓结构大概是:

Bash
SQL
SQL
Python
HDFS
ODS
DWD
APP
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分钟自动运行一次。每次任务运行之前都会检查运行历史,如上次任务未结束则跳过此次运行,如连续失败五次则触发企业微信机器人进行预警,其他情况正常运行

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

Start
bash_1
bash_2
bash_3
bash_4
End

3.2. 优化

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

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

Start
bash_1
bash_2
bash_3
bash_4
End

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1545430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】动态内存管理及其常见错误

文章目录 1、前言&#xff1a;为什么要有动态内存分布2、三种动态内存的创建方式及其释放2.1 malloc2.2 calloc2.3 ralloc2.4 free 3、常⻅的动态内存的错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使⽤free释放⼀块动态开…

C++动态内存管理:new/delete与malloc/free的对比

在C中&#xff0c;动态内存管理是一个至关重要的概念。它允许我们在程序运行时根据需要动态地分配和释放内存&#xff0c;为对象创建和销毁提供了灵活性。在C中&#xff0c;我们通常会用到两对工具&#xff1a;new/delete 和 malloc/free。虽然它们都能够完成类似的任务&#x…

2月线上速溶咖啡行业数据分析:“减肥咖啡”引领电商新潮流

随着生活节奏的加快&#xff0c;速溶咖啡因其便捷性受到广大消费者的青睐。不过&#xff0c;在如今世界咖啡市场激烈竞争的情况下&#xff0c;中国速溶咖啡市场也受到影响&#xff0c;增速有所放缓。 根据鲸参谋电商数据平台显示&#xff0c;2月线上综合电商&#xff08;京东天…

003_vector_conventions_in_MATLA中的向量约定

MATLAB中的向量约定 1. 前言 MATLAB是一种用于数值计算和数据可视化的高级编程语言。以前&#xff0c;都不好意思说它是编程语言&#xff0c;它实际上只是一个脚本工具&#xff0c;配套了一堆工具箱。比如Simulink&#xff0c;可以开展非常复杂的仿真&#xff0c;还能编译到实…

海外媒体发稿:出口贸易媒体发稿7个秘籍揭晓-华媒舍

出口贸易是许多国家经济增长的关键驱动力之一。不仅可以加快国家的发展步伐&#xff0c;还能为企业创造巨大的商机。如何能够在出口贸易中取得成功&#xff0c;如何能够引起媒体的关注&#xff0c;成为企业广告和宣传的焦点&#xff0c;是许多出口企业面临的挑战。本文将揭示出…

【LeetCode热题100】108. 将有序数组转换为二叉搜索树(二叉树)

一.题目要求 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#x…

【Java程序设计】【C00367】基于(JavaWeb)Springboot的粮仓管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

JVM——字符串常量池

在Java程序中String类的使用几乎无处不在&#xff0c;String类代表字符串&#xff0c;字符串对象可以说是Java程序中使用最多的对象了。首先&#xff0c;在Java中创建大量对象是非常耗费时间的。其次&#xff0c;在程序中又经常使用相同的字符串对象&#xff0c;如果每次都去重…

企业计算机服务器中了locked勒索病毒怎么处理?Locked勒索病毒解密流程

在网络技术不断发展应用过程中&#xff0c;越来越多的企业利用网络开展各项工作业务&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;但网络威胁手段也在不断增加&#xff0c;为企业的数据安全带来严重威胁。近日&#xff0c;新一波的网络勒索病毒比较猖獗&#xf…

云电脑火爆出圈,如何选择和使用?--腾讯云、ToDesk云电脑、青椒云使用评测和攻略

前言&#xff1a; Hello大家好&#xff0c;我是Dream。在当下&#xff0c;科技的飞速发展已经深入影响着我们的日常生活&#xff0c;特别是随着物联网的兴起和5G网络的普及&#xff0c;云计算作为一个重要的技术概念也逐渐走进了我们的视野。云计算早已不再是一个陌生的名词&am…

FANUC机器人零点标定的基本步骤(出厂数据)

FANUC机器人零点标定的基本步骤(出厂数据) FANUC 零点数据存在问题的机器人通常会出现以下几种报警: (1)SRVO-062报警 - 脉冲编码器数据丢失,机器人完全不能动,具体消除方法可参考以下链接中的内容: FANUC机器人SRVO-062报警原因分析及处理对策 (2)SRVO-075报警 -…

qrcode插件-生成二维码

安装 yarn add qrcodejs2 --save npm install qrcodejs2 --save 使用 <template><div><div id"qrcodeImg"></div><!-- 创建一个div&#xff0c;并设置id --></div> </template> <script> import QRCode from q…

9.串口通信

串口基本认识 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方 式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简 单&#x…

qt材料库---最新版(使用QsqlDatabase、QJsonObject)

将每种材料的参数设置保存为json,并将整个json语句放到数据库中,同时显示到列表中。 选中某行时,将参数反馈到控件上 源码 Material.h #pragma once #include "QtWindow.h" #include "ui_Widget.h" #include <QWidget> #include <QObject>…

Jetson AGX ORIN 配置 FGVC-PIM 神经网络(包含 arm64 下面 torch 和 torchvision 配置内容)

Jetson AGX ORIN 配置 FGVC-PIM 神经网络 文章目录 Jetson AGX ORIN 配置 FGVC-PIM 神经网络配置 ORIN 环境创建 FGVC-PIM 虚拟环境安装 PyTorch安装 torchvision安装其他依赖包 配置 ORIN 环境 首先先配置 ORIN 的环境&#xff0c;可以参考这个链接&#xff1a; Jetson AGX …

如何为企业策划一场XR虚拟直播?

活动年年办&#xff0c;都是老一套&#xff0c;想玩点新花样&#xff1f; 预算有限&#xff0c;但还是想把活动办的逼格高一点&#xff1f; 想通过活动&#xff0c;让更多的人知道自己企业的品牌&#xff1f; 随着AIGC技术的不断演变&#xff0c;企业活动的形式和内容也在不…

深入了解 Vue 3:性能与可用性的巨大提升

摘要&#xff1a;本文深入探讨了 Vue 3 相对于 Vue 2 在性能和可用性方面的重大改进&#xff0c;特别关注了虚拟 DOM 模块的重构&#xff08;静态提升&#xff09;、基于 Proxy 的响应式对象、事件缓存、更好的 Tree Shaking 支持、TypeScript 和 Monorepo 代码组织&#xff0c…

Java两地经纬度通过高德api获取两地距离(公里)

代码如下&#xff1a; String startLongitude entity.getLONGITUDE(); // 起点&#xff08;当前位置&#xff09;经度String startLatitude entity.getLATITUDE(); // 起点纬度String endLongitude entity.getLO(); // 终点经度String endLatitude entity.getLA(); …

vue-office/docx插件实现docx文件预览

1.下包 //预览docx文件 npm install vue-office/docx vue-demi//如果是vue2.6版本或以下还需要额外安装 vue/composition-api2.引入 <template><div>//在src填入文档地址<VueOfficeDocx srchttp://...../xx.docx style"width:80%" rendered"re…

Linux下的I/O模型

目录 一、什么是IO&#xff1f; 二、IO操作的两个阶段 三、五种I/O模型 1、阻塞I/O(blocking I/O) 2、非阻塞I/O(non-blocking I/O) 3、多路复用I/O(multiplexing I/O) 4、信号驱动I/O(signal-driven I/O) 5、异步I/O(asynchronous I/O) 四、五种I/O模型比较 一、什么…