`

分布式SQL查询引擎Presto原理介绍

阅读更多

我们实时引擎组新引入了一款分布式SQL查询引擎,名字叫Presto,目前已经调研和测试了2个月了,并且期间某平台也从impala平台迁入到了Presto平台,查询性能有了2-3倍的提升(各种原因导致),所以本文将结合作者这段时间的测试和调研研究,来揭开Presto的神秘面纱。

Presto是神马

Presto是由Facebook开发的一个分布式SQL查询引擎, 它被设计为用来专门进行高速、实时的数据分析。它的产生是为了解决Hive的MapReduce模型太慢以及不能通过BI或Dashboards直接展现HDFS数据等问题。Presto是一个纯粹的计算引擎,它不存储数据,其通过Connector获取第三方Storage服务的数据。

历史

  • 2012年秋季,Facebook启动Presto项目
  • 2013年冬季,Presto开源
  • 2017年11月,11888 commits,203 releases,198 contributors

功能和优点

  • Ad-hoc,期望查询时间秒级或几分钟
  • 比Hive快10倍
  • 支持多数据源,如Hive、Kafka、MySQL、MonogoDB、Redis、JMX等,也可自己实现Connector
  • Client Protocol: HTTP+JSON, support various languages(Python, Ruby, PHP, Node.js Java)
  • 支持JDBC/ODBC连接
  • ANSI SQL,支持窗口函数,join,聚合,复杂查询等

架构

  • Master-Slave架构
  • 三个模块
    • Coordinator、Discovery Service、Worker
  • Connector

Presto沿用了通用的Master-Slave架构,Coordinator即Presto的Master,Worker即其Slave,Discovery Service就是用来保存Worker结点信息的,通过HTTP协议通信,而Connector用于获取第三方存储的Metadata及原始数据等。

Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行;Worker节点负责实际执行查询任务。Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。假如配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息,Worker节点与HDFS交互读取数据。

部署方式

Presto常见的部署方式如下图所示:

Coordinator与Discovery Server耦合在一起混合部署,然后部署多台Worker。然而这个有个问题,就是Coordinator存在单点问题,我们目前线上使用ip漂移的方法(网卡绑定多ip)。如下图所示:

查询流程

整体查询流程为:

  • Client使用HTTP协议发送一个query请求。
  • 通过Discovery Server发现可用的Server。
  • Coordinator构建查询计划(Connector插件提供Metadata)
  • Coordinator向workers发送任务
  • Worker通过Connector插件读取数据
  • Worker在内存里执行任务(Worker是纯内存型计算引擎)
  • Worker将数据返回给Coordinator,之后再Response Client

SQL执行流程


当Coordinator收到一个Query,其SQL执行流程如上图所示。SQL通过Anltr3解析为AST(抽象语法树),然后通过Connector获取原始数据的Metadata信息,这里会有一些优化,比如缓存Metadata信息等,根据Metadata信息生成逻辑计划,然后会依次生成分发计划和执行计划,在执行计划里需要去Discovery里获取可用的node列表,然后根据一定的策略,将这些计划分发到指定的Worker机器上,Worker机器再分别执行。

与Hive比较


上图显示了MapReduce与Presto的执行过程的不同点,MR每个操作要么需要写磁盘,要么需要等待前一个stage全部完成才开始执行,而Presto将SQL转换为多个stage,每个stage又由多个tasks执行,每个tasks又将分为多个split。所有的task是并行的方式进行允许,stage之间数据是以pipeline形式流式的执行,数据之间的传输也是通过网络以Memory-to-Memory的形式进行,没有磁盘io操作。这也是Presto性能比Hive快很多倍的决定性原因。

实现低延时的原理

  • 完全基于内存的并行计算
  • 流水线
  • 本地化计算
  • 动态编译执行计划
  • 小心使用内存和数据结构
  • 类BlinkDB的近似查询
  • GC控制

当然其优化方法也包括了一些传统的SQL优化原理,关于这些优化细节等后续文章详细介绍。

缺点

前面介绍了Presto的各种优点,其实其也有一些缺点,主要缺点为以下三条:

  • No fault tolerance;当一个Query分发到多个Worker去执行时,当有一个Worker因为各种原因查询失败,那么Master会感知到,整个Query也就查询失败了,而Presto并没有重试机制,所以需要用户方实现重试机制。
  • Memory Limitations for aggregations, huge joins;比如多表join需要很大的内存,由于Presto是纯内存计算,所以当内存不够时,Presto并不会将结果dump到磁盘上,所以查询也就失败了,但最新版本的Presto已支持写磁盘操作,这个待后续测试和调研。
  • MPP(Massively Parallel Processing )架构;这个并不能说其是一个缺点,因为MPP架构就是解决大量数据分析而产生的,但是其缺点也很明显,假如我们访问的是Hive数据源,如果其中一台Worke由于load问题,数据处理很慢,那么整个查询都会受到影响,因为上游需要等待上游结果。
    这篇文章就先介绍这里吧,后续会陆续更新一系列Presto相关的文章,欢迎关注。

参考链接

https://tech.meituan.com/presto.html

分享到:
评论

相关推荐

    Presto大数据查询引擎是用于大数据的分布式SQL查询引擎

    Presto大数据查询引擎环境要求: Mac OS X或Linux Java 8 Update 151或更高版本(8u151 +),64位。支持Oracle JDK和OpenJDK。 Maven 3.3.9+(用于建筑) Python 2.4+(用于与启动脚本一起运行) Presto大数据查询...

    Java_Presto大数据分布式SQL查询引擎的官方主页.zip

    Presto是一个高性能、分布式SQL查询引擎,专为处理大规模数据而设计。它由Facebook开源,现已成为Apache软件基金会的顶级项目。Presto的主要目标是实现快速查询大规模的数据仓库,支持PB级甚至EB级的数据量。由于其...

    Java_Trino的官方存储库,用于大数据的分布式SQL查询引擎,以前称为PrestoSQL.zip

    Java_Trino,前身被称为PrestoSQL,是一个高性能、分布式SQL查询引擎,专门设计用于处理大规模数据集。这个开源项目由Facebook发起,并在2019年转为Trino基金会管理,以支持其独立发展。Java_Trino的核心目标是提供...

    Presto 分布式SQL查询引擎 v0.241官方版

    为您提供Presto 分布式SQL查询引擎下载,Presto是一个针对大数据的分布式SQL查询引擎,第一次构建Presto后,你可以将项目加载到你的IDE中并运行服务器,我们建议使用IntelliJ IDEA,因为Presto是一个标准的Maven项目...

    分布式大数据查询引擎 PrestoDB.zip

    PrestoDB 是 Facebook 推出的一个大数据的分布式 SQL 查询引擎。可对从数 G 到数 P 的大数据进行交互式的查询,查询的速度达到商业数据仓库的级别。 Presto 可以查询包括 Hive、Cassandra 甚至是一些商业的数据存储...

    presto, 分布式大数据SQL查询引擎,适用于交互式分析查询.zip

    Presto是一个高性能、分布式SQL查询引擎,专为大规模数据集的交互式分析而设计。它的设计理念是为了处理PB级别的数据,同时保持低延迟的查询性能,使得分析师、数据科学家以及业务用户可以快速获取所需信息。Presto...

    分布式大数据SQL查询引擎-Presto-0.229

    本资源是基于Presto官网0.229版本扩展了Oracle Connector功能编译而来的部署包。 服务端启动命令 非后台运行模式 cd presto-server-0.229 ./presto-run.sh 后台运行模式 cd presto-server-0.229 ./presto-...

    大数据-分布式大数据SQL查询可视化界面设计.zip

    为了克服这些挑战,分布式SQL引擎如Apache Hive、Presto和Apache Calcite被开发出来,它们提供了一种将传统SQL语句转换为适合分布式环境执行的机制。这些引擎通常有自己的元数据存储,用于管理数据的分布和分区,...

    Presto大数据分布式SQL查询引擎的官方主页——prestodb/ Presto

    Presto is a distributed SQL query engine for big data. See the for deployment instructions and end user documentation. Requirements Mac OS X or Linux Java 8 Update 151 or higher (8u151+), 64-bit. Both...

    trino:Trino的官方存储库,Trino是大数据的分布式SQL查询引擎,以前称为PrestoSQL(https:trino.io)

    Trino是用于大数据分析的快速分布式SQL查询引擎。 有关部署说明和最终用户文档,请参见《》。 发展历程 有关代码样式,开发过程和准则的信息,请参见“”。 请参阅的贡献。 建造要求 Mac OS X或Linux Java 11.0.7...

    Presto介绍、原理、安装使用

    Presto是一款高性能的开源分布式SQL查询引擎,适用于对大规模数据集进行快速分析。它支持多种数据源,如Hive、Cassandra、PostgreSQL、Kafka、MySQL、ElasticSearch等,能够在一个查询中同时操作来自不同数据源的...

    Presto架构及原理

    SQL查询引擎,可对从数G到数P的大数据进行交互式的查询,查询的速度达到商业数据仓库的级别,据称该引擎的性能是 Hive的10倍以上。Presto可以查询包括Hive、Cassandra甚至是一些商业的数据存储产品,单个 Presto查询...

    Presto SQL on Everything

    Presto是一个高性能、分布式、SQL查询引擎,设计用于处理大规模数据集,尤其适合于交互式分析。其核心特性包括低延迟查询、支持多种数据源以及对Java的深度集成。 1. **Presto SQL简介** Presto SQL是Presto项目的...

    presto部署并连接postgresql

    在IT行业中,Presto是一个分布式SQL查询引擎,设计用于快速处理大规模的数据。它支持多种数据源,包括Hadoop Distributed File System (HDFS)、Amazon S3、Cassandra以及我们这里关注的PostgreSQL。本篇文章将详细...

    刘奇-TiDB为HBase插上分布式SQL的翅膀

    TiDB是一个开源的分布式SQL数据库,由PingCAP公司开发,并且在文档中介绍了TiDB如何在HBase之上提供分布式SQL的支持。TiDB支持分布式事务的一致性,兼容MySQL协议,允许应用程序几乎不需要代码修改的情况下替换MySQL...

    RPresto, 基于DBI的统计编程语言 R的适配器.zip

    RPresto, 基于DBI的统计编程语言 R的适配器 RPrestoRPresto是用于开源分布式SQL查询引擎Presto的DBI -based适配器,用于运行交互式解析查询。安装RPresto都在 CRAN 和 github上。 对于CRAN版本,你可以使用install.p

    presto-web查询工具.zip

    Presto是一个高性能、分布式SQL查询引擎,设计用于处理PB级别的数据。它支持实时分析,适用于大规模数据仓库。Presto是由Facebook开源的,现在由Presto Software Foundation维护。Yanagishima则是一个Web界面,专为...

    Presto简介.docx

    Presto 是一种由 Facebook 开发的开源、分布式SQL查询引擎,专为在线分析处理(OLAP)设计,适用于处理PB级别的大规模数据。其设计目标是实现低延迟、高并发的查询性能,同时支持跨多个数据源的级联查询,提供内存...

Global site tag (gtag.js) - Google Analytics