大数据最新近线数仓优化改造(3),2024年最新这些知识你必须拿下



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
从其他封闭系统产生的日志文件,经由本系统的后端部分近线解析,将结果直接存入MySQL,而后由数仓部分使用Python脚本洗入Hive,但这实在是太慢了。
在代码当中埋了一些输出点之后,经过对行为日志的分析,我们发现最慢的部分是在数据转换的Python脚本部分
更进一步地,Python脚本的结构大概是:
#mermaid-svg-8TGRzlFi0cWusPk7 {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 .error-icon{fill:#552222;}#mermaid-svg-8TGRzlFi0cWusPk7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8TGRzlFi0cWusPk7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-8TGRzlFi0cWusPk7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8TGRzlFi0cWusPk7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8TGRzlFi0cWusPk7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8TGRzlFi0cWusPk7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8TGRzlFi0cWusPk7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8TGRzlFi0cWusPk7 .marker.cross{stroke:#333333;}#mermaid-svg-8TGRzlFi0cWusPk7 svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8TGRzlFi0cWusPk7 .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 .cluster-label text{fill:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 .cluster-label span{color:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 .label text,#mermaid-svg-8TGRzlFi0cWusPk7 span{fill:#333;color:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 .node rect,#mermaid-svg-8TGRzlFi0cWusPk7 .node circle,#mermaid-svg-8TGRzlFi0cWusPk7 .node ellipse,#mermaid-svg-8TGRzlFi0cWusPk7 .node polygon,#mermaid-svg-8TGRzlFi0cWusPk7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8TGRzlFi0cWusPk7 .node .label{text-align:center;}#mermaid-svg-8TGRzlFi0cWusPk7 .node.clickable{cursor:pointer;}#mermaid-svg-8TGRzlFi0cWusPk7 .arrowheadPath{fill:#333333;}#mermaid-svg-8TGRzlFi0cWusPk7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8TGRzlFi0cWusPk7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8TGRzlFi0cWusPk7 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-8TGRzlFi0cWusPk7 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-8TGRzlFi0cWusPk7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8TGRzlFi0cWusPk7 .cluster text{fill:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 .cluster span{color:#333;}#mermaid-svg-8TGRzlFi0cWusPk7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8TGRzlFi0cWusPk7 :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
JSON
Table
MySQL
Python
Hive
也就是说,MySQL当中存储的是JSON格式的数据,原设计是直接向Elasticsearch进行推送的,后来追加了一个存入Hive的通道
那么进一步分析Python脚本的流程,大概是:
#mermaid-svg-jtnSfCW0E7Jwi0Fi {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .error-icon{fill:#552222;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .marker.cross{stroke:#333333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .cluster-label text{fill:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .cluster-label span{color:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .label text,#mermaid-svg-jtnSfCW0E7Jwi0Fi span{fill:#333;color:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .node rect,#mermaid-svg-jtnSfCW0E7Jwi0Fi .node circle,#mermaid-svg-jtnSfCW0E7Jwi0Fi .node ellipse,#mermaid-svg-jtnSfCW0E7Jwi0Fi .node polygon,#mermaid-svg-jtnSfCW0E7Jwi0Fi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .node .label{text-align:center;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .node.clickable{cursor:pointer;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .arrowheadPath{fill:#333333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .cluster text{fill:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi .cluster span{color:#333;}#mermaid-svg-jtnSfCW0E7Jwi0Fi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jtnSfCW0E7Jwi0Fi :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
WHERE state=0 LIMIT …
Table
UPDATE state=1 WHERE … IN
MySQL
Python
Hive
问题就出现在,Python脚本对MySQL数据解析状态的更新上
由于采用的是UPDATE且附带WHERE条件,所以每次更新状态的时候,似乎都会把整个表锁上,详见这个1和这个2
而且由于这个表同时还有推送ES的一个通道,可能还有其他地方在同时访问,所以整张表会锁很久
2. 优化
找到了症结,接下来就是想办法了
既然问题出现在数据回流上,那么能不能想办法去掉这个步骤?
经过对MySQL表结构的分析,我们发现其中的某个字段与时间戳相关
也就是说,这张表的数据,在这个字段上是有序的
那么我们可以将这个字段作为关键字,记录此次数据处理到了哪个位置
优化后的大致结构如下:
#mermaid-svg-fNONDYadqlsJplAm {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fNONDYadqlsJplAm .error-icon{fill:#552222;}#mermaid-svg-fNONDYadqlsJplAm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fNONDYadqlsJplAm .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-fNONDYadqlsJplAm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fNONDYadqlsJplAm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fNONDYadqlsJplAm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fNONDYadqlsJplAm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fNONDYadqlsJplAm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fNONDYadqlsJplAm .marker.cross{stroke:#333333;}#mermaid-svg-fNONDYadqlsJplAm svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fNONDYadqlsJplAm .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-fNONDYadqlsJplAm .cluster-label text{fill:#333;}#mermaid-svg-fNONDYadqlsJplAm .cluster-label span{color:#333;}#mermaid-svg-fNONDYadqlsJplAm .label text,#mermaid-svg-fNONDYadqlsJplAm span{fill:#333;color:#333;}#mermaid-svg-fNONDYadqlsJplAm .node rect,#mermaid-svg-fNONDYadqlsJplAm .node circle,#mermaid-svg-fNONDYadqlsJplAm .node ellipse,#mermaid-svg-fNONDYadqlsJplAm .node polygon,#mermaid-svg-fNONDYadqlsJplAm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fNONDYadqlsJplAm .node .label{text-align:center;}#mermaid-svg-fNONDYadqlsJplAm .node.clickable{cursor:pointer;}#mermaid-svg-fNONDYadqlsJplAm .arrowheadPath{fill:#333333;}#mermaid-svg-fNONDYadqlsJplAm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fNONDYadqlsJplAm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fNONDYadqlsJplAm .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-fNONDYadqlsJplAm .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-fNONDYadqlsJplAm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fNONDYadqlsJplAm .cluster text{fill:#333;}#mermaid-svg-fNONDYadqlsJplAm .cluster span{color:#333;}#mermaid-svg-fNONDYadqlsJplAm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fNONDYadqlsJplAm :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
WHERE timestamp < …
JSON
Table
UPDATE timestamp
timestamp
Python
MySQL
Hive
Record
这样一来,数仓部分对这张表就只有读取部分,去掉写入,不再产生相关的锁,大大提升了运行效率
3. 改造
3.1. 重构
但是好景不长,过了一段时间,这部分的表现又不如人意,于是决定重构,大致的结构如:
#mermaid-svg-CZrJJ0bcaY3KUJ0F {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .error-icon{fill:#552222;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .marker.cross{stroke:#333333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .cluster-label text{fill:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .cluster-label span{color:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .label text,#mermaid-svg-CZrJJ0bcaY3KUJ0F span{fill:#333;color:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .node rect,#mermaid-svg-CZrJJ0bcaY3KUJ0F .node circle,#mermaid-svg-CZrJJ0bcaY3KUJ0F .node ellipse,#mermaid-svg-CZrJJ0bcaY3KUJ0F .node polygon,#mermaid-svg-CZrJJ0bcaY3KUJ0F .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .node .label{text-align:center;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .node.clickable{cursor:pointer;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .arrowheadPath{fill:#333333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .cluster text{fill:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F .cluster span{color:#333;}#mermaid-svg-CZrJJ0bcaY3KUJ0F div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CZrJJ0bcaY3KUJ0F :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
Parse
Bash
Python
File
HDFS
Hive
ES
此次将日志文件直接解析到HDFS,再通过Bash直接建表到Hive,最后推送至ES
数仓结构大概是:
#mermaid-svg-tXs1XzqfaFfSNFLx {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx .error-icon{fill:#552222;}#mermaid-svg-tXs1XzqfaFfSNFLx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tXs1XzqfaFfSNFLx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-tXs1XzqfaFfSNFLx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tXs1XzqfaFfSNFLx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tXs1XzqfaFfSNFLx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tXs1XzqfaFfSNFLx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tXs1XzqfaFfSNFLx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tXs1XzqfaFfSNFLx .marker.cross{stroke:#333333;}#mermaid-svg-tXs1XzqfaFfSNFLx svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tXs1XzqfaFfSNFLx .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx .cluster-label text{fill:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx .cluster-label span{color:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx .label text,#mermaid-svg-tXs1XzqfaFfSNFLx span{fill:#333;color:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx .node rect,#mermaid-svg-tXs1XzqfaFfSNFLx .node circle,#mermaid-svg-tXs1XzqfaFfSNFLx .node ellipse,#mermaid-svg-tXs1XzqfaFfSNFLx .node polygon,#mermaid-svg-tXs1XzqfaFfSNFLx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tXs1XzqfaFfSNFLx .node .label{text-align:center;}#mermaid-svg-tXs1XzqfaFfSNFLx .node.clickable{cursor:pointer;}#mermaid-svg-tXs1XzqfaFfSNFLx .arrowheadPath{fill:#333333;}#mermaid-svg-tXs1XzqfaFfSNFLx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tXs1XzqfaFfSNFLx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tXs1XzqfaFfSNFLx .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-tXs1XzqfaFfSNFLx .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-tXs1XzqfaFfSNFLx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tXs1XzqfaFfSNFLx .cluster text{fill:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx .cluster span{color:#333;}#mermaid-svg-tXs1XzqfaFfSNFLx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tXs1XzqfaFfSNFLx :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
Bash
SQL
SQL
Python
HDFS
ODS
DWD
APP
ES
APP直接从ODS加工有两个考虑:
- 其一是某个特殊字段仅在
APP有效,所以DWD没有保存,只能从ODS取数 - 其二是提高并行度,使得
DWD和APP可以同时加工
除此之外还有控制结构:

