马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一.名词解释:
Coordinator:
Presto主角色,单一节点,负责接受客户端请求,SQL语句解析,生成执行计划,管理worker节点;
Worker:
presto实际处理处理运行任务的节点,从数据源获取数据,处理并互相数据,被coordinator调度;
将结果返回给coordinator,启动后通过心跳和coordinator中的discovery server保持连接。
Connector:
SPI接口的实现,(SPI为适配所有数据源的统一接口规范),以有多种connector的实现,
包括hive,mysql,redis,kudu,kafka,monodb等等
Catalog:
数据源配置,每个一个数据源配置一个catalog,通过connector连接catalog;
Schema:
一系列表的组合,等同于database的概念;
Table:
等同于表的概念,因此presto访问一个表的全限定为 select * from catalog.schema.tablename;
Statement:
客户端提交的ANSI SQL语句,单纯只文本内容;
Query:
query为解析sql之后的执行计划,包含stage,tasks,splits,connectors等执行sql必要的组件的组合;
Stage:
Presto将执行计划逻辑上拆分为多个层次的stage,呈现树状结构,包含single stage(顶层聚合,返回结果给coordinator),fixed stages (中间计算) ,
source stages(数据scan,读取数据源),stage拆分成多个task并行执行;
Task:
并行运行在worker上的任务,包含输入输出,每个stage拆分为多个task,可以并行执行;
Split:
Task运行依赖的数据分片,每个task处理一个或多个split;
Driver:
split上一系列操作的集合,一个driver处理一个split,拥有输入输出;
Operator:
对split的一个操作,比如过滤,加权,转换等等;
Exchange:
完成tasks之间的数据交换;
二.架构设计
presto为纯内存大数据并行查询引擎,不同于hive的mapreduce在数据处理过程中经过多次磁盘IO,presto几乎完全内存计算,包括节点内部过滤聚合等的操作,以及节点之间的数据交换 。presto设计为主从模式的架构,coordinator为主节点,负责接受客户端请求,SQL语句解析,生成执行计划,管理worker节点。worker为从节点,实际执行查询任务的节点,支持横向扩展。worker在启动之后,像节点信息注册到Discovery Service,并通过心跳服务保持链接,汇报健康状态,coordinator从Discovery Server获取集群中的节点信息。Discovery Servery内嵌在Coordinator服务中,因此实际情况下,只存在两个角色,即coordinator和worker。
客户端提交SQL到coordinator,由coordinator负责解析SQL,生成执行计划,并且按照特定的调度策略,将解析生成的执行计划对应的所有tasks分发到worker中执行。出于下游的task从数据源读取所需要的数据,并且进行后续的计算和处理。Coordinator从分发Task之后,就与一直不断的从最上游的task获取计算结果,将计算结果缓存到Buffer中,直到所有计算结束。
实际上Presto在执行查询的时候,逻辑上是将查询拆分为具有层级关系的多个Stage,一个Stage代表查询执行计划的一部分。Stage的类型主要有三种:
Single: 这种类型的Stage用于聚合子Stage的输出数据,并将最终结果输出给coordinator;
Fixed:这种类型的Stage用于接受其子Stage产生的数据集并在集群中对这些数据进行分布式聚合或分组运算;
Source:这种类型的Stage直连数据源,从数据源读取数据,读取数据时,也会完成相关的条件过滤。
Stage不会真正在集群中运行,每个Stage可以拆分一系列Task,这些Task实际并行运行在Worker。每个Task处理一个或者多个Split,Task也使用相同的机制分解为一个或者多个Driver,每个Driver时一系列操作的组合,这样构成了一个完整的查询。
三.Presto使用
presto支持两种客户端类型,通过Shell-cli命令行客户端,或者JDBC/ODBC客户端。Presto使用ANSI SQL的语法,Hive使用的时HiveQL语法,在使用上存在一些差别:
show databases;
presto 每个connector 叫一个catalog,例如hive;
数据库称为schema, 例如hive中
show databases
presto中
show schemas;
presto中查询表的数据:
select * from [catalog].[schema].[tableName];
presto支持动态数组下标
presto支持动态数组下表,而HiveQL只支持常量数组下标,ANSI SQL定义如下:
SELECT my_array[CARDINALITY(my_array)] as last_element FROM ...
presto数组语法
第一个元素的数组下标从1开始:
SELECT my_array[1] AS first_element FROM ...
单双引号和反引号的使用
presto 字符串用单引号,标识符用双引号(或者空,但是中文标识符必须用双引号间隔,例如中文别名),例如 :
select "user_id" as "用户ID" from "temp_table" where name='张三';
hiveQL字符串用单引号或者双引号,标识符用反引号,例如:
select `user_id` as `用户ID` from `temp_table` where name="张三";
数字开头的标识符
presto中数字开头的标识符必须用双引号分隔,例如:
select * from "1_test";
字符串连接
presto 使用 || 做为字符串连接操作符:
select 'abc' || 'def';
强制类型转换
hiveQL 有隐式类型转换;presto必须使用强制类型转换,并且必须是标准类型(字符串使用varchar),例如:
SELECT CAST(x AS
) , CAST(x AS
) , CAST(x AS double) , CAST(x AS
) FROM ...
除法运算
hive中两个整数相除 7/2会得到3.5的结果,而presto中使用标准除法 7/2 = 3,因此需要做类型转换,将分子或者分母转换为double 型,例如:
SELECT CAST(5 AS DOUBLE) / 2
子查询使用
presto有两种使用子查询办法:
select * from
(select substr(name,1,3) as x from table1)
where x='foo';
或者
with a AS (select substr(name,1,3) as x from table1)
select * from a where x='foo';
为了避免某些用户的大查询,导致集群资源枯竭,presto支持划分队列,可以控制查询的并发量和可接收的SQL数量,可以针对用户、提交来源、Session等信息进行个性化配置。
队列的配置样例如下:
规则匹配条件如下:
匹配成功则被划分到满足条件的队列,如果有多个队列满足条件,默认选择第一个匹配上的。
现在公司内部正在使用的impala,也是基于MPP的查询引擎,presto对比impala有以下优缺点:
优点:
presto 不和 CDH绑定
支持多数据源,无需执行refresh 或者 invalidate metadata 来刷新元数据
完全java开发,后期方便维护和二次开发
目前主流互联网公司均使用presto做为大数据实时分析和即席查询引擎
缺点:
Coordinator存在单点故障
为了统一技术栈和后期维护的需要,我们正在考虑从impala过度到presto,欢迎有兴趣的同学来和我们一次交流。
出处:https://blog.csdn.net/qq_32616817/article/details/86512797
|