ofo在MaxCompute的大数据开发之路

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 摘要:2017年,ofo向市场投入了一千多万辆单车,这些单车的投放、运营和调度需要大量数据的支持。本文将从ofo选择MaxCompute的理由以及数据完整性、任务调度、Proxy服务三个方面的实战应用,分享ofo 在MaxCompute的大数据开发之路。

摘要:2017年,ofo向市场投入了一千多万辆单车,这些单车的投放、运营和调度需要大量数据的支持。本文将从ofo选择MaxCompute的理由以及数据完整性、任务调度、Proxy服务三个方面的实战应用,分享ofo 在MaxCompute的大数据开发之路。

演讲嘉宾简介:龙利民,ofo大数据,大数据副总监。

 

PPT材料下载地址:https://yq.aliyun.com/download/2728

视频地址:https://edu.aliyun.com/lesson_1010_8792?spm=5176.10731542.0.0.bVmNS6#_8792

产品地址:https://www.aliyun.com/product/odps

本次分享主要包括以下内容:

一、ofo为什么选择MaxCompute 

二、实战应用

   1. 数据完整性

   2. 任务调度

   3. Proxy服务

 82098c67e8e00ba6f3986d5b68b7472c26d7d29a

一、         ofo为什么选择MaxCompute

首先,回顾一下2016年。当时,ofo的数据分析师还在使用Excel+MySQL这样原始的方式来制作报表。在这样的背景下,要求一名研发人员利用两周的时间开发出数据平台。

 24d9245d66ad5a926ff9eab0e928bbb51bacc99a

那么,如何完成这个任务呢?首先,分析一个数据平台主要包括哪些部分。其中,首要问题是集群(大数据下仅利用MySQL经常出现查挂的情况)。有了集群之后,需要进行数据的装载,这就涉及到ETL。对外界来说,他们更关心的是数据本身,因此还需要BI平台,这部分也是需要大量投入的。有了BI平台之后,就可以在平台上制作报表,且涉及到报表的调度。 

 2dcb2331b43e347b53ae5f070eced98eabbc1fa0

其中,最首要的问题还是集群,是自建集群还是使用云服务?在进行这一选择时,主要从以下六个维度进行考量。

· 存储:事实上,存储也决定了性能。阿里云中就使用了ORC,它是一种列式存储。而MaxCompute使用的也是列式存储。

· 计算:计算性能的要求就是减少耗时。比如,一句SQL语句执行二三十分钟,这样的计算性能显然是不可接受的。

· 费用:费用这一因素通常是不需要考虑的。对于一般小公司而言,MaxCompute按量后付费是最好的选择。

· 稳定性:稳定性需要长期使用才能得以体现,因此这里不做过分强调。

· UDF:共享单车的特性决定了在计算中涉及大量“点”的计算。这里必须用到UDF函数,因此,如果不支持UDF,则不纳入选择范围。

· 文档:MaxCompute的文档写的非常的详细。

 

综合了多方面的因素,我们最终选择了MaxCompute。那么,在使用了一年半后,其结果怎么样呢?下面简单介绍几个事例。

· 实锤一:某同事在ofo工作一年写的SQL,超过前5年的总和;

· 实锤二:对比自建EMR集群和MaxCompute:集群成本 2 vs 1,运维成本 6 vs 1;

· 实锤三:新孵化项目,业务运转良好的前提下,日费用不到50元。

 

二、 实战应用

上面介绍的是选择MaxCompute的原因,下面介绍一些在使用过程中的经验。

1. 数据完整性:数据不准的问题是数据分析师最担心的问题。但更令人担心的是,看到数据时无法得知它到底准不准!造成这个问题的一个重要原因就是数据不完整。比如,昨天共产生了100万条数据,但只上传了99万条。因此,一定要保证数据的完整性。

· 数据完整性的定义:程序计算的时候确保T+1天的数据是完整的,非割裂的,即原子的;

