Apache|Uber 大规模运行 Apache Pinot实践( 三 )
每个 Pinot REST 代理实例中本地缓存的元数据在各种场景下都很有用。Piper(Spark)作业可以查询 REST 代理来获取表和模式信息,而不是 Pinot 控制器。这样可以减少控制器的负载,并将其与请求峰值隔离开来。
Pinot REST 代理目前正大量使用仪表板和分析应用程序的用例。
Presto
最近,我们在 Presto 和 Pinot 的集成方面做了很多工作,它允许我们的用户使用标准的 PrestoSQL 来查询 Pinot。我们最初将重点放在实时探索用例以及一些分析应用程序上。但是,经过多次优化和多个季度的生产经验之后,我们目前也在上马实时仪表板和应用程序用例。我们的长期计划是,用 Presto 取代 Pinot REST 代理。有关更多详细信息,请参阅下面关于完整的 SQL 支持的部分。
Uber 的贡献
Uber 的 Pinot 团队在提高整体可靠性和查询灵活性方面有四大贡献。
自助加载服务
在 Pinot 平台成立之初,加载新用例是一个非常手工的过程。我们的一位 Pinot 工程师必须与客户坐下来了解需求,提出一个模式、表配置,并估计服务该用例所需的容量。当然,客户开始使用 Pinot 的周转时间可能是三天到一周不等。为了让平台实现自助加载服务,我们在以下几个方面进行了投资。
我们添加了从输入 Kafaka 主题或使用 Avro 模式创建的 Parquet 数据文件自动派生 Pinot 模式的能力。在较高级别上,这个实用程序将 Avro 字段转换为 Pinot 列类型,并自动选择其中一个字段作为 timestamp 列。在某些情况下,它还将 Avro 记录展平为各个 Pinot 列类型。这种自动转换适用于超过 80% 的 Kafaka 或 Parquet 输入数据集,节省了大量的手工操作。
我们与 FlinkSQL 紧密集成,使客户能够将 Pinot 视为“数据接收器”。客户创建一个新的 FlinkSQL 作业,定义一个 SQL 转换查询,定义 Kafaka 主题的输入和输出,然后“push”(推送)到 Pinot。
在本例中,Pinot 模式是从输出 Kafaka 主题推断出来的。一旦 FlinkSQL 作业开始执行,这将在 Pinot 登台环境中自动创建一个表。
类似地,我们添加了从“Hive to Avro Converter” Spark 作业的输出派生 Pinot 模式的功能,并在推送数据之前在模拟 Pinot 集群中自动创建表和模式。
每个此类表都是在一个具有最小配置的登台环境中创建的。这允许用户在几分钟内开始向 Pinot 发出查询,或者构建一个定制的 BI 仪表板。在登台阶段,表会经历几轮迭代,例如模式演变、向相应的列添加专门的索引(例如,星型树、排序或倒排)以及用户查询的验证。登台环境中的内存和磁盘使用情况可以很好地指示生产需求。我们要求每个用例在升级到生产环境之前至少要进行 24 小时的审查。
完全 SQL 支持
如前所述,我们已经将 Pinot 和 Presto 集成在一起,以实现对这些数据集的标准 PrestoSQL 查询。这种组合效果很好,因为我们将 Pinot 的秒级数据新鲜度与 Presto 在执行复杂查询时的灵活性结合起来。此外,谓词下推和聚合函数下推使我们能够实现此类 PrestoSQL 查询的亚秒级查询延迟,这在标准后端(如 HDFS/Hive)上是不可能做到的。请阅读我们之前发表的文章了解这项工作的详细信息:
https://eng.uber.com/engineering-sql-support-on-apache-pinot/
用于 Pinot 段的 HDFS 深度存储
Pinot 最初的实时流获取设计(又名 LLC)要求在 Pinot 控制器上安装一个本地文件系统来存储 Pinot 段。如果 Pinot 服务器已经落后于其副本或在节点故障后正在重建的情况下,它允许服务器从中央存储下载段。最初的设计通过在控制器上安装一个网络文件系统(NFS)来解决这一容量问题。
与 Pinot 的许多其他用户一样,Uber 并没有 NFS,因此不能使用原始的 LLC 设计。为解决这一问题,我们和 LinkedIn 的工程师一起增强了 LLC 协议的分段完成阶段,使其可以与深度存储或 HDFS 或 Amazon S3 之类的外部存储服务一起使用。如今,Uber 的 Pinot 实时获取管道使用 HDFS 作为其深度存储,其中有数百个来自 Pinot 的段。
模式演变
我们的团队发现了 Pinot 模式演变中的一个重要问题。对于实时 Pinot 表(具体地说,从流数据源获取),并不完全支持向现有模式添加新列。尽管较旧的数据段准确地反映了这一点,但新列在最活跃的数据段中并不可见,从而导致查询失败。我们对这一关键问题的解决方法,可以在这里找到:
https://github.com/apache/incubator-pinot/issues/4225
经验教训
当我们在 Uber 内部扩展 Pinot 的用例时,我们学到了很多东西。本节中的许多经验教训来自于解决在操作、部署、内存管理和监控方面遇到的难题。
- 全自动|马斯克:特斯拉两周内大规模推送全自动驾驶(FSD)测试版
- 蔚来和小鹏|小鹏蔚来大规模断网,最后背锅的竟是中国移动
- 小基站带来新机遇!明年5G大规模室内建设将开始
- 大规模分布式强化学习基础架构Menger, 大幅提高真实任务的学习效率
- 腾讯云造了一个“智慧胶囊”,打开了5G大规模应用的大门
- Kubernetes 运维小记:node 为系统保留最低资源
- 在kubernetes中部署企业级ELK并使用其APM
- 部署|亚马逊云服务推出简化Apache Airflow部署与使用的托管服务
- Kubernetes上对应用程序进行故障排除的技巧
- 环闪|华为Mate40Pro环闪保护壳颇具创意,友商或大规模模仿
