1,Presto基本认识
1.1 定义
Presto是一个分布式的查询引擎,本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析;但是对于OLTP场景,并不是Presto所擅长,所以不要把Presto当做数据库来使用。
和大家熟悉的Mysql相比:首先Mysql是一个数据库,具有存储和计算分析能力,而Presto只有计算分析能力;其次数据量方面,Mysql作为传统单点关系型数据库不能满足当前大数据量的需求,于是有各种大数据的存储和分析工具产生,Presto就是这样一个可以满足大数据量分析计算需求的一个工具。
1.2 数据源
Presto需要从其他数据源获取数据来进行运算分析,它可以连接多种数据源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等
一条Presto查询可以将多个数据源的数据进行合并分析。
比如:select * from a join b where a.id=b.id;,其中表a可以来自Hive,表b可以来自Mysql。
1.3 优势
Presto是一个低延迟高并发的内存计算引擎,相比Hive,执行效率要高很多。
举例:
SELECT id,
name,
source_type,
created_at
FROM dw_dwb.dwb_user_day
WHERE dt='2018-06-03'
AND created_at>’2018-05-20’;
上述SQL在Presto运行时间不到1秒钟,在Hive里要几十秒钟。
1.4数据模型
Presto使用Catalog、Schema和Table这3层结构来管理数据。
---- Catalog:就是数据源。Hive是数据源,Mysql也是数据源,Hive 和Mysql都是数据源类型,可以连接多个Hive和多个Mysql,每个连接都有一个名字。一个Catalog可以包含多个Schema,大家可以通过show catalogs 命令看到Presto连接的所有数据源。
---- Schema:相当于一个数据库实例,一个Schema包含多张数据表。show schemas from 'catalog_name'可列出catalog_name下的所有schema。
---- Table:数据表,与一般意义上的数据库表相同。show tables from 'catalog_name.schema_name'可查看'catalog_name.schema_name'下的所有表。
在Presto中定位一张表,一般是catalog为根,例如:一张表的全称为 hive.test_data.test,标识 hive(catalog)下的 test_data(schema)中test表。
可以简理解为:数据源的大类.数据库.数据表。
Connector:
Connector是适配器,用于Presto和数据源(如Hive、RDBMS)的连接。你可以认为类似JDBC那样,但却是Presto的SPI的实现,使用标准的API来与不同的数据源交互。
Presto有几个内建Connector:JMX的Connector、System Connector(用于访问内建的System table)、Hive的Connector、TPCH(用于TPC-H基准数据)。还有很多第三方的Connector,所以Presto可以访问不同数据源的数据。
每个catalog都有一个特定的Connector。如果你使用catelog配置文件,你会发现每个文件都必须包含connector.name属性,用于指定catelog管理器(创建特定的Connector使用)。一个或多个catelog用同样的connector是访问同样的数据库。例如,你有两个Hive集群。你可以在一个Presto集群上配置两个catelog,两个catelog都是用Hive Connector,从而达到可以查询两个Hive集群。
2,Presto与Hive
Hive是一个基于HDFS(分布式文件系统)的一个数据库,具有存储和分析计算能力, 支持大数据量的存储和查询。Hive 作为数据源,结合Presto分布式查询引擎,这样大数据量的查询计算速度就会快很多。
Presto支持标准SQL,这里需要提醒大家的是,在使用Hive数据源的时候,如果表是分区表,一定要添加分区过滤,不加分区扫描全表是一个很暴力的操作,执行效率低下并且占用大量集群资源,大家尽量避免这种写法。
这里提到Hive分区,我简单介绍一下概念。Hive分区就是分目录,把一个大的数据集根据业务需要分割成更细的数据集。
举例:假如一个表的数据都放在/user/xiaoming/table/目录下,如果想把数据按照每天的数据细分,则就变成/user/xiaoming/table/2018-06-01/,/user/xiaoming/table/2018-06-02/,……如果查询某一天的数据,就可以直接取某一天目录下的数据,不需要扫描其他天的数据,节省了时间和资源。
使用Presto:
3,Presto接入方式
Presto的接入方式有多种:presto-cli,pyhive,jdbc,http,golang,SQLAlchemy,PHP等,其中presto-cli是Presto官方提供的,下面以presto-cli为例展开说明(自行下载)。
以连接hive数据源为例,在电脑终端输入:./presto --server presto.xxx-apps.com:9200 --catalog hive --user xxxx --source 'pf=adhoc;client=cli'就可以进入presto终端界面。
先解释下各参数的含义:
--server 是presto服务地址;
--catalog 是默认使用哪个数据源,后面也可以切换,如果想连接mysql数据源,使用mysql数据源名称即可;
--user 是用户名;
--source 是代表查询来源,source设置格式为key=value形式(英文分号分割); 例如个人从command line查询应设置为pf=adhoc;client=cli。
进入终端后:
查看数据源: show catalogs;
查看数据库实例:show schemas;
Presto使用手册:https://prestodb.io/docs/current/
4.Presto组件
Presto是一个运行在多台服务器上的分布式系统。 完整安装包括一个coordinator和多个worker。 由客户端提交查询,从Presto命令行CLI提交到coordinator。 coordinator进行解析,分析并执行查询计划,然后分发处理队列到worker。
Coordinator:
Coordinator服务器是用来解析语句,执行计划分析和管理Presto的worker结点。Presto安装必须有一个Coordinator和多个worker。
Coordinator跟踪每个work的活动情况并协调查询语句的执行。 Coordinator为每个查询建立模型,模型包含多个stage,每个stage再转为task分发到不同的worker上执行。
Coordinator与Worker、client通信是通过REST API。
Worker:
Worker是负责执行任务和处理数据。Worker从connector获取数据。Worker之间会交换中间数据。Coordinator是负责从Worker获取结果并返回最终结果给client。
当Worker启动时,会广播自己去发现 Coordinator,并告知 Coordinator它是可用,随时可以接受task。
Worker与Coordinator、Worker通信是通过REST API。
5.执行查询的模型(Query Execution Model)
语句(Statement)
Presto执行ANSI兼容的SQL语句。当Presto提起语句时,指的就是ANSI标准的SQL语句,包含着列名、表达式和谓词。
之所以要把语句和查询分开说,是因为Presto里,语句只是简单的文本SQL语句。而当语句执行时,Presto则会创建查询和分布式查询计划并在Worker上运行。
查询(Query)
当Presto解析一个语句时,它将其转换为一个查询,并创建一个分布式查询计划(多个互信连接的stage,运行在Worker上)。如果想获取Presto的查询情况,则获取每个组件(正在执行这语句的结点)的快照。
查询和语句的区别是,语句是存SQL文本,而查询是配置和实例化的组件。一个查询包含:stage、task、split、connector、其他组件和数据源。
Stage
当Presto执行查询时,会将执行拆分为有层次结构的stage。例如,从hive中的10亿行数据中聚合数据,此时会创建一个用于聚合的根stage,用于聚合其他stage的数据。
层次结构的stage类似一棵树。每个查询都由一个根stage,用于聚合其他stage的数据。stage是Coordinator的分布式查询计划(distributed query plan)的模型,stage不是在worker上运行。
Task
由于stage不是在worker上运行。stage又会被分为多个task,在不同的work上执行。
Task是Presto结构里是“work horse”。一个分布式查询计划会被拆分为多个stage,并再转为task,然后task就运行或处理split。Task有输入和输出,一个stage可以分为多个并行执行的task,一个task可以分为多个并行执行的driver。
Split
Task运行在split上。split是一个大数据集合中的一块。分布式查询计划最底层的stage是通过split从connector上获取数据,分布式查询计划中间层或顶层则是从它们下层的stage获取数据。
Presto调度查询,coordinator跟踪每个机器运行什么任务,那些split正在被处理。
Driver
Task包含一个或多个并行的driver。Driver在数据上处理,并生成输出,然后由Task聚合,最后传送给stage的其他task。一个driver是Operator的序列。driver是Presto最最低层的并行机制。一个driver有一个输出和一个输入。
Operator
Operator消费,传送和生产数据。如一个Operator从connector中扫表获取数据,然后生产数据给其他Operator消费。一个过滤Operator消费数据,并应用谓词,最后生产出子集数据。
Exchange
Exchange在Presto结点的不同stage之间传送数据。Task生产和消费数据是通过Exchange客户端。
参考:https://prestodb.io/docs/curr...
问答:
1.使用场景?
-mysql跨数据库查询;-数仓的表数据查询(数据分析) ...
2.为什么presto查询速度比Hive快?
presto是常驻任务,接受请求立即执行,全内存并行计算;hive需要用yarn做资源调度,接受查询需要先申请资源,启动进程,并且中间结果会经过磁盘。
Impala也可以支持多种数据源,读者可自行查阅资料
阅读(9349) | 评论(0) | 转发(0) |