近线数仓优化改造

近线数仓优化改造

  • 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语句会加哪些锁? | 毛英东的个人博客 ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统中的软件管理

如何让虚拟机上网 # 1.Linux中软件包的类型 # &#xff08;1&#xff09;DEB #UBlinux DEBlinux &#xff08;2&#xff09;RPM #redhat centOS fadora &#xff08;3&#xff09;bz2|gz|xz #1.需要源码安装需要编译 #2.绿色软件&…

PDFgear:一款免费的PDF编辑、格式转化软件

日常办公中&#xff0c;很多朋友都会接触到PDF文件。把文件转化成PDF是保留文件格式、防范别人修改常用的方法。但是很多人会为PDF文件的生成、压缩、编辑和格式转化而头疼&#xff0c;还有人为了能把PDF转化成Word还购买了不少付费的软件。 为了解决大家这个痛点&#xff0c;…

2024 ccfcsp认证打卡 2023 03 02 垦田计划

import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(System.in);int N 100100; // 定义一个较大的常数Nlong[] t new long[N]; // 存储任务的耗时long[] c new long[N]; // 存储每块区域投入资源的数量long[] c…

【推导结果】如何得到 回归均方误差 估计系数的标准误

对线性回归模型系数标准差标准误的理解 1.生成数据 yxe3.610.633.42-1.387.631.017.44-1.0111.651.3811.46-0.63 2.回归 y β 0 β 1 x ϵ y \beta_{0}\beta_{1}x\epsilon yβ0​β1​xϵ y i β 0 β 1 x i e i y_{i}\beta_{0}\beta_{1} x_{i}e_{i} yi​β0​β1​xi…

Linux第84步_了解Linux中断及其函数

1、中断号 中断号又称中断线&#xff0c;每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断。 2、Linux中断API函数 需要包含头文件“#include <linux/interrupt.h>” 1)、在使用某个中断功能的时候&#xff0c;需要执行“申请中断” int request_irq(…

如何压缩视频到最小?教会你压缩原理~

在网上上传视频时&#xff0c;经常会遇到因为视频体积过大上传失败等情况发生&#xff0c;怎么降低视频体积呢&#xff1f;科普一个小知识&#xff1a;视频体积和视频的时长、编码格式、分辨率和比特率&#xff08;又称码率&#xff09;有关。视频文件大小计算公式&#xff1a;…

掼蛋怎么开牌

一、强牌出单张 1、只有打完小单张&#xff0c;才能争得头游。特别是有两三手小牌&#xff0c;必须要先出掉一两手。 2、首发单张&#xff0c;特别是5以下的小单牌&#xff0c;即先打小牌。表明是强牌。尤其是在贡牌后首发小单牌&#xff0c;属于“明知山有虎&#xff0c;偏向…

13.Java能干什么?以及Java的三大平台

文章目录 一、JavaSE二、JavaME三、JavaEE JAVA从95年以来&#xff0c;已经问世了20多年了&#xff0c;可能比部分同学的年龄还大。 Java到底能干嘛呢&#xff0c;此时就需要讲到Java的三大平台&#xff0c;其实也就是它的三个分类&#xff1a;JavaSE、JavaME、JavaEE。 一、Ja…

【Web应用技术基础】CSS(5)——表格样式

第一题&#xff1a;表格边框 .html <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>HTML – 简单表格</title><link rel"stylesheet" href"step1/CSS/style.css"></head><bod…

Git 命令总览

Git Git 是一个版本控制系统&#xff0c;用于管理项目代码。通过 Git 可以轻松地进行代码的提交、更新和合并&#xff0c;确保项目代码的安全性和稳定性。同时&#xff0c;Git 还提供了丰富的工具和功能&#xff0c;如分支管理、代码审查、版本回退等&#xff0c;帮助开发更好…

docker容器内存检测排查

查询容器使用内存 在运维当中&#xff0c;你会发现内存很彪的高&#xff0c;但是如何判断为什么会高&#xff0c;是什么样的程序造成的呢&#xff1f;赶快使用 top&#xff0c;或者 free -h或者 ps -v。是吗&#xff1f;道理是对的。 但是你会发现&#xff0c;全部都是docker…

Java_19 罗马数字转整数

罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1…

如何扫码登记信息?二维码登记信息更加简单快捷

现在很多场所会通过生成二维码的方式来做人员信息登记或者人员签到&#xff0c;那么这种扫描二维码填写信息的制作技巧是什么样的呢&#xff1f;想要做出这种效果&#xff0c;那么需要生成表单二维码&#xff0c;准备好问题和说明&#xff0c;通过专业工具的功能就可以轻松完成…

Redis中的LRU算法分析

LRU算法 概述 Redis作为缓存使用时&#xff0c;一些场景下要考虑内容的空间消耗问题。Redis会删除过期键以释放空间&#xff0c;过期键的删除策略 有两种: 1.惰性删除:每次从键空间中获取键时&#xff0c;都检查取得的键是否过期&#xff0c;如果过期的话&#xff0c;就删除…

轻松上手,小白也能免费部署自己的炫酷静态网站!(如何免费搭建个人网站)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 使用方法 📒📝 操作步骤📝 更换主题⚓️ 相关链接 ⚓️📖 介绍 📖 在互联网时代,拥有一个个人网站无疑是展示自我、分享知识或建立品牌形象的有效途径。然而,许多人在追求这一目标的过程中,常常因为成本、时间和技…

【C++】1320. 时钟旋转(1)

问题 类型&#xff1a;整数运算 题目描述&#xff1a; 时钟上面的时针从 m 时走到 n 时旋转了多少度&#xff1f;&#xff08;m≤n&#xff0c;且 m 和 n 都是1∼12之间的整数&#xff09;。 输入&#xff1a; 2 个整数 m 和 n。 输出&#xff1a; 1 个整数代表时针旋转的…

[数据结构]插入和希尔排序

一、插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴&#xff0c;但它的原理应该是最容易理解的了&#xff0c;因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排…

全球金融市场的汇率与政策利率演变:历史与未来的交汇

根据国际货币基金组织&#xff08;IMF&#xff09;等平台的数据&#xff0c;整理了全球各国的兑美元汇率&#xff0c;短期利率、长期利率、政策利率数据&#xff0c;时间范围最新至2024年3月&#xff0c;希望对大家有所帮助 一、数据介绍 数据名称&#xff1a;全球各国汇率、短…

O2OA(翱途)开发平台-快速入门开发一个门户实例

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]拥有门户页面定制与集成的能力&#xff0c;平台通过门户定制&#xff0c;可以根据企业的文化&#xff0c;业务需要设计符合企业需要的统一信息门户&#xff0c;系统首页等UI界面。本篇主要介绍通过门户管理系统如何快速的进行一个…

DoubleU-Net:一种用于医学图像分割的深度卷积神经网络

DoubleU-Net&#xff1a;一种用于医学图像分割的深度卷积神经网络 摘要引言相关工作方法 DoubleU-Net A Deep Convolutional Neural Network for Medical Image Segmentation–2020 摘要 语义图像分割是将图像中的每个像素标记为相应的类的过程。基于编码器-解码器的方法&…