数仓治理-计算资源治理

注:文章参考:

数据治理实践 | 网易某业务线的计算资源治理从计算资源治理实践出发,带大家清楚认识计算资源治理到底该如何进行,并如何应用到其他项目中icon-default.png?t=N7T8https://mp.weixin.qq.com/s/w6d5zhDaaavNhW_DMEkPsQ

目录

一、计算资源治理的背景

二、计算资源问题复盘

三、计算资源治理前的思考与行动

3.1 治理前的思考

3.2 治理行动

四、治理效果

 五、小结

前言

    业务成熟期,数仓经常会收到集群资源满载、任务产出延时等消息/邮件,有时候下游数分及其他周边部门也会询问任务运行慢的原因。遇到这类问题,第一想到的是加资源解决,但有些情景,任务运行慢的原因不一定是缺少资源,而是需要优化当前的问题任务。本文章阐述计算资源治理的实施内容。

一、计算资源治理的背景

  • 运行时长过长、资源消耗大

        问题代码运行时产生了数据倾斜,大量相同key的数据会被发往同一个reduce,进而导致该reduce所需的时间远超过其他reduce,成为整个任务的瓶颈。

  • 任务调度时间规划不合理,部分时间段资源消耗较高任务(集群资源打满)

        大量的任务堆积在凌晨xx点执行,核心任务和非核心任务没有做资源级别划分,数据产出延迟被业务方投诉。

  • 存在空跑任务/未引用模型对应任务/无效监控任务

二、计算资源问题复盘

       在做计算治理之前,团队内部盘点了当前计算资源存在的问题(重灾区):

    (1)30+高消耗任务(任务执行时间过长):由于前中期业务扩张,数仓要覆盖下游大量的场景应用,为快速响应需求,开发代码后未经审核就上线,故数仓存在较多问题代码,这些代码运行时可能会发生数据倾斜,消耗大量的资源,最终产出时间很久。

   (2)任务调度安排的不合理:多数任务堆积在凌晨2-5点执行,该区间CPU满载(内存空闲,但是CPU爆满),导致该时间段的资源消耗变成了重灾区,所有核心/非核心任务都在争抢资源,部分核心任务不能按时产出,一直处于等待阶段;

   (3)线上无效DQC&监控配置的资源过少:存在空跑无意义的DQC浪费资源的情况、有些DQC分配的资源过少,导致任务运行时间过长;

        ps:数据质量监控DQC:线上任务执行后会触发对应的DQC规则,DQC分为基础DQC(ods  -> dwd -> dws ->ads每一层都要配置,对核心表/字段进行监控)和业务dqc(ads层配置)

   (4)存在模型未被引用的任务/无效监控任务:早期为快速需求,数仓开发了很多烟囱式数据模型、因为业务迭代或业务下线等,部分模型不再被引用,无用的烟囱模型会带来额外的计算资源开销。

   (5)任务缺少调优参数& 计算引擎为mr/spark2:任务缺少调优参数导致资源无法弹性伸缩,以适配任务进行动态调整。有些线上任务仍然使用mr/spark2计算引擎,导致运行效率很低,产出延迟。

三、计算资源治理前的思考与行动

3.1 治理前的思考

         经过与团队多次沟通,对当前计算资源治理的优先级、改动成本、治理难度、对下游的影响等因素综合评估后,得出治理的顺序可以是:参数调优&任务引擎切换 --> DQC治理-->高消耗任务治理--> 调度安排 --> 下线无用模型 --> 沉淀公共指标

3.2 治理行动

      (1)添加调优参数&计算引擎切换至Spark3

             参数层面例如: set spark.sql.adaptive.enabled=true; 该参数代表:是否开启调整partition功能,如果开启,spark.sql.shuffle.partitions设置的partition可能会被合并到一个reducer里运行,该参数能更好利用的单个executor的性能,还能缓解小文件问题。平台默认是开启的。

          任务执行引擎统一从mr/spark2切换至Spark3进行加速。

  •       (2)DQC治理

                  无效DQC下线:查看DQC任务是否与线上任务一一匹配,将无效DQC任务下线。

                 DQC分配的计算资源调整:由于之前DQC配置资源为集群默认参数,效率极低导致所有DQC运行时长均超过10min。之后调整Driver内存为2048M,Executor个数为2,Executor内存为4096M。

             DQC数量缩减:线上的基础DQC只需要对核心字段进行配置就OK,无关的DQC在不影响下游报表的前提下直接下线处理。

     (3)高消耗任务调优(怎么去优化任务?数据倾斜该怎么调优?)

               高消耗任务:例如:资源消耗连续7天排行前10。调优存在两个难点:1.优化效果不可控;2.高消耗任务调整到何种程度算合适(调优上限不可知)。针对这些难点,我们取所有核心任务的耗时均值,保障单个任务消耗小于平均消耗。此外,我们针对当前高消耗任务列举出以下的优化方案:

  • 参数层面
