文章目录
- 1. Presto是什么
- 2. Presto优缺点
- 2.1. 优点
- 2.2. 缺点
- 3. Presto适用场景
- 4. Presto数据模型
- 5. Presto 架构
- 5.1 执行流程
关键词:MPP 多源 即席查询 统一SQL执行引擎 分布式SQL引擎 数据分析
1. Presto是什么
- Presto是一款开源的分布式并行计算(MPP)引擎,主要适用于大数据领域GB~PB量级数据源的秒级分析查询场景需求。
- Presto的产生是为了解决MapReduce模型太慢且不能通过BI等工具展现HDFS数据的问题
- Presto是一个计算引擎,它不存储数据,主要通过丰富的Connector,获取第三方的数据,并支持扩展
官网介绍:
Apache Presto is a distributed parallel query execution engine, optimized for low latency and interactive query analysis. Presto runs queries easily and scales without down time even from gigabytes to petabytes.
A single Presto query can process data from multiple sources like HDFS, MySQL, Cassandra, Hive and many more data sources. Presto is built in Java and easy to integrate with other data infrastructure components. Presto is powerful, and leading companies like Airbnb, DropBox, Groupon, Netflix are adopting it.
2. Presto优缺点
2.1. 优点
- Presto支持标准的SQL,降低了分析人员和开发人员的使用门槛
- Presto支持可插拔的Connector,可以连接多种数据源,且支持跨数据源关联查询。eg: Hive、Mysql、Oracle、Kafka、MongoDB、Es、Postgresql…
- Presto是一个低延时、高并发的内存计算引擎, 执行效率远远高于Hive
- 部署简单,监控丰富
2.2. 缺点
-
内存限制: 虽然能够处理 PB 级别的海量数据分析,但不是代表 Presto 把 PB 级别都放在内存中计算的。而是根据场景,如 count,avg 等聚合运算,是边读数据边计算,再清内存,再读数据再计算,这种耗的内存并不高。但是连表查,就可能产生大量的临时数据,因此速度会变慢,反而 Hive此时会更擅长。
-
没有容错能力,当一个query分发到多个Worker去执行时,当有一个Worker因为各种原因查询失败,Master感知到之后,整个query也会失败
-
并行查询,因为所有的task都是并行执行,如果其中一台Worker因为各种原因查询很慢,那么整个query就会变得很慢
-
并发限制,因为全内存操作+内存限制,能同时处理的数据量有限,因而导致并发能力不足
3. Presto适用场景
- 加速Hive查询。Presto的执行模型是纯内存MPP模型,比Hive使用的磁盘Shuffle的MapReduce模型快至少5倍。
- 统一SQL执行引擎。Presto兼容ANSI SQL标准,能够连接多个RDBMS和数据仓库的数据源,在这些数据源上使用相同的SQL语法和SQL Functions。
- 为那些不具备SQL执行功能的存储系统带来SQL执行能力。例如Presto可以为HBase、Elasticsearch、Kafka带来SQL执行能力,甚至是本地文件、内存、JMX、HTTP接口,Presto也可以做到。
- 构建虚拟的统一数据仓库,实现多数据源联邦查询。如果需要计算的数据源分散在不同的RDBMS,数据仓库,甚至其他RPC系统中,Presto可以直接把这些数据源关联在一起分析(SQL Join),而不需要从数据源复制数据,统一集中到一起。
- 数据迁移和ETL工具。Presto可以连接多个数据源,再加上它有丰富的SQL Functions和UDF,可以方便的帮助数据工程师完成从一个数据源拉取(E)、转换(T)、装载(L)数据到另一个数据源。
4. Presto数据模型
- Catalog : 即数据源。Hive、Mysql都是数据源,Presto可以连接多个Hive和多个Mysql
- Schema: 类比于DataBase, 一个Catalog下有多个Schema
- Table: 数据表,与我们常用的数据库表意义相同,一个Schema下有多个数据表
查询示例:
SELECT * from hive.dwd.table_a a
JOIN mysql.dim.user_type_dim b
WHERE a.id = b.id
5. Presto 架构
Presto是MS(master- slave)架构的,由一个Coordinator节点,一个Discovery 节点,和多个Worker节点组成,如下所示:
上图由不同的组件组成。下表详细描述了每个组件。
5.1 执行流程
1、提交SQL:用户可以在SQL Client(CLI/JDBC/HTTP) 输入SQL,它负责提交SQL Query给Presto集群(Coordinator)
2、生成执行计划,任务调度:Coordinator接到SQL后,通过SQL语法解析器把SQL语法解析变成一个抽象的语法树AST,语法符合SQL语法,会经过一个逻辑查询计划器组件,通过connector 查询metadata中schema 列名 列类型等,将之与抽象语法数对应起来,生成一个物理的语法树节点, 然后得到一个逻辑的查询计划,将其分发到分布式的逻辑计划器里,拆分Stage和Task,调度分布式执行的Task到Presto Worker上。
3、执行:Presto Worker 负责执行收到的HttpRemoteTask,根据执行计划确定好都有哪些Operator以及它们的执行顺序,之后通过TaskExecutor和Driver完成所有Operator的计算。如果第一个要执行的Operator是SourceOperator,当前Task会先从External Storage System中拉取数据再进行后续的计算。如果最后一个执行的Operator是TaskOutputOperator,当前Task会将计算结果输出到OutputBuffer,等待依赖当前Stage的Stage来拉取结算结果。整个Query的所有Stage中的所有Task执行完后,将最终结果返回给SQL Client。
PS:
External Storage System:由于Presto自身不存储数据,计算涉及到的数据及元数据都来自于外部存储系统,如HDFS,AWS S3等分布式系统。在企业实践经验中,经常使用HiveMetaStore来存存储元数据,使用HDFS来存储数据,通过Presto执行计算的方式来加快Hive表查询速度。
执行计划:它描述的是SQL执行的详细步骤和细节,SQL执行引擎只要按照执行计划执行即可完成整个计算过程,如下图:
参考资料:
- https://prestodb.io/
- https://www.tutorialspoint.com/apache_presto/apache_presto_architecture.htm