当前位置: 首页 > 科技观察

解密Uber数据团队基础数据架构优化之路

时间:2023-03-18 12:44:16 科技观察

如果你用过Uber,你一定会注意到它的操作是多么的简单。你一键叫车,车就会来找你,手机自动完成支付,整个过程顺畅顺畅。然而,这个简单流程的背后,其实是有Hadoop、Spark等复杂的大数据基础架构支撑的。优步在现实世界和虚拟世界的十字路口拥有令人羡慕的地位。这吸引了数十万每天穿梭于城市之间的司机。当然,这也是一个比较浅的数据问题。但是,正如优步数据主管AaronSchildkrout所说:商业计划的简单性为优步提供了利用数据优化其服务的巨大机会。“这本质上是一个数据问题,”Schildkrout在最近一份Uber和Databricks的谈话记录中说。“因为事情就是这么简单,我们想要让汽车体验自动化。某种程度上,我们是在尝试为全世界的乘客司机提供智能化、自动化、实时的服务,支持服务规模化。”无论是优步在高峰时段定价,帮助司机避免事故,还是为司机寻找最赚钱的位置,所有优步的计算服务都依赖于数据。这些数据问题是一系列数学和全球目的地预测的真正结晶。他说:“这让这里的数据非常令人兴奋,也促使我们非常积极地用Spark解决这些问题。”)企业在应用扩展和满足需求方面遇到的一些挑战。作为负责Uber数据架构的总经理,VinothChandar表示:Spark已经是“必备神器”。在旧架构下,Uber依靠Kafka的数据流将大量的日志数据传输到AWS的S3,然后使用EMR来处理数据。然后将其从EMR导入到一个关系数据库中,供内部用户和各个城市主管使用。Chandar说:“最初的Celery+PythonETL架构实际上运行得很好,但是当Uber想要向上扩展时,遇到了一些瓶颈。”随着我们扩展到越来越多的城市,这些数据的规模也在增加。我们在现有系统上遇到了一系列的问题,尤其是在数据上传的批处理过程中。Uber需要保护行程数据,这是最重要的数据集之一,其中数十万条真实准确的消费记录将影响下游用户和应用程序。Chandar说:“这个系统最初并不是为多个数据中心设计的,我们需要通过一系列的融合方式,把数据放到一个数据中心。”该解决方案演化出了所谓的基于Spark的流IO架构,用于替代之前的Celery/PythonETL架构。新系统对原始数据摄取与关系数据仓库表模型进行了必要的解耦。“你可以在HDFS上获取数据,然后依靠像Spark这样的工具来处理大规模数据处理,”Chandar说。因此,该公司的新架构使用Kafka从本地数据中心提供实时数据日志,并将其加载到集中式Hadoop集群中,而不是将来自多个分布式数据中心的行程数据聚合到一个关系模型中。然后,系统使用SparkSQL将非结构化的JSON转换为更结构化的Parquet文件,可用于使用Hive进行SQL分析。他说:“这解决了我们遇到的一系列附加问题,我们现在正处于利用Spark和SparkStreaming使系统长期稳定的节点。我们还计划使用Spark来访问和获取raw数据。Spark任务、Hive、机器学习和所有有趣的组件,释放了Spark的全部潜力。”Paricon和Komondor在Chandar概述了Uber进入Spark的冒险之后,Uber的另外两名工程师KelvinChu和RezaShiftehfar提供了有关Paricon和Shiftehfar的更多详细信息。而这其实是Uber入驻Spark的两个核心项目。虽然非结构化数据可以轻松处理,但优步最终还是需要通过数据管道生成结构化数据,因为数据生产者和数据使用者之间由结构化数据生成的“契约”可以有效避免“数据腐败”。这就是Parino出现的原因,Chu说。Parino工具由四个基于Spark的任务组成:传输、推理、转换和验证。“所以无论谁想要改变这个数据结构,他们都会进入这个系统并且必须使用我们提供的工具来修改数据结构。然后系统将运行多次验证和测试,以确保此更改没有问题。“Paricon的一大亮点就是所谓的‘列剪枝’。我们有很多宽表,但通常我们不会每次都用到所有的列,所以剪枝可以有效节省系统的IO。他说:”Paricon还可以处理一些“数据拼接”工作。有些Uber数据文件很大,但大部分都比HDFS块小,所以我们公司把这些小数据拼接在一起,对齐HDFS文件大小,避免IO故障。此外,Spark的“数据结构聚合”功能也帮助我们借助Paricon工作流工具以直观、简化的方式处理Uber数据。“同时,Shiftehfar为Komondor和SparkStreaming内置的数据摄取服务提供了很多架构细节。数据源是“烹饪”的基础。原始的非结构化数据从Kafka流向HDFS,然后准备好被消费由下游应用程序。在Komondor之前,它是一个工具,用于确保每个单独应用程序的数据准确性(包括为他们正在处理的数据获取上游数据)并在必要时进行数据备份。现在通过Komondor可以或多或少地自动处理如果用户需要加载数据,使用SparkStreaming相对简单。为了处理每天最频繁的事件和请求,Spark投入巨资,计划利用更多的Spark技术栈,包括使用MLib和GraphX用于机器学习和图形计算的库。有关更多详细信息,您可以观看下面的整个演讲视频。