set hive.auto.convert.join = true; -->是否自动转化成Map Join
set hive.groupby.skewindata=true; --> 当数据出现倾斜时,如果该变量设置为true,hive会自动进行负载均衡
set hive.map.aggr=true; -->是否在map端进行聚合,默认为true;
  • map阶段
1.剪裁列和剪裁行剪裁列:select * from tableA 转换成 select column1 , column2 from tableA;剪裁行:分区限制,where时间及条件限制,减少非必要的数据输入select column1 , column2 from tableA; 转换成select column1 , column2 from tableA where ds ='${lst1date}' and xxx > yyy;
2.distribute by  rand(): 代码结尾添加distribute by rand(),控制map输出结果的分发,即map端如何拆分数据给reduce端;当distribute by 后边定义的列是rand()时,默认采用hash算法,根据reduce个数进行数据分发,保障每 个分区的数据基本一致。
  • reduce阶段
1.笛卡尔积优化多对多关联发生数据膨胀,很可能出现笛卡尔积,根据实际业务,尽量避免
2.sql语句中distinct切换成group by
3.map join :大表join小表map join 会把小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表的数据做匹配关联,由于在map阶段已经进行了join操作,省去reduce阶段,任务整体运行的效率会提升很多。4.大key重组计算(key字段出现空值或单个reduce中的key很多,热点key)   
4.1 column1存在空值select column1,sum(column2) as  column2_amtfrom tableAwhere column1 is not nullgroup by column1;
-----------------------------------------select ifnull(column1,name) as column1_name,sum(column2) as  column2_amtfrom tableAgroup by column1;
------------------------------------------
4.2 column1 数据很多(column1是热点key)方式一:分段,分而治之select column1,sum(column2) as  column2_amtfrom tableAwhere ds = '${lst1date}' and column1 <> 'c'group by column1;union allselect column1,sum(column2) as  column2_amtfrom tableAwhere ds = '${lst1date}'and column1 = 'c'group by column1;方式二:对热点key加盐打散后再分组聚合select split_part(column1_rn,'_',1) as column1,sum(column2_amt) as column2_amt
from (select column1_ct,sum(column2) as column2_amtfrom(select concat(column1,'_',floor(rand()*N)) as column1_rn,sum(column2) as  column2_amtfrom tableAwhere ds = '${lst1date}') t1group by column1_rn)t2
group by split_part(column1_rn,'_',1)
-- rand()*N 生成0~N的随机数,floor下向取整5.过滤逻辑尽可能在子查询中就处理好(t0大表 join 中表t1)
SELECT t0.column1,tmp.column2_amt
from  t0
left join (select column1,sum(column2_amt) as column2_amtfrom t1where ds = '${lst1date}'group by column1) tmp
on t0.column1= tmp.column1
  • 其他层面