· 不注重数据完整性的做法:通过时间来约定计算,数据间的计算依赖也是基于时间;

不注重数据完整性的后果:很难发现数据的错误,需要人力来排查问题;如果不在逻辑上解决掉,会重复出现。

 

期望中的数据完整性只存在两种情况,要么有数据,且一定是对的,要么就没有数据。

 9d3bfe8e5940c4c616492d5c89ca0e7f2c80612c

在实际应用中,如何解决数据完整性的问题呢?解决方案主要包括以下几点。

· 用命令的 tunnel upload上传数据,不用SDK;(利用tunnel upload上传数据时,对文件来说,它是具有原子性的,不会存在文件只上传了一半的情况。而SDK是行级上传的。)

· 维护数据标记。(当数据被上传到MaxCompute之后要对数据进行标记,比如当天的数据是否传完,后续的计算也会基于这一标记进行,不会对未ready的数据进行计算。)

 8db95c794ccbd2a58e40b5e7cc090d60ee3a043c

做到这几点后,在实际应用中起到了非常显著的效果:没有出现一起,因为数据不完整导致的数据不准的情况。

 

在程序上保证了数据完整性后,还要思考另一个问题:自发查询的数据完整性如何解决。比如在HUE中查询时,用户不知道数据是否是完整的。关于解决方案,这里先埋个伏笔,后面会进行详细介绍。

 

2. 任务调度每天有近千张报表需要调度计算,报表间的关系会存在相互依赖的问题。如何有效的协作,是任务调度需要解决的问题。

 

任务调度主要分为下面三种。

 025392b225ea0a2a673d34b20b3450ad4757bf23

中间表、宽表:我们将最原始的数据表称为原表,比如每天产生的订单表、优惠券表等。但在实际查询中需要将这些表进行关联。比如,想要查询某个订单中的优惠券信息,如果不建立宽表则每次查询都需要写join语句。

计算报表:计算后用于统计的表。

结果宽表:计算报表会存入数据库,这样就会导致数据库中存在非常大量的表。建立结果宽表以便于分析师找到想要分析的指标。

 

下图展示了对任务调度的期望。

 9c583b937f332a3adf963cc4539043af02599f74

第一,并发,多机多进程,以减少进程挂掉服务器挂掉带来的影响。

第二,协作,要求能建立依赖关系。比如先计算完某张表后再计算依赖它的表。

第三,可监控,当出现故障时能及时报警。

第四,可扩展性,在任务调度中写的语句不仅是SQL,也有可能是python脚本或shell等。第五,资源隔离,在资源调度中要注意,不能让大的SQL把资源全部占用,一旦资源被全部占用,整个计算都会卡住。

 

下面介绍在实际应用中使用的任务调度技术框架。数据库中存储了每天要计算的任务,生产者从数据库中取数据,并核实数据完整性和依赖关系,核实状态是否为ready,核实完成后进入队列,状态变为waiting,消费者从队列中获取数据并将状态改为running,最后将状态写回数据库。在这一过程中,每个任务都需要将其心跳的状态同步到数据库中,比如某个生产者挂掉之后,如果没有心跳机制,那么它获取的任务将有可能永远在waiting状态。

 65a634ab2d77aba424e238ee8441a68fb1a31c52

任务调度资源优化和隔离

MaxCompute主要包括两种使用方式:预付费和后付费。预付费,有一个单独的资源池,其中的资源可使用但有上限,并且已经提前付费。后付费,有一个共享的资源池,大家需要抢占资源。

 31fd488455f9145db09f172fe46a060676926b6f

在实际应用中包括以下规则:

· 大任务使用后付费

· 优先级高任务使用预付费

· 优先把预付费填满

· 预付费队列满了,使用后付费

 

3. Proxy服务

下图展示了Proxy endpoint可以解决的问题。

 22a84f40715120a485288f41b4d17bf7a9dbbadb

