最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
开启左侧

[Presto] 大数据分布式查询引擎--presto

[复制链接]
发表于 2019-7-3 12:01:01 | 显示全部楼层 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

楼主热帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-4-19 04:42

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表