spark aqe特性
1.aqe是spark sql的一种动态优化机制,是针对查询执行计划的优化;
2.aqe工作原理:当查询任务提交后,shuffle过程会将任务划分为多个查询阶段。在执行过程中,上一个查询执行完之后,系统会将查询结果保存下来,下一个查询就可以基于上一个查询的结果继续进行计算了;
3.引入aqe机制后,spark可以在任务运行过程中实时统计任务的执行情况,并通过自适应计划将统计结果反馈给优化器,从而对任务再次进行优化,这种边执行、边优化的方式极大提高了sQL的执行效率。
数据倾斜:通常是指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同的key的数据会被发往同一个reduce,进而导致该reduce所需的时间远超过其他reduce,成为整个任务的瓶颈。

     (5)任务调度时间合理规划

              将堆积在凌晨2-5点的600+任务进行梳理,由于任务间错综复杂的依赖关系,修改后可能会级联影响下游报表,因此按照以下步骤逐步实施:

  • 找到所有表的输出输入点,即起始ODS,末尾ADS;
  • 划分核心表/非核心表,整理对应的任务开始时间与结束时间;
  • 划分核心任务/非核心任务,设置任务执行的优先级,将非核心的任务调度延后;
  • 把非核心任务穿插在集群资源的低峰时期运行(2点前,5点后),把核心任务调度提前,保障CDM层(dwd明细层、dws汇总数据层)任务及时产出;
  • 梳理部分时间段资源消耗较高的任务,提前/延后该任务的调度时间,保障资源合理分配; 

    (6)烟囱任务下沉&无用任务下线

            对于烟囱任务,可以将公共指标下沉到到DWS以提高复用性;无用任务/无效监控项任务及时下线(这里建议能拿到报表层级的数据血缘,防止任务下线后影响下游报表的数据呈现),降低资源损耗。

四、治理效果

         计算资源治理后的可量化指标如下(举例):

      (1)将Hive与Spark2任务升级至Spark3,总计升级任务xxx个,升级后任务执行效率提升xx%,cpu资源消耗降低xx%,内存资源消耗降低xx%。

      (2)下线无效DQC任务总计50+,调整DQC运行资源,治理后时长由10min优化至3min内。

      (3)完成线上x+任务优化,x+任务下线,x+表的指标下沉,节省任务耗时xxx分钟。

      (4)任务调度重新分配后,凌晨2-5点的资源使用率由90%降低至50%+,日用资源的趋势图没有大幅度的波动。

      (5)整体治理后为部门减少1/3费用,由原来的xx万元降低至xx万元。

 五、小结

       计算资源治理的核心在于降本增效,用有限资源去运行更多任务。计算资源治理是一项长期工程,不能等到集群资源紧张才去治理优化,而是将计算资源治理的意识贯彻到日常开发中。可通过周/月的资源扫描内容及时推送给数仓部门,让每个任务都有源可循,有方案可优化。

       待补充~

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

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

相关文章

༺༽༾ཊ—Unity之-04-工厂方法模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务&#xff1a;使用工厂方法模式 创建 飞船模型&#xff0c; 首先资源商店下载飞船模型&#xff0c…

2024年1月的论文推荐

又到月底了&#xff0c;在月初推荐论文的基础上又整理了10篇推荐阅读的论文 1、MosaicBERT https://mosaicbert.github.io/ 一种用于快速预训练的双向编码器。MosaicBERT是针对快速预训练优化的自定义BERT架构。主要架构修改:FlashAttention, ALiBi&#xff0c;门控线性单元…

outlook如何群发邮件?外贸邮件群发教程?

outlook邮箱群发邮件方法&#xff1f;outlook怎么设置邮件群发&#xff1f; 如果你正在使用Outlook&#xff0c;那么你一定想要知道如何有效地群发邮件。Outlook作为微软办公套件的一部分&#xff0c;不仅功能强大&#xff0c;而且操作简便。下面&#xff0c;蜂邮EDM就来详细讲…

Redis的应用问题

目录 一、缓存穿透 问题描述 解决方案 缓存击穿 问题描述 解决方案 缓存雪崩 问题描述 解决方案 二、分布式锁 问题描述 解/决方案&#xff1a;使用redis实现分布式锁 优化之设置锁的过期时间 优化之UUID防误删 LUA脚本保证删除的原子性 LUA脚本 LUA脚本在Red…

4-4 D. 银行排队问题之单队列多窗口加VIP服务

题目描述 假设银行有K个窗口提供服务&#xff0c;窗口前设一条黄线&#xff0c;所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时&#xff0c;下一位顾客即去该窗口处理事务。当有多个窗口可选择时&#xff0c;假设顾客总是选择编号最小的窗口。 有些银行会给VIP客户以…

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理 1 安装 scrcpy 地址 https://github.com/Genymobile/scrcpy 转到 relese 下载 我这里下载的是linux系统 v2.3.1 版本 scrcpy-2.3.1.tar.gz 下载 scrcpy-server v2.3.1 版本 scrcpy-server-v2.3.1 解压scrcpy-2.3…

【小呆的力学笔记】弹塑性力学的初步认知二:应力应变分析(2)