大概是,有四个控制脚本,有一个控制表
控制表的部分效果如下:
- 记录远程文件名称,及其解析到的对应的
HDFS文件的名称 - 记录该文件的解析状态,例如说已落
ODS
几个控制脚本的部分作用如下:
1.sh
- 根据控制表当中的记录,选取还未处理的
HDFS文件,在Hive当中建立对应的表 - 处理完成之后更新这些记录的状态
2.sh
- 根据控制表当中的记录,选取已经落到
ODS的表,加工数据到DWD - 处理完成之后更新这些记录的状态
3.sh
- 根据控制表当中的记录,选取已经落到
ODS的表,加工数据到APP - 处理完成之后更新这些记录的状态
3_5.sh
- 根据控制表当中的记录,选取已经落到
APP的表,推送数据到ES - 处理完成之后更新这些记录的状态
- 此环节暂时跳过
4.sh
- 根据控制表当中的记录,选取已经落到
DWD和APP的表,删除其在ODS的数据 - 根据控制表当中的记录,选取已经推送到
ES的表,且数据已过保留期限,删除其在APP的数据 - 处理完成之后更新这些记录的状态
该数仓使用Azkaban进行调度,设定自动任务为每10分钟自动运行一次。每次任务运行之前都会检查运行历史,如上次任务未结束则跳过此次运行,如连续失败五次则触发企业微信机器人进行预警,其他情况正常运行


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
APP
2. 处理完成之后更新这些记录的状态
3_5.sh
- 根据控制表当中的记录,选取已经落到
APP的表,推送数据到ES - 处理完成之后更新这些记录的状态
- 此环节暂时跳过
4.sh
- 根据控制表当中的记录,选取已经落到
DWD和APP的表,删除其在ODS的数据 - 根据控制表当中的记录,选取已经推送到
ES的表,且数据已过保留期限,删除其在APP的数据 - 处理完成之后更新这些记录的状态
该数仓使用Azkaban进行调度,设定自动任务为每10分钟自动运行一次。每次任务运行之前都会检查运行历史,如上次任务未结束则跳过此次运行,如连续失败五次则触发企业微信机器人进行预警,其他情况正常运行
[外链图片转存中…(img-GR5oiZLO-1715061493668)]
[外链图片转存中…(img-GdodYo2D-1715061493668)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
更多推荐
所有评论(0)