数据探索平台设计-“CheckStyle”

2019 年 2 月 13 日 产品100干货速递

开课吧产品100

点击上方蓝字关注产品100公众号,用户调研、竞品分析、需求分析、文案写作、产品设计、需求管理、运营策略、数据分析等关于产品经理的这儿都有!


核心观点

因为用户编写的代码可能存在质量差、性能低、不规范、语法错误等问题。CheckStyle将使用我们TD的规则库,通过平台和流程来保障代码质量,希望能尽早、尽快、无感解决故障隐患,以节约时间,提高效率,降低出错率。

短期内会通过代码样例,API半自动化实现,不断完善,最终实现自动化。

同时在一定程度也可以提升用户的技能,这也是平台“自动化”的重要一步。

引言

昨天和一位数据分析师同学闲聊,听到她随口吐槽一件工作中的小事,见微知著,聊一下数据探索中的“CheckStyle”需求,和大家一起探讨哈。

对话大意

“最近咋样啊”省略N个字。

进入正题

分析师:“实习生写的SQL真是令人痛心,一堆错。”

权:“一堆错?规范问题?语法问题?业务问题?性能问题?或者,都有?”

分析师:“都有,毕竟是实习生。”

果断先diss她几句,招人时咋不想清楚,有经验的好一点,没经验的就要做好培养的准备,而且必然是一段时间细致的培养,答复,虽然她也做了准备,但确实需要时间。

权:“那你现在咋办”

分析师:“能咋办,遇到问题解决问题,一个个看呗。”

权:“那个人力量有限啊,你时间有限,而且我们也只能说熟练使用SQL,不能说精通,大多数场景能搞定,遇到一些问题也需要查,这种事最好交给机器做,产品化。”

分析师:“有意思,说说看。”

权:“我想想,写篇文章总结一下,大家一起探讨吧。”

对话基本结束。

一段简短的对话,一件工作中的常见的小事,但可以挖掘的点很多。

下面说一下我的想法,“CheckStyle”。


“CheckStyle”是什么?

背景:

工作中类似的问题太多了,用户编写的代码可能存在质量差、性能低、不规范、语法错误等问题。

这里的用户包括:咨询、分析师、工程师、科学家等

这里的代码包括:SQL、Python、Scala、R等

这么一说大家感受可能不深。

我们再来看几个鲜活的例子,看一线中的具体场景:

1.前段时间一位数据科学家同学因为输出数据集目录命名不规范,导致和DSS的时间分区功能冲突。

数据科学家在我们印象中已经比较专业了,但依然有可能发生偏差。

其实“是人就可能会出错”,因此需要相应的规则和流程来约束,减少出错率。

2.前天看到一篇Python性能提升的文章,大意如下:

Python 是机器学习领域内的首选编程语言,它易于使用,也有很多出色的库来帮助你更快处理数据。但当我们面临大量数据时,一些问题就会显现,因为在这样的量级上,工作进程中加入任何额外的计算都需要时刻注意保持效率。

在默认情况下,Python程序是单个进程,使用单 CPU 核心执行。而大多数当代机器学习硬件都至少搭载了双核处理器。这意味着如果没有进行优化,在数据预处理的时候会出现「一核有难九核围观」的情况,超过 50% 的算力都会被浪费。在当前四核处理器(英特尔酷睿i5)和6核处理器(英特尔酷睿i7)大行其道的时候,这种情况会变得更加明显。

幸运的是,Python库中内建了一些隐藏的特性,可以让我们充分利用所有CPU核心的能力。通过使用Python的concurrent.futures模块,我们只需要3行代码就可以让一个普通的程序转换成适用于多核处理器并行处理的程序。 ### Create a pool of processes. By default, one is created for each CPU in your machine. with concurrent.futures.ProcessPoolExecutor() as executor:  ### Get a list of files to process  image_files = glob.glob("*.jpg")  ### Process the list of files, but split the work across the process pool to use all CPUs  ### Loop through all jpg files in the current folder   ### Resize each one to size 600x600  executor.map(load_and_resize, image_files)

测例是将1000张图片被传递到深度神经网络之前将其调整为600×600像素分辨率的形式。