· 解决重复执行:比如两个人重复执行了一样的SQL语句,且数据没有更新。那么第二次执行的时候,会直接返回上一次的结果。这样,第二次查询的过程不会占用MaxCompute的资源。这样,就可以减少执行耗时,提升体验。同时,降低资源开销,节约成本。

· 安全控制:不再对外暴露key,构建业务自由账号,不同的人会拥有不同的账号。同时,构建内网的IP白名单。MaxCompute的白名单是针对外网的,而在内网中也会有很多台机器,如果所有内网机器都拥有访问权限,也是不安全的。

· 方便统计:SQL开销统计到人,并且也可以方便地按部分来计费。

 

那么,在实际应用中应该如何做呢?总体来讲分为下图两种方案。

 6d68df18cb44c77dff888d9993851a9d310215a4

方案一:代理转发。收到数据后转发到MaxCompute然后再通过response返回。

方案二:服务端在调用SDK。利用MaxCompute SDK,每次获得请求后,解析请求中的参数,再返回给SDK。

由于方案二的工作量较大,我们选择了方案一,它具有以下优点。

· 开发工作量小

· Pyodps升级也不影响

· 对于潜在的API接口具有兼容性

· 只实现我们自由账号体系

· ip白名单控制

 

下图展示了其核心代码。

 5b4bae5da37594418182f785b84ad9310999b0ef

下面简单介绍其中的部分代码。

7243c7337ba6d10f4a7bcdd2b18cdded9e8b313e

对所有url进行规则判断,正则表达式中写的越多就会越优先命中。

27eb7c28661736971728c697241939262549b6e7

主要是用于解决SQL代码重复执行的问题。

7a09366757bb1e99198cfd8890b081e5adb6f300

主要解决命令行的问题。MaxCompute主要分为两个入口,一个是SDK,另一个是命令行。SDK是比较易于实现的。而命令行中会自己生成taskname,每一次请求都会check其taskname。

 a78e71024186d8a19e58f43d47d2f589c275cf5c

另外,构建安全控制时,一定要有自己的签名。不能使用客户端上传的签名,我们只能使用客户端上传的SSID的前缀。

 

 

上面的代码中实现了总体的流程,但具体实现过程中还存在一些问题。

难点1:如何确保优化后结果和实际执行结果一致?

· 从SQL中提取表信息和分区信息

· 在一定延时内,获取表数据的更新信息

解决方案:

· 构建SQL语法树,提取出表,目前还没解决分区

· 另起新进程,捕获表和分区的最后一次修改时间

难点2:命令行返回的适配,为什么呢?

· task name 由客户端生成,例如:console_query_task_152696399361

· taskstatus和instanceprogress都会去校对服务端返回的信息中的task name, 一旦和客户端的task name不一致,会出现:FAILED: task status unknown

解决方案:客户端会从server的所有task name中查找到和自己一样的task name。

· 保存历史所有请求的task name

· 返回所有的task name

通过Proxy服务,取得了不错的效果:

· 提升了体验,具体例子:第一次sql执行耗时的70秒,再次执行不只需要0.9秒;

· 减低了费用,整体费用减低了一半;

· 提升了安全的可控性,不暴露sercret_key给同事;

· 每个业务分配1个账号,能方便统计费用;

· 解决了前面提到的数据完整性问题。

 

65e5eaec201caee8d6d42ab59ba7d5002282eed5

如需了解更多关于MaxCompute产品和技术信息,可加入“MaxCompute开发者交流”钉钉群;

群号11782920,或扫描如下二维码加入钉钉群。