文章目录 1.4 主应力空间、八面体应力1.5 应变分析1.6 特殊应力、应变定义 1.4 主应力空间、八面体应力 一点的应力状态不论如何变化&#xff0c;其主应力和主方向一致的话&#xff0c;该点的应力状态就是唯一确定的。因此&#xff0c;我们用主应力方向建立一个三维坐标系来描…

【算法专题】二分查找(进阶)

&#x1f4d1;前言 本文主要是二分查找&#xff08;进阶&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

【前端工程化】环境搭建 nodejs npm

文章目录 前端工程化是什么&#xff1f;前端工程化实现技术栈前端工程化环境搭建 &#xff1a;什么是Nodejs如何安装nodejsnpm 配置和使用npm 介绍npm 安装和配置npm 常用命令 总结 前端工程化是什么&#xff1f; 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块…

【JavaSE篇】——数组练习

目录 &#x1f6a9;数组转字符串 &#x1f6a9;数组拷贝 &#x1f388;拷贝的实质 &#x1f388;copyOf方法(new) &#x1f36d;copyOf扩容 &#x1f388;arraycopy方法(局部的拷贝)(系统类) &#x1f388;copyOfRange方法(局部拷贝) &#x1f388;原数组.clone() &a…

竞赛练一练 第30期:GESP和电子学会相关题目练习

Day14&#xff1a;CIE一级2022.06_报时的公鸡 故事背景&#xff1a;公鸡在黎明时分会打鸣迎接太阳升起&#xff0c;古人也将鸡鸣声当做晨起的“闹钟”。 1. 准备工作 &#xff08;1&#xff09;背景&#xff1a;根据下图绘制两张背景&#xff1b; 01 02 &#xff08;2&…

代码随想录算法训练营Day42|0-1背包理论基础、416. 分割等和子集

目录 0-1背包理论基础 0-1背包问题 二维dp数组01背包 算法实现 一维dp数组01背包 ​编辑算法实现 416. 分割等和子集 前言 思路 算法实现 总结 0-1背包理论基础 0-1背包问题 题目链接https://kamacoder.com/problempage.php?pid1046 有n件物品…

【Javaweb程序设计】【C00162】基于SSM的儿童众筹救助系统(论文+PPT)

基于SSM的儿童众筹救助系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的儿童众筹救助系统 本系统分为登录模块、前台模块、管理员模块、用户模块以及发起人模块5个功能模块. 登录模块&#xff1a;这个功能模块用来让…

vs2019报错MSB4019 找不到导入的项目“BuildCustomizations\CUDA 9.2.props”

在VS中执行生成&#xff0c;报错如下&#xff1a;严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4019 找不到导入的项目“D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 9.2.props”。请确认 Import 声明“D:\Microso…

C++进阶(七)AVL树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、AVL树的概念二、AVL树的旋转1、左单旋2、右单旋3、左右双旋4、右左双旋 三、AVL树的基本实…

SpringCloud--FeignGateWay

Feign 创建项目勾选web SpringWeb 1.0 创建生产者SpringCloudFeignProvider 端口号:8081 pom.xml引入依赖 <!--nacos依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery<…

C语言基础:写一个函数,输入一行字符,将此字符串最长的单词输出

方法一&#xff1a; #include<string.h> int find_longest(char line[])//把数组传过来 {int is_alphabetic(char word);int i 0;int length 0;//统计每个字符串的长度int max 0;//比max长就把值赋值给maxint place 0;//最长单词的起始位置int point;//每个字符串第…

JVM-字节码文件的组成

Java虚拟机的组成 Java虚拟机主要分为以下几个组成部分&#xff1a; 类加载子系统&#xff1a;核心组件类加载器&#xff0c;负责将字节码文件中的内容加载到内存中。 运行时数据区&#xff1a;JVM管理的内存&#xff0c;创建出来的对象、类的信息等等内容都会放在这块区域中。…

100.乐理基础-五线谱-是否需要学习五线谱

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;99.乐理基础-简谱的多声部-CSDN博客 简谱与五线谱的区别&#xff0c;各自的优劣势、使用场景、范围等&#xff1a; 要搞懂这个问题&#xff0c;其实核心就是四个词&#xff1a;首调、固定调、单声部、多声部 首调、…

如何在Ubuntu安装配置SVN服务端并实现无公网ip访问内网资料库

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改au…