优化前在酷睿 i7-8700k 6核CPU上,运行时间为7.9864秒,在这样高端CPU上,这种速度让人难以接受,优化后运行时间降到1.14265秒,速度提升了近6倍!

看完之后确实是拍手称快,又get了一项新技能,使用Python的concurrent.futures模块做性能优化,节约时间,提升效率。

同时想到之前我想落地线下消费标签使用的一份poiid数据集,代码早早的写好,然而排队等待集群资源运行就等了1天。

查了一下原因,也没有大任务阻塞集群,确实是大家的任务很多,一个接一个。

想要解决,从供需两端考虑:

供给端,扩展集群资源,这个我们正在做,升级到新集群。

需求端,大家任务多,集群资源有限,必然存在矛盾,这时可以评估任务的优先级,保证紧急任务优先处理,另一方面,总体任务数量和顺序优化后,我们也可以对单个任务的运行时间和效率进行优化,优化代码,做性能提升,从而提升整体运行效率。

要想优化代码,做性能提升:

会对用户有更高的技能要求,督促用户自我提高,在这方面TDU有也相关技能课帮助提高,但毕竟术业有专攻,是不是应该降低用户的技术门槛,让其更专注于在具体业务和场景中探索数据价值。

学习需要时间,且学无止境,不建议让用户承载过多的负担。

因此,代码性能提升我可能更倾向于平台侧智能管理,平台自动优化提升性能,并info给用户相关建议,感兴趣的用户可以参考info自我提升,进一步学习并反馈规则给TD规则库,形成闭环不断优化。不感兴趣的用户可以直接忽略优化info专注业务,平台自动优化运行,做到无感体验,不知不觉中提升整个集群任务的运行效率。

未来趋势也应该是朝“自动化”方向走。

现在我们Data ATM数据提取平台的运行机制类似,前端展示极简的界面,用户拖过简单拖拽完成任务的输入输出,后端是将用户选择的模块转化为SQL在提交到GP网关。

即降低用户的技术门槛,让其更专注于在具体业务和场景中探索数据价值。

以计算2018年9月APP活跃设备数统计为例:

在用户操作层面,用户可以感知的就是简单拖拽活跃设备和筛选设备统计两个功能模块,然后选择时间2018-09,仅此而已,完成数据提取。

大大降低用户的操作门槛,这也是我们数据提取平台的初衷,让业务人员(销售、咨询等)在不懂SQL等语言时也能通过简单拖拽完成数据提取,让其更专注于在具体业务和场景中探索数据价值。

数据提取平台,作为一款数据产品,简单易用的背后是什么?

还是看这个例子:

作业转化为SQL语句,然后提交到GP网关,SQL语句大致如下:

SELECT a.offsetid, UNNEST_2D_1D(a.app_active) AS active

FROM device_app_active_monthly a, (

SELECT partitionid::BIGINT * 10000000 + RB_ITERATE(bitmap) AS offsetid

FROM bitmap_rexxx

WHERE keyid = 123

) b

WHERE a.monthid BETWEEN '201809' AND '201809'

AND a.offsetid = b.offsetid;

我们做了什么?

(1)模块的封装,对应底层数据集,如活跃设备模块对应device_app_active系列数据集;

(2)选项的封装,对应底层数据集相应字段,如2018-09时间对应数据集的monthid;

(3)作业的封装,将作业所有条件转化为SQL语句;

(4)UDF的定义,复杂操作通过UDF实现并优化;

(5)数据结构的定义,使用Bitmap,大大提升计算效率;

(6)数据库选型,使用GP,提升整体效率。

等等~

好的工具,真正让用户易用,易用背后的逻辑我们沉淀,我们做的多,用户想的少。用户专注于数据业务,让业务方和工具平台都发挥最大的价值。

发生上述这些问题,有些可能是初出茅庐不谙世事的实习生,无经验,技能上的短板、未养成好的规范,

也可能是现在玩转业务,熟练SQL的高级数据分析师,毕竟学海无涯,技能上的盲点永远存在。

还可能是用户有相关经验,但就是百密一疏,或者写代码一时随意。

但最终结果将会因为一人疏忽造成整个集群任务队列效率低下,或者之后运用时出现意想不到的错误。

