Uber使用Apache Pinot实时分析移动app的崩溃


在 Uber,我们构建了一个名为“Healthline”的系统,以帮助解决平均检测时间 ( MTTD ) 和平均解决时间 ( MTTR ) 问题,并避免潜在的中断和大规模用户影响。由于我们能够实时检测问题,这已成为发布经理观察金丝雀发布的影响并决定是否进一步进行或回滚的首选工具。 

在本文中,我们将分享如何利用 Apache Pinot ™在 Uber 规模上实时实现这一目标的详细信息。

Healthline 是一款崩溃/异常记录、监控、分析和警报工具,专为多个平台的所有 Uber 移动应用程序以及使用各种编程语言编写的 5,000 多个微服务而构建,由 Uber 内部的多个技术团队拥有。 

在非常高的层面上,它处理内部系统生成的所有崩溃、错误和异常日志,并通过将类似的异常/崩溃分类到称为问题的不同存储桶中来构建分析见解。它还解决了识别导致这些问题的潜在变化的问题,并随后在观察到特定问题的异常时通知系统所有者。 

术语定义

  • 崩溃– 我们使用它来表示从每个 Uber 移动应用程序中嵌入的 SDK 收到的任何致命或非致命(例如内存泄漏)报告的实例。
  • 问题– 被确定为具有相同根本原因的一组崩溃。
  • 应用程序– 应用程序代表 Uber 开发的应用程序。我们将应用程序+平台(iOS/Android)视为一个独特的应用程序,因此 Rider iOS 和 Rider Android 被视为两个应用程序。

Apache Pinot
Apache Pinot 是一种实时、分布式、列式 OLAP 数据存储,用于以低延迟提供可扩展的实时分析。它可以从批处理数据源(如 Apache Hadoop® 分布式文件系统、S3、Azure® Data Lake、Google Cloud Storage)以及流数据源(如 Apache Kafka®)摄取数据。Pinot 采用横向扩展设计,可根据需要扩展到更大的数据集和更高的查询率。

表是一种逻辑抽象,表示相关数据的集合。它由列和行组成(在 Pinot 中称为文档)。列、数据类型和与表相关的其他元数据都是通过模式定义的。

Pinot 将表分成多个部分,并将这些部分存储在 Hadoop 分布式文件系统(HDFS)等深层存储以及 Pinot 服务器中。

我们的摄取管道处理原始崩溃数据,并通过分类和其他详细信息来丰富它。它将丰富的崩溃数据发布到 Kafka 主题。这是我们想要存储并想要执行所需的聚合和过滤操作以服务于用户仪表板和其他集成的源。

架构设计

  1. 写入路径 
    • Apache Flink®作业 
      • 来自输入 Kafka 主题的流
      • 数据扁平化
      • 压缩和压缩采样
      • 将数据输出到 2 个 Kafka 主题,如上图所示。
  • 输出 Kafka 主题– 启用所有扁平化字段和 Apache Hive ™摄取。
  • Kafka Consumers – 从 Kafka 主题填充实时 Pinot 表
  • 计划的 Apache Spark ™作业– 从 Hive 数据集中填充离线 Pinot 表
    1. 读取路径
      • 从存储压缩数据的表中读取 (healthline_crash_event_compressed_prod)数据以压缩形式存储,需要使用通用解压缩器解压缩并转换回原始崩溃报告。
      • 从存储主要扁平数据 (healthline_crash_event_prod) 和分解数组数据 (healthline_crash_event_denormalized_prod) 的表中读取数据被扁平化并存储 - 即,需要使用通用 unflattener 重建嵌套的崩溃报告字段。

    详细点击标题