数据治理的核心:大数据开发平台
这一篇,终于来到了数据治理的核心:大数据开发平台。坦白将这个是一个相对偏技术性的一个产品,需要了解大数据的领域知识栈和数据开发的流程。
通常情况下,数据开发环境一般是由数据开发工程师结合公司的业务和技术需要,基于开源工具打造公司的集成数据开发环境,比如部署 Hadoop,Idea,Jenkins 等工具。但往往这些工具集相对分散,围绕工具集的流程管理成本较高,导致公司大数据团队对一个统一的、集成的数据开发平台呼声较高。
另一方面,在公司业务体量较小,或者在公司发展初期的时候,基于开源工具堆栈一个数据生产环境是完全没有问题,但是随着业务体量增加,计算的性能问题,发布流程的维护和管理,生产环境的监控与运维等就会很容易出现问题,这些问题一方面是因为开源工具软件之间的本就存在的兼容性问题,另一方面也有对工具的本身的认知问题。
本章我们主要从数据开发平台的角度,讨论数据开发平台关心的问题有哪些,以及如何设计开发平台。
常见的数据开发流程
先来看一下一个典型的数据开发工程师的日常工作流程:
数据开发岗位的日常工作流程为:
产品需求评审,了解业务需求,进行开发排期;
模型设计,了解依赖关系与约束原则,与产品二次核对;
沟通其他部门,ETL 开发导入数据;
SQL/MR 开发,编写业务逻辑;
测试,测试人员检查逻辑,并核对结果准确性;
发布上线,加入日常监控报警。
从以上的流程中可以通过平台工具完成的有:数据模型的构建,原始数据的导入,业务逻辑的编写,上线与运维。需要说一下的是,数据的导入部分,一般是由数据交换平台来专业去做,所以本文就不展开讨论。
面向不同的业务场景,比如面向数据分析的离线开发,面向支付场景的实时开发,面向用户操作的交互式计算,面向推荐的算法(模型)开发。虽然不同的开发有相似的内容,但这里我们讨论的开发定位在离线开发场景。
<一> 数据模型构建
根据业务的需求来设计数据模型,数据模型的设计本质上就是在维护元数据信息,一般包含了技术元数据,业务元数据,管理元数据。
管理元数据:包含数据所属于的开发者,部门等信息;表所属的数仓分层划域信息 ,如属于哪条业务域,属于数仓哪一层。
业务元数据:包含了数据的业务定义,计算的逻辑等信息。
技术元数据:包含了表中字段的数据类型,约束条件等技术信息。
具体的建模方法论这里就不展开了,可以参考 Tencent 的欧拉平台中数据建模的方法。
<二> 业务逻辑编写
按照业务逻辑编写完成之后,进行一次任务的测试运行,没什么问题的话,就进行调度的配置。在真正提交到生产环境之前,需要对代码进行扫描检查。
尽管开发人员都是经过严格培训的,但仍无法避免一些日常的工作失误,例如 Sql 质量差、性能低、不遵循规范等问题,通过总结常见问题,形成开发规则,便可以开发 SQL SCAN 工具,在提交代码时即发现问题,提示报警;主要校验规则有三类:
代码规范:表命名、生命周期、注释等;
代码质量:参数错误、分母为 0、NULL 值等;
代码性能:扫描大表、重复计算、分区选择错误等;
<三> 任务上线运维
作业被提交到生产环境之后,任务的管理就交由调度平台进行运维管理。任务调度的本质,是一个非常复杂有向无环图。
在传统的数据仓库中,任务是依赖 Crontab 来定时执行的,存在许多的弊端,例如:各任务之间依赖定时执行,容易造成前面的任务未结束或者失败,而后面任务继续运行,导致失败的情况。此外还有任务无法设置并发执行;无法设置运行优先级;当任务多了看起来太乱,无法管理维护;任务开发方式多种多样,包括 MapReduce、Hive、SQL、Java、Shell、Spark 等,无法统一维护。
任务调度系统的核心有两个模块:调度引擎和执行引擎。简单来讲,就是调度引擎根据任务节点数据及依赖关系进行实例化,生成各类参数,并生成调度树;执行引擎根据具体任务,分配 CPU、运行节点等资源,在任务对应的执行环境中运行相关代码。
大数据平台经常会用来跑一些批任务,跑批处理当然就离不开定时任务。比如定时抽取业务数据库的数据,定时跑 hive/spark 任务,定时推送日报、月报指标数据。任务调度系统已经俨然成为了大数据处理平台不可或缺的一部分,可以说是 ETL 任务的灵魂。调度平台通常需要支持的能力有:
调度的方式:定时调度(即设置一个具体的时间点),周期调度(按照小时,天,周,月),手动执行,依赖调度(即一个任务可以配置为依赖上一个任务结束)。
调度的管理:支持任务按照优先级进行调度,这个在资源相对有限的情况,支持高优先级的任务优先被执行。控制任务并行的数量,集群资源是有限的,避免同时启动大量的任务,减少调度资源和计算资源压力。
监控与告警:支持任务节点异常情况下的处理,比如运行失败或超时的时候,及时通过电话、短信、邮件等方式来提醒开发者。同时及时 kill 掉,以免占用大量资源,影响正常的任务运行。
需求间协同:调度除了关注任务的调度运行本身之外,往往还需要跟其他的大数据平台需求协同配合,常见的有血缘管理、权限控制、负载流控、监控报警、质量分析等各种服务或事务。
顺带提下,在业务体量相对较小,复杂度较小的时候,可以选用一些开源的调度框架:DataX,Airflow,Azkaban,DolphinScheduler,Kettle,Oozie 等。
开发平台的设计
从产品设计角度,主要围绕一条任务的生命周期,以及围绕主线的平台管理,安全三个方面。
任务全周期
主要包含了模型的构建 -> 任务的构建 -> 任务测试 -> 任务发布 -> 任务的监控。
平台管理
包含了对任务的平台管理,比如按照不同的部门,不同的项目等视角下的任务管理;
任务的实例管理。整体来讲构建了项目-任务-实例的三级平台管理体系。
安全
管理的安全:平台用户只能访问权限范围内的数据资源,作业以及作业的实例信息等。
数据的安全:对于敏感数据的脱敏化处理,比如身份证,手机号,姓名等敏感信息。
这里可以参考下某房地产行业数据开发平台设计:
总结
本文主要讨论了离线开发场景下的数据开发平台构建核心三要素:模型构建,业务逻辑构建,调度管理。最后从产品视角简单展开了下产品设计的三个方面。
对于一家公司来讲,数据开发平台随着业务在不断地演进。对于数据行业来讲,数据开发的底层技术架构也在不停地迭代。总的来说,数据开发平台也是要不断结合新的业务场景,调整底层的技术架构,满足更快,更稳定的产出数据结构,赋能业务的快速发展。
参考
版权声明: 本文为 InfoQ 作者【Taylor】的原创文章。
原文链接:【http://xie.infoq.cn/article/26aea4655987b8d33bf65f093】。文章转载请联系作者。
评论