1.Presto简介
Presto是Facebook推出的一个基于Java开发的大数据分布式SQL查询引擎,可对从数 G 到数 P 的大数据进行交互式的查询,查询速度快(据称性能是hive的10倍以上),Presto 的目标是在可期望的响应时间内返回查询结果,单个 Presto 查询可合并来自多个数据源的数据进行统一分析。
适合场景:PB级海量数据复杂分析,交互式SQL查询,⽀持跨数据源查询
不适合场景:多个大表的join操作,因为presto是基于内存的,join操作输入小但产生的中间数据大,在内存里可能放不下
与Hive的区别:
(1)hive是一个数据仓库,提供存储服务,但只能访问HDSF的数据,presto是一个分布式的查询引擎,并不提供数据的储存服务,为此,presto是一个插拔式的设计思路,支持多种数据源,包括hive,hdfs,mysql,等。
(2)两者的基本架构
hive的基本架构:
hive:Client将查询请求发送到hive Service,它会和Metastor交互,获取表的源信息(如表的位置结构)之后Hive Service会进行语法分析,解析成语法树,变成查询计划,进行优化后将查询计划交给执行引擎(默认是Map reduce),然后翻译成Map Reduce任务来运行。
Presto:presto是在它内部做hive类似的逻辑
1. 2 Presto内部架构
Presto查询引擎是一个Master-Slave的架构模式,由三部分组成:
1.一个 coordinator
2.一个discovery server
3.多个worker
- coodinator:用于解析查询sql,生成执行计划,并分发给worker执行。
- discovery server:通常内嵌与Coordinator节点中,worker上线后,向discovery server注册。coodinator分发任务前,需要向discovery server获取可以正常工作worker列表。
- worker:具体执行任务的工作节点。
presto可以借助hive的元信息找到hdfs上的节点。
1.3 Presto中SQL运行流程
step1:当我们执行一条sql查询,coordinator接收到这条sql语句以后,它会有一个sql的语法解析器去把sql语法解析变成一个抽象的语法树(AST),这抽象的语法树它里面只是进行一些语法解析,如果你的sql语句里面,比如说关键字你用的是int而不是Integer,就会在语法解析这里给暴露出来
step2:2、如果语法是符合sql语法规范,之后会经过一个逻辑查询计划器的组件,他的主要作用是,比如说你sql里面出现的表,他会通过connector的方式去meta里面把表的schema,列名,列的类型等,全部给找出来,将这些信息,跟语法树给对应起来,之后会生成一个物理的语法树节点,这个语法树节点里面,不仅拥有了它的查询关系,还拥有类型的关系,如果在这一步,数据库表里某一列的类型,跟你sql的类型不一致,就会在这里报错.
step3:如果通过,就会得到一个逻辑的查询计划,然后这个逻辑查询计划,会被送到一个分布式的逻辑查询计划器里面,进行一个分布式的解析,分布式解析里面,他就会去把对应的每一个查询计划转化为task
step4:在每一个task里面,他会把对应的位置信息全部给提取出来,交给执行的plan,由plan把对应的task发给对应的worker去执行,这就是整个的一个过程,与hive默认的引擎Mapreduce相比,presto将数据放在内存中,task之间进行数据shuffle时,直接从内存里处理,所以很快。
2 .安装
Presto的安装基本环境
- Linux或Mac OS X.
- Java 8,64位
- Python 2.4+
连接器:
Presto支持从以下版本的Hadoop中读取Hive数据:支持以下文件类型:Text