Presto: SQL on Everything

What Is Presto

Presto是Facebook开发和开源的分布式SQL查询引擎,支撑其内部大量的SQL分析的负载。Presto提供了ANSI SQL接口来查询存储在Hadoop环境,RDBMS系统,NoSQL系统和流处理系统(比如,Kafka)的数据。Presto暴露了开放的HTTP API,包括JDBC支持,并且与多个行业标准的BI和查询创作工具兼容。内置的Hive连接器可以本地读取和写入分布式文件系统,例如HDFS和S3;并支持多种流行的开源文件格式,包括 ORC、Parquet和Avro。

Why Presto

Presto在Facebook主要有如下使用场景:

  • 交互式查询,数据量级在50GB-3TB,查询延迟在秒级或分钟级,查询在返回结果之后往往会被取消,或者通过LIMIT关键字限制返回结果
  • Batch ETL,查询是定时调度的,资源密集的,CPU-heavy的转换,内存密集(TB级)的聚合,关联大表,对查询延迟不敏感
  • A/B Testing & Developer/Advertiser Analysis,查询形状固定,延迟在秒级

Presto Architecture & Design Principles

presto-arch

一个Presto cluster包含一个cooridnator节点和一个或多个worker节点。Coordinator负责接收,解析,规划和优化查询与查询编排,它把优化后的分布式执行计划发送给workers,以tasks的形式执行,枚举split分配给读取数据的tasks。Worker节点执行tasks读取外部存储系统数据的tasks,或者处理其它worker(包括自己)产出中间计算结果。Presto被设计为扩展的,Connectors提供API与外部数据存储通信:Metadata APIData Location APIData Source API,和Data Sink API

Parsing, Planning & Query Optimization

Presto使用基于ANTLR的parser解析SQL为一个syntax tree,经过logical planner后生成一个plan nodes tree,每个节点都是pure logical不包含任何plan如何执行的信息,最后通过plan optimizer进行greedy转换,即rule-based的优化(RBO,比如predicate/limit pushdown,column pruning,decorrelation),还有cost-based优化(CBO,比如join strategy选择,join-reording),生产一个分布式执行计划/物理计划(注:这里的term和SparkSQL Catalyst有些不一样,但是基本流程和思想是一致的)。