Kafka 2016 Summit上Uber工程师Danny Yuan分享了一个Streaming Processing PPT,如何解决Uber里Operation Team所需要的需求。看了整个视频觉得介绍很细致,这对于大部分LBS (Location Based Service)有很好的借鉴意义。
业务需求
Realtime OLAP
对于Operation部门而言,实时性很重要:
- 当前时间点,全球有多少量车在运行?有多少量车在空驶?
- 最近10分钟内,有多少UberX(类似于滴滴中的商务专车)在SF出现,热点地区在哪里?
- 每个区域的平均行驶时间、以及其他指标分别是多少?
作者给出了一个示意图,我们可以解读下:
1. 右侧是一个湾区的地图,通过蜂窝状六边形把坐标划分若干区域,红色就代表车的密集程度
2. 左侧是该区域在过去N分钟内各项指标的变化情况,例如平均的形式距离,接单率,平均客单价等
3. 通过筛选时间段、指标(Metric)等,可以全方面了解运营状况
这个图表让我相当了之前用TreeMap来监控集群利用率的场景,如出一辙。
- 左侧通过HeatMap显示各个机架上的不同时间段上Metric变化情况
- 右侧则是各指标在时间段上分布的场景
只不过在机器运维的Portal上显示的是,只不过我们面对的是集群,Uber面对的是车与地图:)
CEP(Complex Event Processing)复杂事件处理
例子:
1. 有多少个司机在最近10分钟内取消了3次接单以上?
2. 如果发现后,会通过聊天软件与司机对话
Supply Position 供求关系可视化
在什么位置供大于求,什么位置求大于供:
- 黄色的点代表需求
- 蓝色的店代表供应
处理的挑战
如何表示车辆的位置数据
地理位置函数,一般用得比较多的是GeoHash,通过切分空间的方法把二维坐标,转化成一维的数字。两个区间的比较查询,就演变成一个一维的比较函数。
Uber的做法正好相反,将坐标转化成一个特定的区域,通过六边形的办法来逼近真实的位置。使用六边形有这样几个好处:
- 方便检索、查询、渲染
- 容易找到周围相邻的邻居
- 每个区域大小相同,形状相同
数据规模巨大
时间、空间、车辆状态、地理位置等组合会非常大
- 时间代表某一个时刻
- 空间在时间点上车的位置(例如LA,SF)
- 汽车的类型
- 状态(运行中,接单中,已接单出发地中等)
为了减少空间的规模:在地理位置、时间两个维度做了“取整”处理。通过六边形区域取整了地里位置,通过分钟级采样减少了其他状态,一天的数据量为
1dayofdata:300x10,000x7x1440x13=393billion
原始的数据为:
time, carID, locationX, locationY, status, .....
查询与计算的需求
- 车的种类、状态非常多、因此查询场景是面向多维数据的。
- 需要支持Heatmap,Top K, Histogram,count,avg,sum,percentage等计算函数
- 巨大数据量:
- 每秒百万级事件产生
- 每个事件中有20+Field
- 多种数据源
- 司机端事件
- 乘客端事件
Uber实时数据处理架构
分为5个部分:
1. 日志、事件数据来源框架 - Kafka
2. 数据清洗与处理,前置处理 - Samza
3. 存储系统 - Elastic Search
4. 数据读取,后置处理 - 自己开发的框架
5. 查询与构建与查询 - 自己构建
6. 应用层 - Web
数据采集与Kafka
这个Slides里面没有提到Uber架构,Google上找了一些相关的材料,整体架构如下:
数据来源有:
- Rider App
- Driver App
- API/Service(服务端)
- Dispatch (GPS 运行数据)
- Mapping & Logistic
日志、事件采集上在Kafka层包了Restful API,提供Java、Python、Go、NodeJS的SDK:
通过Samza进行清洗
主要有:
1. Transformation(坐标转化):GPS坐标是二维的,为了能够根据城市和地域查询,转化成更离散化的数据:ZipCode、Hexagon(六边形坐标)、城市等。 (Lat, Long) -> (zipcode, hexagon, S2)
2. Pre-Aggregation:将一分钟数据归并成1分钟取整
3. Join Multiple Stream:例如Driver Status、Rider Status进行合并
4. Sessionization:将乘客的状态进行串联
From driver_canceled#window.time(10 min)
SELECT clientUUID, count(clientUUID) as cancelCount
GROUP BY clientUUID HAVING cancelCount > 3
INSERT INTO hipchat(room);
以上是一个ETL任务,每隔10分钟执行一次,既从Kafka中获得数据判断有问题的司机列表
通过这样的架构,支持运营人员能够在ES中清晰、索引的数据,获得实时分析能力:
同时由于在ES上层包装Query机制,也支持稍微复杂一些的离线查询。ES存储本身不是很好的离线方式,但对于离线查询频率不多的场景,也是够用的:
作者选型考虑
Lamdba vs Kappa
最终使用了Lamdba架构,数据分别走一遍实时,离线。看起来比较浪费,但有几个考虑:
1. Spark + S3 for batch processing
2. 会有补数据的需求,通过实时计算并不一定能满足,比如通过EventTime进行计算,并非Kafka中到服务端的时间
3. 不同的存储解决不同目的
Samza的问题:
1. 不能动态扩展
2. 部署较为不便
相关推荐
总而言之,Uber平台架构的设计是一个不断迭代和优化的过程,它从最初的简单架构演变为分布式、高可用的系统,通过合理的服务拆分、负载均衡、错误处理和数据库管理,实现了高效、可靠的打车服务。这一过程充分体现了...
2. 实时数据处理:优步需要处理的数据流是高度动态和变化的。流处理系统能够即时处理这些数据,为调度系统提供最新的车辆与乘客信息,从而实现动态匹配。 3. 状态跟踪:优步的系统不仅关注当前的数据状态,还包括对...
【Uber外卖平台国际化架构演化之路】的演进过程揭示了技术如何适应业务发展的需求,以及在面临全球化挑战时如何优化架构。以下是对Uber Eats架构发展的重要知识点的详细阐述: 1. **业务概述与挑战** - Uber Eats...
通过将数据处理任务分配给GPU,AresDB可以显著提高查询速度,从而实现实时分析。这种技术在大数据实时分析领域具有广泛的应用前景,如金融交易、广告定向、物联网(IoT)数据分析等。 **2. 低延迟查询** AresDB设计的...
Uber作为一家全球领先的出行服务平台,其数据处理规模庞大且复杂。为了更好地利用这些数据并从中获取价值,Uber构建了一个强大的数据平台,该平台包括Kafka、Schemaless MySQL、Postgres等数据生产者以及Hadoop...
Uber利用Hudi构建其大规模的近实时数据处理管道,实现了数据的快速摄取与分析。 #### Hudi架构关键组件 1. **ChangeLog**:记录每个数据文件的更改历史,用于实现增量处理。 2. **Normal Table**:即传统的Hive、...
设计说明书通常会详细解释项目的架构、UDF的设计思路、数据处理流程、预期结果以及可能遇到的问题和解决方案。它是理解项目整体逻辑的关键,对于学习者来说是宝贵的参考资料。 7. **运行复现**: 该项目的一大...
实时流计算过程通常包括数据采集、数据处理和结果输出三个阶段,它强调低延迟和高吞吐量,常用于实时监控、预警和决策支持。 5. 离线计算: 离线计算通常处理批量数据,可以在非实时环境下进行,如批处理作业或...
通过 Apache Flink 实现 Uber 商业性能指标生成与管理,这是一种基于大数据处理技术的解决方案。以下是相关知识点的详细解释: 大数据处理技术 大数据处理技术是指处理大量数据的技术,包括数据采集、存储、处理和...
基于Kafka的跨数据中心复制平台架构展示了Uber如何利用Kafka的强大功能来支撑其大规模、高可用性的实时数据处理需求。通过Kafka管道、uReplicator、offset同步服务和数据丢失检测机制,Uber实现了高效的数据复制和...
通过这份文档,我们可以了解到,在构建和维护大规模大数据平台时,数据治理、系统优化、实时数据处理和平台效率是成功的关键要素。此外,我们也看到了一个不断演进的生态系统,随着数据量的增长和技术的进步,平台的...
在大数据处理领域,Apache Flink 和 Apache Hadoop 是两个核心组件,它们共同构建了现代数据处理架构的基础。本文将深入探讨Flink-Shaded-Hadoop-3-Uber-3.1.1.7.2.9.0-173-9.0.jar这个文件,它是连接这两个框架的...
Uber车辆监控系统是一种用于实时追踪、监控并管理Uber平台内所有车辆运行状态的技术体系。这种系统能够帮助Uber公司更好地管理其庞大的司机网络,并为乘客提供更优质的服务。系统通常包含以下几个关键部分: 1. **...
在当前的数字化时代,大数据处理和分析已经成为企业的核心竞争力之一。本课程专注于“基于Flink+Hudi构建企业万亿级云上实时数据湖”,旨在帮助学员掌握如何在云环境中搭建和管理大规模的数据湖系统,应对日益增长的...
综上所述,Uber在其架构设计中深入探讨和实践了分布式系统的核心理论,解决了大规模数据复制中的一致性问题,通过采用复制状态机和共识协议维护了高可用性,并且在设计中采用了自动化来减少人为失误,最终实现了一个...
随着业务的增长和技术的发展,原有的数据处理架构已难以满足实时性和扩展性的需求。 #### 二、痛点分析 1. **数据查询延迟**:直到数据被加载到商业数据库后才能进行查询。 2. **单个商业数据库集群容量限制**:...
他们可能转向了如MySQL或NoSQL数据库如Cassandra这样的解决方案,这些系统在处理大规模数据和高并发场景时可能更有效。在设计和选择数据库系统时,企业必须权衡各种因素,包括但不限于扩展性、写放大、索引管理、...
- **Petastorm**:Uber开源的用于大数据处理的库,优化了深度学习数据加载。 - **TensorFlowOnSpark**:让TensorFlow可以在Apache Spark集群上运行,支持分布式训练。 **18.3 实时计算** 实时流计算用于处理持续...
- **Spark概述**:Apache Spark是一款开源集群计算系统,旨在通过基于内存的数据处理方式提高数据处理速度,适用于批处理、交互式查询、流处理等多种应用场景。 - **Spark核心组件**: - **Spark Core**:提供基础...
- **实时性**:如何进一步提高数据处理的速度,满足更严格的实时性要求。 ### 小结 通过本演讲,我们了解到了Uber如何利用Apache Flink构建了一个强大的端到端平台,该平台不仅可以有效地生成和管理商业性能指标,...