Presto 是一种分布式 SQL 查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集。例如,查询 TB 或者 PB 级别的数据,是查询 HDFS、Hive 的一个可选项,但同时不局限于 HDFS, Presto 适用于 OLAP 场景。Presto 并不能用来替代 mysql/pg/oracle,presto 设计的目的也不是用来处理 OLTP 场景。

Presto 架构角色

Presto 架构角色关系
Coordinator
Presto Coordinator 是负责解析语句,计划查询和管理 Presto worker 程序节点的服务器。它是 Presto 安装的 “大脑”,也是客户端连接到以提交执行语句的节点。每个 Presto 安装必须在一个或多个 Presto Worker 旁边配备一个 Presto Coordinator。出于开发或测试目的,可以将 Presto 的单个实例配置为执行这两个角色。
Coordinator 跟踪每个 Worker 上的活动并协调查询的执行。Coordinator 创建涉及一系列阶段的查询的逻辑模型,然后将其转换为在 Presto Worker 群集上运行的一系列关联任务。
Coordinator 使用 REST API 与 Workers、Client 进行通信。
Worker
Presto Worker 负责执行任务和处理数据。辅助节点从连接器获取数据并相互交换中间数据。Coordinator 负责从 Worker 那里获取结果并将最终结果返回给客户。
当 Presto Worker 进程启动时,它将自己通告给 Coordinator 中的发现服务器,这使 Presto Coordinator 可以使用它来执行任务。
Worker 使用 REST API 与其他 Workers、Coordinators 进行通信。
Discovery Service
Presto 使用服务发现来查找集群中所有的节点,每个注册到 Discovery Service 的节点周期性发送心跳信号,这可以使 Coordinator 获取最新的可用 Worker 节点列表,Worker 发送心跳失败,Discovery Service 会触发失败检测,Worker 将不会被分配任务。
Discovery Service 是内置在 Coordinator 节点中。
在设计上,Discovery 和 Coordinator 都是单节点。如果有多个 Coordinator 同时存活,Worker 会随机的向其中一个汇报进程和 Task 状态,导致脑裂。调度 query 时有可能会发生死锁。
所以一般 HA 会部署多个 Presto 集群,通过 LB 做多个 Coordinator 的负载均衡。