0
点赞
收藏
分享

微信扫一扫

案例 | Uber基于Spark的私家车搭乘服务



IT有得聊

“IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台,致力于帮助读者在广义的IT领域里,掌握更专业、实用的知识与技能,快速提升职场竞争力。

滴滴与优步8月1日合并,给司机、乘客都代来了不少震荡。司机最关心的问题是有没有补贴,乘客最关心的是还有没有优惠劵。小编今天带大家关心一下优步的业务模式。

案例 | Uber基于Spark的私家车搭乘服务_sqoop

Uber打车具体的接单流程如图所示。

每一个有需求的用户通过移动设备向Uber发送请求,从而找到自己的私人司机,进而再购买私家车搭乘服务。用户通过GPS追踪定位私家车,然后使用Uber发出打车请求,几分钟内一辆私家车就会开到面前,用户可以通过支付小费或信用卡完成交易。


业务需求

案例 | Uber基于Spark的私家车搭乘服务_数据_02

从上图中可以看到,司机和用户通过Uber联系了起来,用户发送用车需求给Uber App,接着Uber APP将用户需求派发给附近的司机,司机接单、联系乘客,为客户提供服务。在整个过程中Uber使用P2P模式连接了乘客与司机两端,在GPS定位技术支持下进行实时监控和数据挖掘。


面对打车应用行业竞争的愈演愈烈,Uber公司要想在如此竞争激烈的市场环境中屹立不倒,就必须实时准确地处理客户的请求信息。在客户发出乘车请求时,能够实时地接收到乘车请求信息,并快速地做出响应,出现在顾客身边,为他们提供优质的搭乘服务,从而提升用户体验,获得竞争的优势。


解决方案


为了实现业务需求,Uber公司使用Sqoop工具进行数据的传递,简单了解一下有关Sqoop工具的相关内容。


Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如:SQL ,Oracle,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。


之前版本的Sqoop工具在进行数据摄取时,遇到了以下几个问题:


1)非SQL的数据源。

2)消息系统作为数据源。

3)多级管道。

案例 | Uber基于Spark的私家车搭乘服务_sqoop_03

这些问题的出现使数据摄取过程无法顺利进行,需要进一步改进。改进后的Sqoop如图所示。


从图中可以看出,目前的Sqoop工具可以使一般的的数据传输服务从任何来源到任何目标。例如:从MYSQL到KAFKA、从HDFS到MONGO、从FTP到HDFS、从KAFKA到MEMSQL等。

案例 | Uber基于Spark的私家车搭乘服务_spark_04

Sqoop连接器API如图所示。


可以看出,Sqoop连接器API没有转换阶段,它直接将数据从源端经过分隔、抽取、加载这些步骤,传输到了目标端。


Uber公司使用Sqoop工具进行数据传递时是基于Spark技术的,为什么要选择Spark技术呢?原因如下:


1)MapReduce速度缓慢。

2)需要连接器APIs去支持转换,而不仅仅是EL。

3)可插拔的执行引擎。

4)Apache Spark社区数量的不断增长。

5)使用方便。

6)同时支持批处理、SparkSQL以及机器学习。


Sqoop在Spark上工作时,主要做三件事:创建作业、作业提交、作业执行。


(1)首先需要了解一下SqoopJob API的工作流程:


1)创建Sqoop作业。

→创建源端和终端的作业配置。

→对源端和终端的配置创建作业联系。

2)SparkContext持有Sqoop作业。


3)调用SqoopSparkJob.execute(conf,context)方法。


(2)Spark作业提交


1)在过程中调用Spark和Sqoop服务器来执行这项作业

2)使用远程的SparkContext去提交

3)Sqoop作业作为Spark提交命令的驱动

4)构建uber.jar以及所有Sqoop的依赖

5)以编程方式使用SparkYarn Client(非公开),或直接通过命令行提交驱动程序到Yarn Client


(3)Spark作业执行过程如图所示。

案例 | Uber基于Spark的私家车搭乘服务_spark_05

从图中可以看出,Spark在执行作业时首先计算分区,调用map()方法从MySQL中提取数据,接着调用repartition()方法在HDFS中再分配限制文件,最后调用mapPartition()方法将数据加载到HDFS中。


方案效果

为了检验采用Spark技术后会给Uber公司带来哪些改变,下面进行了几个测试:


1)当把数据从MySQL传输到HDFS上且表记录为300K时,Spark和MRV2下数据传输时间如图所示。

案例 | Uber基于Spark的私家车搭乘服务_sqoop_06

从上图中可以看到,随着横轴加载器数量的增加,纵轴Spark下的数据传输时间,刚开始稳定在25s左右,接着逐渐上升到60s,最后基本维持在60s左右;而纵轴在MRV2下的数据传输时间,从180s逐渐下降到65s,然后又缓慢上升到80s。但是,在MRV2下所花费的时间一直都比在Spark下花费的时间多,而且当extractor数量增大很多的情况下,Spark平台依然表现出色,传输时间增加缓慢。


2)表记录为2.8M时在Spark和MRV2下数据传输时间如图所示。

案例 | Uber基于Spark的私家车搭乘服务_sqoop_07

由图可以看出,随着横轴加载器数量的增加,应用Spark时,纵轴的数据传输时间始终稳定在15s左右;而应用MRV2时,纵轴的数据传输时间先从40s逐渐下降到20s,再从20s开始缓慢上升到25s,花费的时间始终大于Spark。

由此可见,使用Spark技术可以实现良好的分区,达到共享经济和按需服务的要求,能够最优化地调度出租车资源,准确快速地响应需求,从而降低用户群体的沉淀、提升用户需求。





案例 | Uber基于Spark的私家车搭乘服务_spark_08

举报

相关推荐

0 条评论