Presto查询引擎简单分析
Hive查询流程分析
各个组件的作用
UI(user interface)(用户接口):提交数据操作的窗口
Driver(引擎):负责接收数据操作,实现了会话句柄,并提供基于JDBC / ODBC的execute和fetch API
Metastore(元数据):Hive元数据,存储所有表信息以及相关的HDFS文件存储目录,一般采用MySQL或者derby存储
Compiler(编译器):解析查询的SQL,生成阶段性的执行计划(包含MapReduce、元数据操作)
Execution Engine(执行引擎):执行compiler生成的执行计划。该执行计划是一个阶段的DAG
查询流程
Step 1:UI调用的Driver的execute接口
Step 2:Driver为查询创建会话句柄,并将查询发送给compiler以生成执行计划,
Step 3,4:compiler从metastore获取相关的元数据
Step 5:检查元数据,基于查询谓词调整分区,解析SQL,生成执行计划
Step 6,6.1,6.2,6.3:由compiler生成的执行计划是阶段的DAG,每个阶段都会涉及到Map/Reduce job,元数据的操作或者HDFS文件的操作。
在Map/Reduce阶段,执行计划包含Map操作树(操作树在Mappers上执行)和reduce操作树(Reduce 操作树在 Reducers上执行),
Execution Engine 将各个阶段提交个适当的组件执行。
Step 7, 8 and 9:在每个任务(mapper / reducer)中,表或者中间输出相关的反序列化器从HDFS读取行,并通过相关的操作树进行传递。
一旦这些输出产生,将通过序列化器生成零时的的HDFS文件(这个只发生在只有Map没有reduce的情况),生成的HDFS零时文件用于执行计划后续的Map/Reduce阶段。
对于DML操作,临时文件最终移动到表的位置。该方案确保不出现脏数据读取(文件重命名是HDFS中的原子操作),
对于查询,临时文件的内容由Execution Engine直接从HDFS读取,作为从Driver Fetch API的一部分
Presto查询流程分析
在Map/Reduce阶段 执⾏计划包含Map操作树 操作树在Mappers上执⾏ 和reduce
各个组件的作用
Client(客户端):提交数据操作的窗口
Discovery Server(服务发现者):存储可用的Server列表
Coordinator(协调者): 接收数据操作,解析SQL语句,生成查询计划,分发任务至Worker机
Connector Plugin(连接插件):连接Storagr,提供元数据,支持Hive、Kafka、MySQL、MonogoDB、Redis、JMX等数据源,可自定义
Worker(执行者):执行查询计划
查询流程
1、Client使用HTTP协议发送一个query请求
2、通过Discovery Server发现可用的Server
3、Coordinator构建查询计划(通过Anltr3解析为AST(抽象语法树),然后通过Connector获取原始数据的Metadata信息,生成分发计划和执行计划)
4、Coordinator向workers发送任务
5、Worker通过Connector插件读取数据
6、Worker在内存里执行任务(Worker是纯内存型计算引擎)
7、Worker将数据返回给Coordinator,汇总之后再响应客户端
Presto与Hive对比
区别:
MapReduce每个操作都需要写磁盘,每个stage需要等待前一个stage全部完成才开始执行,
而Presto将SQL转换为stage,每个stage又由多个tasks执行,每个tasks又将分为多个split。
所有的task是并行的方式执行,stage之间数据是以pipeline形式流式的执行,
数据之间的传输也是通过网络以Memory-to-Memory的形式进行,没有磁盘io操作。
这也是Presto性能比Hive快5-10倍的决定性原因
Presto缺点
1、没有容错能力,当一个query分发到多个Worker去执行时,当有一个Worker因为各种原因查询失败,Master感知到之后,整个query也会失败
2、内存限制,由于Presto是纯内存计算,所以当内存不够时,Presto并不会将结果dump到磁盘上,所以查询也就失败了(据说最新版本的Presto已经支持写盘操作)
3、并行查询,因为所有的task都是并行执行,如果其中一台Worker因为各种原因查询很慢,那么整个query就会变得很慢
4、并发限制,因为全内存操作+内存限制,能同时处理的数据量有限,因而导致并发能力不足
Mob项目的应用
http://gitlab.code.mob.com/mobdata-plat/dbcloud-api
作者:MobService
链接:https://juejin.im/post/5d103fb76fb9a07eb15d6145
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Presto查询引擎简单分析的更多相关文章
- Presto 来自Facebook的开源分布式查询引擎
Presto是一个分布式SQL查询引擎, 它被设计为用来专门进行高速.实时的数据分析.它支持标准的ANSI SQL,包括复杂查询.聚合(aggregation).连接(join)和窗口函数(windo ...
- 探究Presto SQL引擎(3)-代码生成
vivo 互联网服务器团队- Shuai Guangying 探究Presto SQL引擎 系列:第1篇<探究Presto SQL引擎(1)-巧用Antlr>介绍了Antlr的基本用法 ...
- 大数据系列之分布式大数据查询引擎Presto
关于presto部署及详细介绍请参考官方链接 http://prestodb-china.com PRESTO是什么? Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持G ...
- 实时查询引擎 - Facebook Presto 介绍与应用
1. Presto 是什么 Facebook presto是什么,继Facebook创建了HIVE神器后的又一以SQL语言作为接口的分布式实时查询引擎,可以对PB级的数据进行快速的交互式查询.它支 ...
- Presto: 可以处理PB级别数据的分布式SQL查询引擎
2012年秋季Facebook启动了Presto,Presto的目的是在几百PB级别数据量上面进行准实时分析.在摒弃了一些外部项目以后,Facebook准备开发他们自己的分布式查询引擎.Presto的 ...
- Facebook 正式开源其大数据查询引擎 Presto
Facebook 正式宣布开源 Presto —— 数据查询引擎,可对250PB以上的数据进行快速地交互式分析.该项目始于 2012 年秋季开始开发,目前该项目已经在超过 1000 名 Faceboo ...
- 探究Presto SQL引擎(1)-巧用Antlr
一.背景 自2014年大数据首次写入政府工作报告,大数据已经发展7年.大数据的类型也从交易数据延伸到交互数据与传感数据.数据规模也到达了PB级别. 大数据的规模大到对数据的获取.存储.管理.分析超出了 ...
- 探究Presto SQL引擎(4)-统计计数
作者:vivo互联网用户运营开发团队 - Shuai Guangying 本篇文章介绍了统计计数的基本原理以及Presto的实现思路,精确统计和近似统计的细节及各种优缺点,并给出了统计计数在具体业务 ...
- HBase高性能复杂条件查询引擎
转自:http://blog.csdn.net/bluishglc/article/details/31799255 mark 写在前面 本文2014年7月份发表于InfoQ,HBase的PMC成员T ...
随机推荐
- 动态设置html的title
使用vue前端框架做,竟然丢弃了很多javascript和html的东西了..动态设置title的方法: 1.使用vue的自定义指令 <div v-title>{{htmltitle}}& ...
- wdcp 使用说明总结(持续更新中。。。)
wdcp 使用说明总结(持续更新中...) 1.移动文件时,如果是上一层,直接填写../即可
- Python json和simplejson的使用
在Python中,json数据和字符串的转换可以使用json模块或simplejson模块. json从Python2.6开始内置到了Python标准库中,我们不需要安装即可直接使用. simplej ...
- 20个必不可少的Python库也是基本的第三方库
个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都应该有它. Scrapy. ...
- nginx的常用负载均衡算法,分别是
随机分配,hash一致性分配,最小连接数分配,主备分配 随机,轮训,一致性哈希,主备,https://blog.csdn.net/liu88010988/article/details/5154741 ...
- 【第一章第一回】BootStrap 简介
Twitter Bootstrap 是目前最受欢迎的前端框架,它简洁.直观.移动优先.强悍的前端开发框架,让web开发更迅速.简单.基于HTML.CSS和Javascript. 为什么使用Bootst ...
- MyBatis拦截器打印不带问号的完整sql语句方法
/* Preparing: SELECT * FROM tb_user WHERE id = ? AND user_name = ? 目标是打印:SELECT * FROM tb_user WHER ...
- 大数据学习——sparkSql对接mysql
1上传jar 2 加载驱动包 [root@mini1 bin]# ./spark-shell --master spark://mini1:7077 --jars mysql-connector-j ...
- 大数据学习——scala的wordCount小例子
val lines=List("hello tom hello jerry","hello tom hello kitty hello china") //方法 ...
- day03_12 缩进介绍
python比较变态,必须缩进,而C可以不缩进,世界上只有python这门语言要求必须缩进 tab键是缩进,shift+tab往左移动 SyntaxError:invalid syntax 语法错误 ...