相关问题还是需要严格的约束,从平台和流程层面管控。

将数据探索任务中遇到的各种问题整理后,结合开源规范,一起作为我们TD的规则库。

综上在此严格定义一下CheckStyle:

CheckStyle将使用我们TD的规则库,通过平台和流程来保障代码质量,希望能尽早、尽快、无感解决故障隐患,以节约时间,提高效率,降低出错率。

短期内会通过代码样例,API半自动化实现,不断完善,最终实现自动化。


为什么要做“CheckStyle”?


在说完什么是CheckStyle后,再来说为什么要做CheckStyle就很清晰了。

动力:

因为用户编写的代码可能存在质量差、性能低、不规范、语法错误等问题,通过CheckStyle可以尽早、尽快、无感解决故障隐患,以节约时间,提高效率,降低出错率。

同时在一定程度也可以提升用户的技能,完善我们TD规则库。

这也是平台“自动化”的重要一步。

阻力:

代码样例的梳理和准备

规则库的制定,包括常见问题和开源规范的梳理;

产品研发侧的设计和研发,DataCloud已经停止迭代,综合考虑DSS需求池和研发资源的现状,现在有支持新集群等紧急需求在做,本需求相对而言优先级低一些,可以后续排期考虑。具体研发细节可以一起讨论。


怎么做“CheckStyle”?


我们不妨参考借鉴一下同行,挑选国内外的两款优秀竞品,这里选择国外的Dataiku DSS和国内的阿里云数加:

1. Dataiku DSS 实践

Dataiku DSS还处于一个相对早期的状态,在“CheckStyle”这一块的实践主要是Validate和code samples:

Validate功能会检查查询语法错误和Schema的一致性问题。

code samples功能则是插入代码样例,供用户参考编辑。

2. 阿里云数加 实践

我和阿里云的同学们沟通过,确实是踩过了很多坑,在推广过程中碰到大量的SQL优化问题,我们的结论也一致,无论是通过培训还是其他方式,其实都远没有系统固化规则更好,用系统流程化的方式解决问题是平台能够规模化的核心要素。

数加也确实走在行业的前列,基于IntelliJ IDEA开发插件MaxCompute Studio,MaxCompute 编译器是新一代的SQL引擎,显著提升了SQL语言编译过程的易用性与语言的表达能力。

定制化开发,更加灵活,功能强大。

本篇主要介绍以下两点:

(a)MaxCompute Studio会对代码进行静态编译检查并给出修改建议,同时有计算健康分体系,提交有错误的脚本会被扣计算健康分,导致以后提交任务的优先级被下调。

(b)使用MaxCompute SQL,规范代码,预防预期外的错误,并对代码运算效率进行优化。

2.1 MaxCompute Studio

如上图,静态编译发现第一个 insert 语句中的UDF wm_concat函数参数错误。

如上图,鼠标停止在错误或者警告上,会直接提示具体错误或者警告信息。如果不修改错误,直接提交,会被 MaxCompute Studio 阻拦。

修改完毕后,再次提交,便可以顺畅运行。

2.2 MaxCompute SQL

基于SQL,使用MaxCompute SQL,规范代码,预防预期外的错误,并对代码运算效率进行优化:

(a)代码规范,如别名,即子查询必须要有别名。建议查询都带别名。

(b)预防预期外的错误,如精度问题,Double 类型因为存在精度问题,不建议在关联时候进行直接等号关联两个 Double 字段。一个比较推荐的做法是把两个数做下减法,如果差距小于一个预设的值就认为是相同,比如 abs(a1- a2) < 0.000000001。

(c)代码优化,如分区裁剪,对分区列指定过滤条件,使得 SQL 执行时只用读取表的部分分区数据,避免全表扫描引起的数据错误及资源浪费。

3.TD 实践

具体落地可以先从SQL语言及相关用户入手,后期视情况慢慢推广:

1.代码样例的准备,结合日常工作中的常见作业,总结提炼几套常见的代码样例和常用语法。

2.规则库的制定,包括常见问题和开源规范的梳理,目前规则可以分为以下几类:

(1)语法类规则,如类方法的归属问题,主要由编译器处理;

(2)规范类规则,如表、目录的命名规范,注释等,不断总结+借鉴开源规范;

