1

Presto 在字节跳动的内部实践与优化(优化篇)

 2 years ago
source link: https://xie.infoq.cn/article/061bb0935a8575e01ea243852
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在字节跳动内部,Presto 主要支撑了 Ad-hoc 查询、BI 可视化分析、近实时查询分析等场景,日查询量接近 100 万条。本文是《Presto 在字节跳动的内部实践与优化》系列文章的连载之二,由字节跳动数据平台 Presto 团队软件工程师常鹏飞在 PrestoCon 2021 大会上的分享整理,核心提炼了三个场景中的优化与实践。

Ad-hoc 查询分析场景

2020 年之前,大数据场景下的 Ad-hoc 查询主要由 Hive/SparkSQL 来支撑。为了进一步优化查询性能,提高资源使用效率,从 2020 年开始,我们在生产环境大规模使用 Presto。

  • 与 SparkSQL 相比,Presto 是一个常驻的 MPP 架构的 SQL 查询引擎,避免了 Spark Context 启动以及资源申请的开销,端到端延迟较低。

  • 与 Hive/Spark Thrift Server 相比,Presto Coordinator 更加成熟,轻量,稳定,同时 Presto 基于全内存的 Shuffle 模型可以有效的降低查询延迟。

为了做到用户查询无感迁移到 Presto,我们做了大量的工作使得 Presto 在语法和语义层面兼容 SparkSQL。

  • 在接入层方面:提供了 SQL 标准化改写功能。该功能可以将用户的 SQL 改写成 Presto 可以支持的 SQL 语法进行执行,做到了底层引擎对用户透明。

  • 在函数支持方面:在 Presto 中支持了 Hive UDF 的执行,使得之前数据分析师积累下来的大量 UDF 可以在 Presto 中执行。该功能主要支持了在解析阶段可以加载 Hive UDF 和 UDAF,并进行类型转换使其适配 Presto 类型体系,最终封装成 Presto 内置函数的形式进行执行。目前该功能部分已经贡献回了 Presto 社区。社区地址

BI 可视化分析场景

Presto 在字节跳动应用的另一个比较重要的场景是 BI 可视化分析。

BI 可视化分析提供了可视化交互的功能来进行数据分析,数据分析可以直观快速的进行数据分析并生成相应的分析图表,这给查询引擎提出了更高的要求。在这一场景下,不仅,QPS 大幅提高,同时还要求查询引擎能给出比较低的查询延迟。

为了应对这些挑战,我们做了一个比较重要的工作——在 Presto 中引入了物化视图

这种场景下,查询 SQL 往往都是由 BI 可视化平台根据固定的模版自动生成的,用户的可视化操作往往限于对查询过滤条件,聚合维度以及聚合指标的改变,适合物化视图的应用。

在物化视图功能中,我们借鉴了很多传统数据库的经验,工作主要涉及三方面的工作:

  • 物化视图的自动挖掘——主要根据用户查询的历史记录进行分析,统计不同数据的查询频率进行物化视图的自动推荐与创建。

  • 物化视图的生命周期管理——主要维护分区级别物化视图的自动更新,删除。

  • 物化视图的重写功能——基于已有的物化视图,对用户的 query 进行重写以减少查询执行的复杂度。

近实时场景的查询分析

这是今年开始探索的一个场景,主要是为了降低数据链路的延迟,提升查询分析的时效性。

传统的基于 ETL 的数据链路中,业务数据和日志数据经由 Kafka 定期 dump 到 HDFS,然后会有多个 ETL 任务对数据进行加工清理形成不同层级的 Hive 表用来进行查询分析。

这个链路中往往需要进行表数据的全量更新,任务比较重,与线上数据存在 1 天以上的数据延迟。

为了降低数据延迟,我们引入了 Hudi 来进行数据的增量更新。

在这个链路中,业务数据和日志数据经由 Spark/Flink Streaming 任务增量写入到 Hudi 表中,数据分析师可以直接查询这部分数据。目前,该链路可以做到分钟级别的数据延迟。

我们在 Presto 的优化工作主要是将 Hudi 表读取的功能从 Hive Connector 中提取出来成为了一个单独的 Hudi Connector。

  • 首先,Hudi Connector 针对 Hudi 表的结构特点更好地支持了基于不同策略的分片调度算法,保证任务分配的合理性。

  • 同时,Hudi Connector 优化了 Hudi MOR 表读取过程中的内存管理,避免了 Worker 节点 OOM,提升了集群稳定性

  • 最后,Hudi Connector 的引入降低了 Hudi 版本升级带来的工作量,可以更好的集成 Hudi 社区最新的功能。这部分功能我们将会逐步贡献回社区。社区地址

本文中介绍的字节跳动内部 Presto 功能优化,目前已通过火山引擎数据产品“湖仓一体分析服务”向外部企业输出。

湖仓一体分析服务 LAS(Lakehouse Analytics Service)是面向湖仓一体架构的 Serverless 数据处理分析服务,提供一站式的海量数据存储计算和交互分析能力,完全兼容 Spark、Presto、Flink 生态,帮助企业轻松完成数据价值洞察。

更多关联产品

大数据研发治理套件 DataLeap

一站式数据中台套件,帮助用户快速完成数据集成、开发、运维、治理、资产、安全等全套数据中台建设,帮助数据团队有效的降低工作成本和数据维护成本、挖掘数据价值、为企业决策提供数据支撑。

火山引擎 E-MapReduce

支持构建开源 Hadoop 生态的企业级大数据分析系统,完全兼容开源,提供 Hadoop、Spark、Hive、Flink 集成和管理,帮助用户轻松完成企业大数据平台的构建,降低运维门槛,快速形成大数据分析能力。

推荐阅读:Presto 在字节跳动的内部实践与优化(实践篇)

欢迎关注字节跳动数据平台同名公众号


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK