Dataworks批量刷数优化方案探讨
Dataworks批量刷数优化方案探讨
在数据仓库的日常使用中,经常会有批量补数据,或者逻辑调整后批量重跑数据的场景。
批量刷数的实现方式,因调度工具差异而各有不同。
Dataworks调度批量刷数局限
我们的数据仓库构建在阿里云的dataworks+maxcompute产品上,dataworks的调度工具提供了补数据的功能,可以很方便的补整个任务流的数据,但是该功能有个局限,就是只能指定一个参数,即业务日期,如下图。
如果要刷一个月的数据,比如2021年10月份,要怎么操作呢?业务日期选定时间范围2021-10-01 ~ 2021-10-31。然后dataworks会根据选定的时间范围,每天生成一个实例去执行任务补数据,也就是补数据的任务要跑31次,每次补一天的数据。
这样就会导致整个补数的过程非常缓慢,且耗资源。
- 因为maxcompute是基于hive的,一个任务的启动初始化-〉申请资源-〉等待资源分配的过程是很重、很缓慢的,31个天任务的这个过程中耗时会是单个任务的31倍(未并行的情况下)。初步统计了一下,单个maxcompute任务的启动耗时大概是8s,31个任务启动就比单个任务多出了4分钟,如果整个流程涉及10个任务,整个刷数的耗时单在这个阶段就要多出40分钟。
- 作为大数据的计算引擎,在一定的数据量级内,数据处理的耗时差别并不大。也就是说一次处理一天的数据,相较于一次处理一个月的数据,正常而言区别不会很大,绝对低于处理30次一天数据的耗时。
所以想要有效率的补数,不能依靠这种方式。
优化方案1
提升批量刷数效率的第一步,就是改造任务,按时间范围跑数,比如一次跑一个月的数据。但是这与日常调度的任务又有冲突,所以需要新建一份做为手动任务发布执行。
同时dataworks的手动任务的执行,也只能指定一个业务日期参数,且没法选定业务日期范围,即批量生成实例。
介于这个限制,所以手动任务的跑数时间周期只能是固定的,比如月、周、年。
按照这种方式刷数的效率,也已经远远高于前面的多实例按天补数据的方式。
实际案例,一个涉及近30个任务的流程,通过补数据的多实例按天刷一个月的数,耗时需6.5~8小时。通过手动任务按月刷数耗时只需1.5~2小时,效率提升近75%。
这种方式的缺点是:
- 同一脚本要维护两套,一套周期任务,一套手动任务。增加维护成本。
- 脚本跑数时间周期固定,如果需要调整周期需改脚本,并单独发布。比如按月刷数的脚本,想要按年刷,需要改脚本重新发布。
优化方案2
仔细分析,造成批量刷数麻烦、效率低下的根本原因,其实是dataworks的调度工具(不管是补数据,还是手工任务执行)只能指定一个参数。
有其他调度工具使用经验的朋友都会知道,在用调度工具手动执行任务时,一般是可以指定任务的入参的。而一般的ETL脚本都会设置两个入参: 开始时间、结束时间,来支持按时间范围跑数。
而阿里云dataworks调度工具支持自定义传参的唯一方式是赋值节点。通过赋值节点的输出参数,将参数传递给下游任务,下游任务可通过设置依赖赋值节点,获取赋值节点的输出参数,作为本节点任务的入参。
具体配置方法,可参考dataworks的说明文档:https://help.aliyun.com/document_detail/137534.html
所以具体的优化思路是,通过控制赋值节点的输出值,来指定下游任务的跑数时间范围,以实现批量刷数的目的。
赋值节点配置
因赋值节点的输出值需要可人为调整,所以设计创建一参数表,赋值节点从表里获取数据,作为输出值。可通过update参数表的值,来调整赋值节点输出值。
因为要update表,所以需创建一个支持事务(update)的表,同时需要包含下游节点需要的两个参数:开始时间、结束时间。
如:
CREATE TABLE IF NOT EXISTS schedule_args(
start_date BIGINT COMMENT '开始日期,格式:yyyymmdd'
,end_date BIGINT COMMENT '结束日期,格式:yyyymmdd'
) STORED AS ALIORC
TBLPROPERTIES ('comment'='调度任务入参表', 'transactional'='true')
;
又,因为只有周期任务支持赋值节点,且下游任务都得从该节点获取跑数时间范围。所以这里会有个风险点: 对赋值节点参数的调整可能影响到下游任务的日常调度。
解决方法是:通过增加判断逻辑,把日常调度与补数据两种场景的参数生成区别开。
具体实现是:通过获取dataworks内置业务日期参数$bizdate,并对业务日期值的判断,来区分周期调度和补数据两种场景。 正常周期调度的业务日期都是前一天,而补数据指定的业务日期不是。
所以赋值节点的脚本如下:
select case when '${bizdate}' <> to_char(dateadd(getdate(),-1,'dd'),'yyyymmdd') then start_date else '${bizdate}' end as start_date
,case when '${bizdate}' <> to_char(dateadd(getdate(),-1,'dd'),'yyyymmdd') then end_date else '${bizdate}' end as end_date
from schedule_args ;
注: 更完备的规避风险的方法是,通过python脚本从表获取参数,并增加对空表和表不存在两种异常场景的处理。
这样正常日调度,赋值节点生成的输出参数值都是前一天,与不使用赋值节点获取的dataworks业务日期参数一致。
简单测试
配置下游节点,测试赋值节点的参数生成和下游节点的参数获取,以及日常调度和补数据场景的切换。
下游测试节点配置:
节点流程如下:
参数表配置:
业务日期选择前一天,模拟日常调度场景:
下游节点获取入参为正常日调度的业务日期:
补数据场景:
下游节点获取入参为参数表配置的日期:
小结
对于刷数时间周期固定,业务逻辑稳定变更少的任务流程,方案1比较适合。
方案2解决了方案1同一任务需要同时维护多套的问题,同时能够动态调整跑数的时间周期,支持批量刷数的场景更多,也更方便。唯一存在的问题是,在多人同时通过调整参数表进行批量刷数的时候,会有冲突。
比如:开发者A,update了参数表的值为20211001、20211029。在他执行补数据实例之前,开发者B也要刷数据,将参数表的值改为了20201001、20201030。开发者A再去执行补数据时,获取的参数时开发者B修改后的参数值20201001、20201030。
因为maxcompute还没有锁表机制,所以这个问题目前还没有很好的解决方案,只能通过收拢表修改权限等方式,来人为规避这个问题。
福星
Dataworks批量刷数优化方案探讨的更多相关文章
- 移动 H5 首屏秒开优化方案探讨
转载bang大神文章,原文<移动 H5 首屏秒开优化方案探讨>,此文仅仅用做自学与分享! 随着移动设备性能不断增强,web 页面的性能体验逐渐变得可以接受,又因为 web 开发模式的诸多好 ...
- MySQL 大表优化方案探讨
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- oracle批量插入优化方案
今天听DBA说如果从一个表批量查询出一批数据之后批量插入另外一张表的优化方案: 1)不写归档日志: 2)采用独占 关于insert /*+ append */我们需要注意以下三点: a.非归档模式下, ...
- 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结
本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言 MySQL作为开源技术的代表作之一,是 ...
- MySQL 大表优化方案(长文)
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- [转帖] 数据库用优化方案 https://segmentfault.com/a/1190000006158186
Mysql大表优化方案 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部 ...
- [转] 钉钉的H5性能优化方案
对于一个H5的产品,功能无疑很重要,但是性能同样是用户体验中不可或缺的一环.原本H5的渲染性能就不及native的app,如果不把性能优化做起来,将极大地影响用户使用产品的积极性. 用户感受 当用户能 ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转载)
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...
- mysql 百万级数据库优化方案
https://blog.csdn.net/Kaitiren/article/details/80307828 一.百万级数据库优化方案 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 wher ...
随机推荐
- 深入学习Composer原理(三)
本系列第三篇文章,一起了解下PSR规范中的PSR4和PSR0规范 首先恭喜大家,包括我自己,坚持到了现在.这篇文章之后,Composer的基础原理就清晰明了咯.也就是说,Composer所利用的正是s ...
- symfony2 数据库原生查询
1. 数组,没有键名 但只查询出第一个结果 $conn = $this->getDoctrine()->getConnection(); $data = $conn->fetchAr ...
- Linux系列(12) - find
简述 find搜索文件,搜索方式丰富,遍历给定范围的所有目录下的文件(避免大范围的搜索,会非常浪费系统资源,建议不在直接在"/"目录下搜索) 命令格式 基本使用 格式:find [ ...
- python学习笔记(十六)-Python多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- 使用Postman做接口测试(学生信息的6个接口)
使用postman做接口测试,案例中涉及到接口有:获取学生信息.登录.添加学生信息.学生金币充值.获取所有学生信息.文件上传. 一.获取学生信息(get请求) 请求方式选择:get 直接在访问地址栏中 ...
- NOI.AC#2007-light【根号分治】
正题 题目链接:http://noi.ac/problem/2007 题目大意 \(n\)个格子排成一排,每个格子有一个\(0/1\)和一个颜色.开始每个格子都是\(0\),\(q\)次操作取反一个颜 ...
- SpringBoot 添加本地 jar 文件
前言 有时候我们在项目中,会用到一些本地 jar 包文件,比如隔壁公司自己打包的: 此时无法从maven远程仓库拉取: 那么我们可以考虑把 jar 文件安装到本地 maven 库中,然后再添加依赖. ...
- 初探计算机网络之HTTPS请求
HTTPS自诞生以来,我们总是对它充满着很多的疑问,HTTPS到底是啥?HTTPS多出来的S指的是什么?HTTPS安全可靠吗?访问一个HTTPS的网站的流程等等,带着这些疑问,我们一起来揭开HTT ...
- 微服务+异步工作流+ Serverless,Netflix 决定弃用稳定运行 7 年的旧平台
作者 | Frank San Miguel 策划 | 田晓旭 2021 年,Netflix 会将大部分的工作负载从 Reloaded 转移到 Cosmos 平台.Cosmos 是一个计算平台,它将微服 ...
- appium操作安卓应用所需要的数据准备
操作系统.系统版本如下所示: desired_caps={} desired_caps["platformName"]="Android" desired_ca ...