作者:DataWorks产品经理 刘天鸢
一、数据开发的意义和价值
下图是DataWorks的开发界面,DataStudio的中央是一个工作流,里面有同步任务和SQL任务,可以基于企业不同需求拖入其他节点,比如EMR节点或其他类型引擎节点等。开发人员在面对异构数据源或异构计算引擎时,能够非常便捷的以拖拽的形式来进行数据开发,构建离线或实时调度任务的工作流。
2009年之前,阿里集团使用的是Oracle,调度用的是非常原始的Crontab,可以想象,随着任务量和数据量的增加,这样的调度方式非常不现实。所以在2009年8月,DataWorks的前身“天网”就发布了。天网是一个简单的、能够支持配置调度周期的工具。
随着阿里集团登月计划的启动和数据中台的发展,DataWorks也进行了多次迭代。2015年DataWorks以D+的形态进入公共云及专有云市场,开始服务政企用户。2016年数加平台发布,数加品牌把DataWorks和MaxCompute这个强有力的组合推向市场。2017、2018和2020年,DataWorks完成了国际化及从2.0到3.0版本的升级。
现在,DataWorks已经成为了一个能够支持多个引擎、多实例以及跨地域调度的强大的大数据生产调度工具了。
使用过开源的用户都比较了解,当一个开源的集群被搭建起来,可以通过最基本的命令行对数据进行上传、计算。当在构建大数据体系时,任务的工作流会非常大,这个时候就不得不借助一些开源的调度工具,如Azkaban、OOZIE、AirFlow等,帮助用户调度运行整个工作流里的任务。但是为了实现任务之间的依赖关系,这些开源的调度工具都会维护一个或多个甚至几十个配置文件,这对技术人员来说,不仅门槛高而且效率低,容易出错。
面对开源调度的这个瓶颈,DataWorks的价值就体现出来了。
企业有了大数据引擎后,理论上能够承接整个企业的数据需求做一些计算的。但是当企业的业务人员和非技术人员想要这些数据的时候,就会有获取门槛。这个时候企业
的数据开发人员、前端或是后端开发需要开发一系列的工具给到业务人员或非技术人员,让他们能够去使用数据并做一些可视化的分析查询。
有了DataWorks后,门槛就降低了很多。只要业务人员会写SQL就能去查询计算好的数据。另外,DataWorks的最大价值,调度不需要用户继续写脚本,或编辑很多配置文件了。用户只需要通过可视化方式来进行开发、配置依赖关系和调度周期,整个企业的数据体系就可以轻松的构建起来了。
DataWorks在降本提效方面,也有非常明显的优势。
首先非技术人员上手是非常快的。通过实践统计以及用户的反馈,用户在完成了阿里云帮助中心的Workshop后,2个小时就可以基本掌握数据的开发及生产流程。企业再也不需要组建一个工具开发团队去开发整个调度系统,同时也不需要再去维护整个调度系统的稳定性。
其次,对于数据分析人员和开发人员来讲,目前DataWorks提供的可视化开发界面,例如SQL的智能编辑器,能够非常有效地提升开发效率。
第三,DataWorks自带了非常规范化的任务开发和发布上线流程,能够帮助企业建立内部数据生产机制规范,让企业的数据体系运行起来更稳定。
最后,落地更可持续的任务管理模式。阿里巴巴每天都有上百万的任务在自动调度运行,这些任务就是通过DataWorks调度系统来完成的。总而言之,DataWorks的稳定性是保证集团数据产出非常重要的基石。
关于降本提效,DataWorks所带来的价值可以参考下面的大中型企业数据体系情况来解读。该企业的数据体系情况是:数仓小组有50多人,另外还有资产、质量、安全、工具开发和运维等小组,每个小组都有部分成员是负责工具开发的,而工具开发和运维小组也是负责工具相关工作的。在这种情况下,如果企业选择使用DataWorks,整个数据体系的人员规模就可以从100多人压缩到50多人,多出来的50多人可以集中精力去做数据业务开发,以帮助企业打造更好的数据体系,释放人力,让好钢用在刀刃上。
二、一般数据生产的流程和核心价值
回顾一下数据生产流程:
宏观来看,首先把数据同步到大数据计算引擎里,再定义自己的数据标准、规范和数据模型,然后就可以生产数据了,包括离线或者实时数据生产。当代码开发完成审核通过后,会发布到生产环境进行定时生产调度产出数据,产出的数据可以用于BI报表呈现或是通过API形式支撑整个企业应用的正常运转。
微观来看,首先开发人员接到业务需求后,根据实际场景进行代码开发,开发完后先自测,然后是测试阶段。在测试阶段数据产品经理及专门的测试人员会参与进来,对开发的代码进行交付测试、数据测试以及UAT测试。这个阶段测试内容会很细致,包括检查表命名及字段命名是否符合规范,数据的空值、重复值、无效值占比是否符合要求等,同时也会检验产出的正确性,产出数据是否对业务来讲是有用的,代码性能是不是可接受。
测试完成后,代码就准备上线了。这个时候需要一位对整个企业数据体系和数据业务非常熟悉的第三方人员来对代码进行复盘,如果对业务没有影响且确实产出有用数据,那么就可以将此代码发布执行。
最后是运维阶段。任务的责任人最基本的职责就是保证负责的代码每天准时、成功的运行。如果出现任何问题,需要能够第一时间来查看日志找到原因并解决问题。这时候就需要一个运维平台来帮助他做任务运维。
那么DataStudio是如何帮助企业完成专业规范开发的呢?
DataWorks支持离线开发、实时开发、交互式分析和机器学习等多样的开发模式,这也是DataWorks的核心开发能力。任务开发好后,用户可以把任务发布到生产环境调度系统里,让DataWorks调度系统自动去调度运行。
DataWorks本身内化了一个相对规范的开发流程,即DataWorks标准模式空间。这种模式空间对应两个计算引擎,由用户选择是MaxCompute、EMR或其他引擎。
数据开发人员只需在开发环境进行代码开发、工作流配置及冒烟测试,测试无误后执行提交。在发布到生产环境之前,需要有一个管理员或者运维来对代码进行审核。如果审核认为开发人员的代码不会对系统稳定性造成影响,或者不会产生故障,同时也符合业务要求,这个主管或者运维部署人员就可以执行发布,将任务发布到生产环境去周期调度运行了。
DataStudio帮助用户逐步构建规范化开发流程
第一步,对业务流程进行规划。进入DataStudio后,用户需要规划业务流程。业务流程是DataWorks 2.0版本之后新增的产品概念,主要帮助用户管理某个业务相关的任务表、函数资源等逻辑抽象概念。目前建议用户从业务视角来创建业务流程,比如创建专门管理用户画像的表、资源和函数,或者创建一个专门管理运营活动的业务流程。
用户创建完业务流程之后,就可以在业务流程里创建各式各样的同步任务和计算任务,然后将这些任务从上到下的串成一个工作流。业务流程的管理是灵活的,用户可以用单独流程产出DWS层的所有数据,再用另一个业务流程产出DWD层的所有数据,
ODS层的所有同步任务也会单独的放在一个业务流程里面,具体如何使用主要以用户场景而定。
第二步,构建工作流。用户可以通过拖拽节点到业务流程中来创建一个SQL任务,双击节点进入之后可以编辑SQL。首先复制一段语法正确但是没有格式化的代码,点击格式化按钮后就会变成一个有缩进的形式,用户在编写SQL时也会有关键词联想和关键词高亮的效果来帮助理解SQL。同时在右侧会有一个DAG图,帮助用户定位SQL关键词,当SQL很长的时候这个功能是非常实用的。
用户编写完SQL后,就可以对这个节点的调度进行配置。
首先,用户应该关注的是当前节点的调度周期,是每月一次还是每天一次。这里的调度周期跟Linux和Chrome Table的分时日月周是一样的,用户可以对任意一个节点去设置它的运行周期,同时用户还可以设置节点任务运行失败后的重跑机制。
当用户把多个任务的调度都配置完成后,接下来就可以配置每一个任务间的依赖关系了。DataWorks有多种配置依赖的方法,最简单的一种就是连线的方式,用户只需要
通过简单的鼠标连线的方式就能把依赖关系配置起来。DataWorks也支持通过解析上下游产出数据血缘的方式来配置依赖关系。
配置完成后将每个节点进行提交,然后进入下一步。这步需要用户逐个进入到开发界面,然后点击开发环境执行冒烟测试。这个时候会让用户选择一个业务日期,这个冒烟测试的日志在页面上可以查看,如果任务执行成功就会显示出来,如果失败可以查看失败原因。
当每一个任务都在开发环境进行冒烟测试并成功后,就可以通知运维或者管理员,进入右上方的任务发布页面去对任务进行审核并执行发布(如下图)。
这个页面会显示出开发人员所有提交过的任务,并且能够点击对比两次发布前后的代码差异。如果这个时候管理员判断即将发布的代码对线上的环境没有影响,并且发布
的代码也是符合业务要求的,就可以点击全部打包发布,刚才编写的几个任务就会发布到生产环境。
发布到生产环境后的工作是进行日常运维,在DataWorks的运维中心可以完成所有日常运维的操作以及运行状态的诊断。用户可以在运维中心的首页大屏看到每天运行的情况,比如今天成功了多少任务,失败了多少任务等。同时也能看到今天和昨天的任务情况的比较以及与历史平均的比较。
当用户遇到任务变慢或失败的情况,可以去日志查看问题。
只要进入周期实例菜单就可以查看所有信息。用户可以点击查看某个任务,右侧视图就能看到任务运行的整体日志并且进行运行的诊断。
实际上,运行诊断功能是从依赖检查开始的。首先检查任务的上游依赖的所有任务是不是已经运行完成了,如果都运行完成了,再检查当前这个任务的定时时间是不是已经到了,然后检查DataWorks的调度资源是不是充足,最后再看任务执行出错的原因。目前运行诊断已经覆盖了大部分的任务报错原因,并且能把它翻译成中文,更直观告诉用户当前任务失败的原因,理论上这些错误在开发阶段就应该发现并规避掉,不应该在生产环境产生。
三、企业场景最佳实践
最佳实践一:分权管理与协同开发
阿里云的主账号就是一个企业在阿里云上的全部身家,一般这个主账号会掌握在CEO或者CTO手里,那么其他人要怎样合理地登录阿里云去使用大数据产品呢?
DataWorks内置了一套角色权限体系,包括空间管理员、开发、运维、部署、安全管理员和模型设计师角色。企业数据团队的负责人一般会授予空间管理员的角色;对于开发人员和销售人员,可以给他们分配开发角色;对运维人员,可以分配运维或者安全管理员角色。开发人员只需要负责写代码和构建开发流程、工作流以及配置依赖关系和进行代码的冒烟测试以及发布申请。而运维人员的主要职责更多偏向资源的管理,比如说配置数据源,或者将已经审查的代码执行发布上线。
实现这样的分权管理非常简单,不需要特别复杂的操作,在DataWorks空间的右上角工作空间管理页面就可以直接进入到成员管理。在角色完成分配之后可以通过上述提到的DataWorks开发模式进行整个规范化的数据生产与开发。
最佳实践二:构建离线数仓的Key Point
这是一个非常基础且重要的离线开发场景的最基本配置,先看一下场景的要求和目标。
- 场景:用户需要通过一次性的配置来实现每天计算前一天业务系统生产的数据(T+1)。
- 前提:业务MySQL里必须有时间戳字段。
- 难点:正确运用DataWorks系统参数来帮助用户解析每一天的日期。
在讲实际配置之前,先了解下基础概念,即每个周期任务运行的背后都隐藏着多个参数。在这个案例中主要关注Cyctime和Bizdate。
Bizdate是指业务日期,例如今天是9月16日,今天系统解析的是昨天即9月15日的数据,那么Bizdate就会解析为9月15日,而如果今天运行实例,那么Cyctime的时间会解析为9月16日,并且可以精准到时分秒。
举个例子,某个定时任务的运行周期为每天的凌晨1:00,那么在2020年9月16号的准时运行的时间就是1:00,在这个实例生成时,它的时间就已经明确了,是202009160100,这是一个可以精确到时分秒的字符串,Bizdate参数解析出来是它的业务日期,即前一天的 20200915,Gmtdate参数是这个任务的实际运行日期,如果该任务准时运行在16号,那就是20200916,如果因为某些原因该任务实例延迟到18日运行,那Bizdate和Cyctime都不会变,但是Gmtdate会变成20200918。
当然Cyctime和Bizdate也可以做变形,Bizdate可以加N天或减N天,Cyctime也可以加减N个小时或N天,或只显示小时或月等,都可以通过参数的灵活变形做改变。
讲完基本概念后,回到用户的场景和目标,用户想通过一次配置实现每一天计算前一天业务系统所产生的数据。
第一步是把数据从业务系统同步上来。先创建一个同步任务,数据源是MySQL,目标端是MaxCompute(ODPS)。在数据源端的数据仓是比较重要的,假如MySQL表的时间戳字段是Createtime,这时可以用Bizdate参数过滤;对于目标端的MaxCompute表来说,在它的分区也要写Bizdate。这样配置的含义是,每一天运行任务的时候都会调取MySQL时间戳等于那一天(Bizdate)的数据记录值,并且把这些数据记录写到MaxCompute表当天的分区。
假如某个同步任务配置好后在2018年8月2号执行,这个时候解析到的日期就是
20180801,对于MySQL原表来说,Bizdate就是20180801,会对应到过滤条件,通过过滤条件把Createtime这列值为20180801的数据抽取出来,然后写到MaxCompute表中20180801的分区里。
同步任务可以这样做,计算任务也一样。当数据抽取完成之后,用户就会通过每一天的计算任务来计算每天抽取上来的数据,同样的,SQL代码也可以调取系统参数(bizdate等)。
上图的SQL表达的是,将ods_log_info_d以及ods_user_info_d这两个表每一天新增的分区进行join,然后写到dw_user_info_all_d每天的最新分区里。可以看出,代码里是可以根据实际的场景来自定义参数名称的。
右侧的调度配置中,可以对每个自定义参数赋值。配置里可以看到左侧SQL内使用的dw_time、log_info_time、user_info_time三个自定义参数都被赋值了右侧的系统参数。这时,如果通过冒烟测试或是提交到生产环境进行测试,补数据或是调度运行时,左侧的三个参数都会被解析为当天运行的业务日期。这样,整个离线数据开发场景就实现了。
数据开发及实操请参考:https://developer.aliyun.com/learning/course/81/detail/1230
DataWorks官网:https://www.aliyun.com/product/bigdata/ide
大数据&AI体验馆:https://workbench.data.aliyun.com/experience.htm