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 ...
随机推荐
- vue 学习资料
自学资料地址: https://zhuanlan.zhihu.com/p/26535530项目UI部分1.pc站 UI:(1)考虑自己写成本高,需要花费不少时间,好处是可以自己控制维护!(2)引入第三 ...
- requests接口自动化-数据库参数化
数据库参数化的场景 部分接口,参数其他方式获取不到,可以去数据库去获取,如手机验证码 安装pymysql 配置文件 def sql_conf(): # 定义数据库的配置 host='127.0.0.1 ...
- 前端js单元测试 使用mocha、chai、sinon,karma
karma(因果报应) 提供在浏览器上测试 可以同时跑在多个浏览器下 mocha测试框架 其他测试框架还有Jasmine chai断言库 expect = chai.expect sinon ...
- linux mint17.3+vmware 12.1.1 流畅安装运行OSX EI capitan
在linux mint17.3的vmware虚拟机中安装mac osx ei capitan系统 出于对苹果操作系统的好奇与喜爱,分别在宿主机操作系统为windows 7和linux mint17.3 ...
- P5180-[模板]支配树
正题 题目链接:https://www.luogu.com.cn/problem/P5180 题目大意 给出\(n\)个点的一张有向图,求每个点支配的点数量. \(1\leq n\leq 2\time ...
- php flush() 页面缓冲及时输出 每隔一秒输出页面输出
<?php //方案一 ob_end_clean(); echo str_pad('', 1024); // 设置足够大,大过php.ini的output_buffering设置值 for ($ ...
- TWAIN-v2.4-说明文档翻译(2)技术概览
技术概览 Technical Overview TWAIN架构(TWAIN Architecture) 数据交互的实现在TWAIN中由三类软件元素共同工作完成:应用程序(the application ...
- 寻找最佳路径(ArcPy实现)
一.背景 随着社会经济发展需求,公路的重要性日益提高.在一些交通欠发达的地区,公路建设迫在眉睫.如何根据实际地形情况设计出比较合理的公路规划,是一个值得研究的问题. 二.实验目的: (1)通过练习,熟 ...
- RabbitMQ的消息可靠性(五)
一.可靠性问题分析 消息的可靠性投递是使用消息中间件不可避免的问题,不管是使用哪种MQ都存在这种问题,接下来要说的就是在RabbitMQ中如何解决可靠性问题:在前面 在前面说过消息的传递过程中有三个对 ...
- CF125E MST company (凸优化+MST)
qwq自闭的一个题 我来修锅辣!!!!!! 这篇题解!可以\(hack\)全网大部分的做法!!! 首先,我们可以把原图中的边,分成两类,一类是与\(1\)相连,另一类是不与\(1\)相连. 原题就转化 ...