2e8f30573ebc31cb0f98b66e9b15817213bf28cf

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
1月前
|
SQL 存储 分布式计算
ODPS技术架构深度剖析与实战指南——从零开始掌握阿里巴巴大数据处理平台的核心要义与应用技巧
【10月更文挑战第9天】ODPS是阿里巴巴推出的大数据处理平台,支持海量数据的存储与计算,适用于数据仓库、数据挖掘等场景。其核心组件涵盖数据存储、计算引擎、任务调度、资源管理和用户界面,确保数据处理的稳定、安全与高效。通过创建项目、上传数据、编写SQL或MapReduce程序,用户可轻松完成复杂的数据处理任务。示例展示了如何使用ODPS SQL查询每个用户的最早登录时间。
91 1
|
3月前
|
分布式计算 搜索推荐 物联网
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
大数据及AI典型场景实践问题之通过KafKa+OTS+MaxCompute完成物联网系统技术重构如何解决
|
3月前
|
人工智能 分布式计算 架构师
大数据及AI典型场景实践问题之基于MaxCompute构建Noxmobi全球化精准营销系统如何解决
大数据及AI典型场景实践问题之基于MaxCompute构建Noxmobi全球化精准营销系统如何解决
|
3月前
|
机器学习/深度学习 搜索推荐 算法
飞天大数据平台产品问题之AIRec在阿里巴巴飞天大数据平台中的功能如何解决
飞天大数据平台产品问题之AIRec在阿里巴巴飞天大数据平台中的功能如何解决
|
2月前
|
SQL 分布式计算 大数据
代码编码原则和规范大数据开发
此文档详细规定了SQL代码的编写规范,包括代码的清晰度,执行效率,以及注释的必要性。它强调所有SQL关键字需统一使用大写或小写,并禁止使用select *操作。此外,还规定了代码头部的信息模板,字段排列方式,INSERT, SELECT子句的格式,运算符的使用,CASE语句编写规则,查询嵌套规范,表别名定义,以及SQL注释的添加方法。这些规则有助于提升代码的可读性和可维护性。
46 0
|
2月前
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
84 0
|
3月前
|
SQL 存储 分布式计算
MaxCompute 入门:大数据处理的第一步
【8月更文第31天】在当今数字化转型的时代,企业和组织每天都在产生大量的数据。有效地管理和分析这些数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个用于处理海量数据的大规模分布式计算服务。它提供了强大的存储能力以及丰富的数据处理功能,让开发者能够快速构建数据仓库、实时报表系统、数据挖掘等应用。本文将介绍 MaxCompute 的基本概念、架构,并演示如何开始使用这一大数据处理平台。
538 0
|
3月前
|
SQL 分布式计算 大数据
"大数据计算难题揭秘:MaxCompute中hash join内存超限,究竟该如何破解?"
【8月更文挑战第20天】在大数据处理领域,阿里云的MaxCompute以高效稳定著称,但复杂的hash join操作常导致内存超限。本文通过一个实例解析此问题:数据分析师小王需对两个共计300GB的大表进行join,却遭遇内存不足。经分析发现,单个mapper任务内存默认为2GB,不足以支持大型hash表的构建。为此,提出三种解决方案:1) 提升mapper任务内存;2) 利用map join优化小表连接;3) 实施分而治之策略,将大表分割后逐一处理再合并结果。这些方法有助于提升大数据处理效率及稳定性。
84 0
|
3月前
|
SQL 分布式计算 大数据
"揭秘MaxCompute大数据秘术:如何用切片技术在数据海洋中精准打捞?"
【8月更文挑战第20天】在大数据领域,MaxCompute(曾名ODPS)作为阿里集团自主研发的服务,提供强大、可靠且易用的大数据处理平台。数据切片是其提升处理效率的关键技术之一,它通过将数据集分割为小块来优化处理流程。使用MaxCompute进行切片可显著提高查询性能、支持并行处理、简化数据管理并增强灵活性。例如,可通过SQL按时间或其他维度对数据进行切片。此外,MaxCompute还支持高级切片技术如分区表和分桶表等,进一步加速数据处理速度。掌握这些技术有助于高效应对大数据挑战。
113 0
|
3月前
|
数据可视化
Echarts数据可视化开发| 智慧数据平台
Echarts数据可视化开发| 智慧数据平台

相关产品

  • 云原生大数据计算服务 MaxCompute