整体架构
大致分为几个部分:
- Client 客户端,使用presto-client 打包的jar可执行文件
- 常见用法:
./presto-cli.jar --server localhost:8080 --catalog mongodb --schema user --debug
- 常见用法:
- Coordinator节点,做一些调度工作;
- Discovery service节点,协助Coordinator节点和Worker节点互相发现的服务;
- Worker节点,干活的节点。比如表扫描等工作;
- Connector plugin。插件化的组件,可以通过为Postgresql、Mysql等写对应的Connector实现支持presto从这些数据库中读写数据,官方已经维护了一些主流的Connector;
更具体的Connector连接图:
几种典型的部署架构图
单机版–Coordinator、Worker、Discovery Service于一身
多个Worker版
将Discovery server独立出去的版本
高可用增强版
执行流程
各个节点互相连接
客户端发送请求给Coordinator
Coordinator根据请求去找对应的Connector plugin拿metadata
Coordinator生成执行计划(可以通过expain查看),调度worker
Worker拿到任务了,找Connector plugin去读数据源
Worker所有任务都在内存中执行(内存计算型)
client从worker拿到结果
支持多种Connector带来的好处
目前测试跨库数据迁移,也就是 create table DB_A.foo as select * from DB_B.bar
只在MongoDB中成功了,其他的都会触发异常,具体异常代码在 presto/presto-main/src/main/java/com/facebook/presto/split/PageSinkManager.java
,也就是Connector必须要实现 ConnectorPageSinkProvider
这个接口。
查询计划相关
执行模型-和MapReduce相比较
查询计划示例
Presto会分为多个Stage
并分到多个worker中去
每个Stage又分为多个Tasks
每个Task又分为多个Split
总结
再来一个例子
1 | select count(*) from foo; |
在两个Worker的例子中:
看一下执行计划:
1 | presto:default> EXPLAIN ANALYZE VERBOSE select count(*) from mongodb.foo.bar; |
1 | presto:default> EXPLAIN ANALYZE VERBOSE select count(*) from mongodb.foo.bar; |