(3)质量类规则,如参数检查、分母0、NULL值等,不断总结+借鉴开源规范;

(4)性能类规则,如并行计算、分区、重复计算、大表裁剪等,不断总结+借鉴开源规范;

(5)其他规则~

3.产品研发侧的设计和研发,整体流程:

(1)平台侧配置好规则库,

(2)用户提交代码后,结合规则库进行校验,

(2.1)平台可以自动化处理重要缺陷,显示相关info,任务提交运行,

(2.1.1)感兴趣的用户可以参考info自我提升,进一步学习并反馈规则给TD规则库,形成闭环不断优化,

(2.1.2)不感兴趣的用户可以直接忽略优化info,专注业务,做到无感体验,相关info记录留存,供资深分析师总结规则并反馈规则给TD规则库,形成闭环不断优化,

(2.2)平台无法自动化处理重要缺陷,显示更改tip,任务被阻断,

用户可以结合更改tip,并可请教资深的分析师一起协助修改,修复代码后才可提交,并在此检验规则,同时将规则反馈给TD规则库,形成闭环不断优化,

(3)完成任务提交,不知不觉中提升整个集群任务的运行效率,最终实现尽早、尽快、无感解决故障隐患,以节约时间,提高效率,降低出错率。

从长远考虑,将自研和借鉴市场上的SQL Studio,定制化开发,更加灵活。

综合考虑DSS需求池和研发资源的现状,短期内可能还是:

1.准备代码样例,

2.在实战中总结规则,结合开源规范不断完善规则库,

3.对用户进行规则库和代码样例的相关培训,并结合TDU的优质教育资源,进行专项技能提升,

备注:相关培训可以视用户的兴趣和时间酌情参与,但最好有几位资深分析师全程深入学习,以备在关键时刻提供相关指导。

4.同时根据规则在平台侧封装相关API供用户使用,并逐渐尝试自动化处理。

以上便是我关于“CheckStyle”的初步想法,欢迎大家一起探讨。


———END———


登录查看更多
0

相关内容

SQL 全名是结构化查询语言,是用于数据库中的标准数据查询语言,IBM 公司最早使用在其开发的数据库系统中。
FPGA加速系统开发工具设计:综述与实践
专知会员服务
64+阅读 · 2020年6月24日
多智能体深度强化学习的若干关键科学问题
专知会员服务
181+阅读 · 2020年5月24日
社区分享|如何让模型在生产环境上推理得更快
转岗产品经理,花了3个月都做不好需求工作
人人都是产品经理
10+阅读 · 2019年9月16日
美团:基于跨平台框架Flutter的动态化平台建设
前端之巅
14+阅读 · 2019年6月17日
爱奇艺基于AI的移动端自动化测试框架的设计
前端之巅
18+阅读 · 2019年2月27日
四大维度全景揭秘阿里巴巴智能对话开发平台
云栖社区
11+阅读 · 2019年1月15日
已删除
将门创投
9+阅读 · 2018年12月19日
对话式交互技术原理及流程揭秘
AI前线
5+阅读 · 2018年5月24日
一个人的企业安全建设之路
FreeBuf
5+阅读 · 2017年7月7日
Paraphrase Generation with Deep Reinforcement Learning
Arxiv
5+阅读 · 2018年6月5日
Arxiv
13+阅读 · 2018年1月20日
VIP会员
相关资讯
社区分享|如何让模型在生产环境上推理得更快
转岗产品经理,花了3个月都做不好需求工作
人人都是产品经理
10+阅读 · 2019年9月16日
美团:基于跨平台框架Flutter的动态化平台建设
前端之巅
14+阅读 · 2019年6月17日
爱奇艺基于AI的移动端自动化测试框架的设计
前端之巅
18+阅读 · 2019年2月27日
四大维度全景揭秘阿里巴巴智能对话开发平台
云栖社区
11+阅读 · 2019年1月15日
已删除
将门创投
9+阅读 · 2018年12月19日
对话式交互技术原理及流程揭秘
AI前线
5+阅读 · 2018年5月24日
一个人的企业安全建设之路
FreeBuf
5+阅读 · 2017年7月7日
Top
微信扫码咨询专知VIP会员