虽然Presto能够解析SQL,但它不是一个标准的数据库。不是MySQL、PostgreSQL或者Oracle的代替品,也不能用来处理在线事务(OLTP)html
Presto经过使用分布式查询,能够快速高效的完成海量数据的查询。做为Hive和Pig的替代者,Presto不只能访问HDFS,也能访问不一样的数据源,包括:RDBMS和其余数据源(如Cassandra)。node
图中各个组件的概念及做用会在下文讲述。mysql
使用内存计算,减小与硬盘交互。web
1.Presto与hive对比,都可以处理PB级别的海量数据分析,但Presto是基于内存运算,减小不必的硬盘IO,因此更快。
2.可以链接多个数据源,跨数据源连表查,如从hive查询大量网站访问记录,而后从mysql中匹配出设备信息。
3.部署也比hive简单,由于hive是基于HDFS的,须要先部署HDFS。sql
1.虽然可以处理PB级别的海量数据分析,但不是表明Presto把PB级别都放在内存中计算的。而是根据场景,如count,avg等聚合运算,是边读数据边计算,再清内存,再读数据再计算,这种耗的内存并不高。可是连表查,就可能产生大量的临时数据,所以速度会变慢,反而hive此时会更擅长。
2.为了达到实时查询,可能会想到用它直连MySql来操做查询,这效率并不会提高,瓶颈依然在MySql,此时还引入网络瓶颈,因此会比本来直接操做数据库要慢。shell
Presto有两类服务器:coordinator和worker。数据库
Coordinator服务器是用来解析语句,执行计划分析和管理Presto的worker结点。Presto安装必须有一个Coordinator和多个worker。若是用于开发环境和测试,则一个Presto实例能够同时担任这两个角色。 bash
Coordinator跟踪每一个work的活动状况并协调查询语句的执行。 Coordinator为每一个查询创建模型,模型包含多个stage,每一个stage再转为task分发到不一样的worker上执行。服务器
Coordinator与Worker、client通讯是经过REST API。网络
Worker是负责执行任务和处理数据。Worker从connector获取数据。Worker之间会交换中间数据。Coordinator是负责从Worker获取结果并返回最终结果给client。
当Worker启动时,会广播本身去发现 Coordinator,并告知 Coordinator它是可用,随时能够接受task。
Worker与Coordinator、Worker通讯是经过REST API。
贯穿全文,你会看到一些术语:connector、catelog、schema和table。这些是Presto特定的数据源
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集群。
一个Catelog包含Schema和Connector。例如,你配置JMX的catelog,经过JXM Connector访问JXM信息。当你执行一条SQL语句时,能够同时运行在多个catelog。
Presto处理table时,是经过表的彻底限定(fully-qualified)名来找到catelog。例如,一个表的权限定名是hive.test_data.test,则test是表名,test_data是schema,hive是catelog。
Catelog的定义文件是在Presto的配置目录中。
Schema是用于组织table。把catelog好schema结合在一块儿来包含一组的表。当经过Presto访问hive或Mysq时,一个schema会同时转为hive和mysql的同等概念。
Table跟关系型的表定义同样,但数据和表的映射是交给Connector。
Presto执行ANSI兼容的SQL语句。当Presto提起语句时,指的就是ANSI标准的SQL语句,包含着列名、表达式和谓词。
之因此要把语句和查询分开说,是由于Presto里,语句知识简单的文本SQL语句。而当语句执行时,Presto则会建立查询和分布式查询计划并在Worker上运行。
当Presto解析一个语句时,它将其转换为一个查询,并建立一个分布式查询计划(多个互信链接的stage,运行在Worker上)。若是想获取Presto的查询状况,则获取每一个组件(正在执行这语句的结点)的快照。
查询和语句的区别是,语句是存SQL文本,而查询是配置和实例化的组件。一个查询包含:stage、task、split、connector、其余组件和数据源。
当Presto执行查询时,会将执行拆分为有层次结构的stage。例如,从hive中的10亿行数据中聚合数据,此时会建立一个用于聚合的根stage,用于聚合其余stage的数据。
层次结构的stage相似一棵树。每一个查询都由一个根stage,用于聚合其余stage的数据。stage是Coordinator的分布式查询计划(distributed query plan)的模型,stage不是在worker上运行。
因为stage不是在worker上运行。stage又会被分为多个task,在不一样的work上执行。
Task是Presto结构里是“work horse”。一个分布式查询计划会被拆分为多个stage,并再转为task,而后task就运行或处理split。Task有输入和输出,一个stage能够分为多个并行执行的task,一个task能够分为多个并行执行的driver。
Task运行在split上。split是一个大数据集合中的一块。分布式查询计划最底层的stage是经过split从connector上获取数据,分布式查询计划中间层或顶层则是从它们下层的stage获取数据。
Presto调度查询,coordinator跟踪每一个机器运行什么任务,那些split正在被处理。
Task包含一个或多个并行的driver。Driver在数据上处理,并生成输出,而后由Task聚合,最后传送给stage的其余task。一个driver是Operator的序列。driver是Presto最最低层的并行机制。一个driver有一个输出和一个输入。
Operator消费,传送和生产数据。如一个Operator从connector中扫表获取数据,而后生产数据给其余Operator消费。一个过滤Operator消费数据,并应用谓词,最后生产出子集数据。
Exchange在Presto结点的不一样stage之间传送数据。Task生产和消费数据是经过Exchange客户端。
参考:https://prestodb.io/docs/curr...
1.下载
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.200/presto-server-0.200.tar.gz
2.解压
tar -zxvf presto-server-0.200.tar.gz -C /usr/local/
/usr/local/presto-server-0.200则为安装目录,另外Presto还须要数据目录,数据目录最好不要在安装目录里面,方便后面Presto的版本升级。
在安装目录里建立etc目录。这目录会有如下配置:
结点属性文件etc/node.properties,包含每一个结点的配置。一个结点是一个Presto实例。这文件通常是在Presto第一次安装时建立的。如下是最小配置:
node.environment=production node.id=ffffffff-ffff-ffff-ffff-ffffffffffff node.data-dir=/var/presto/data
node.environment: 环境名字,Presto集群中的结点的环境名字都必须是同样的。
node.id: 惟一标识,每一个结点的标识都必须是为一的。就算重启或升级Presto都必须还保持原来的标识。
node.data-dir: 数据目录,Presto用它来保存log和其余数据。
JVM配置文件etc/jvm.config,包含启动Java虚拟机时的命令行选项。格式是每一行是一个命令行选项。此文件数据是由shell解析,因此选项中包含空格或特殊字符会被忽略。
如下是参考配置:
-server -Xmx16G -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError
由于OutOfMemoryError会致使JVM存在不一致状态,因此用heap dump来debug,来找出进程为何崩溃的缘由。
配置属性文件etc/config.properties,包含Presto server的配置。Presto server能够同时为coordinator和worker,但一个大集群里最好就是只指定一台机器为coordinator。
如下是coordinator的最小配置:
coordinator=true node-scheduler.include-coordinator=false http-server.http.port=8080 query.max-memory=50GB query.max-memory-per-node=1GB discovery-server.enabled=true discovery.uri=http://example.net:8080
如下是worker的最小配置:
coordinator=false http-server.http.port=8080 query.max-memory=50GB query.max-memory-per-node=1GB discovery.uri=http://example.net:8080
若是适用于测试目的,须要将一台机器同时配置为coordinator和worker,则使用如下配置:
coordinator=true node-scheduler.include-coordinator=true http-server.http.port=8080 query.max-memory=5GB query.max-memory-per-node=1GB discovery-server.enabled=true discovery.uri=http://example.net:8080
coordinator: 是否运行该实例为coordinator(接受client的查询和管理查询执行)。
node-scheduler.include-coordinator:coordinator是否也做为work。对于大型集群来讲,在coordinator里作worker的工做会影响查询性能。
http-server.http.port:指定HTTP端口。Presto使用HTTP来与外部和内部进行交流。
query.max-memory: 查询能用到的最大总内存
query.max-memory-per-node: 查询能用到的最大单结点内存
discovery-server.enabled: Presto使用Discovery服务去找到集群中的全部结点。每一个Presto实例在启动时都会在Discovery服务里注册。这样能够简化部署,不须要额外的服务,Presto的coordinator内置一个Discovery服务。也是使用HTTP端口。
discovery.uri: Discovery服务的URI。将example.net:8080替换为coordinator的host和端口。这个URI不能以斜杠结尾,这个错误需特别注意,否则会报404错误。
另外还有如下属性:
jmx.rmiregistry.port: 指定JMX RMI的注册。JMX client能够链接此端口
jmx.rmiserver.port: 指定JXM RMI的服务器。可经过JMX监听。
详情请查看Resource Groups
Presto经过connector访问数据。而connector是挂载(mount)在catelog中。connector支持catelog里全部的schema和table。举个例子,Hive connector映射每一个Hive数据库到schema,所以Hive connector挂载在hive catelog(因此能够把catelog理解为目录,挂载),并且Hive包含table clicks在数据库web,因此这个table在Presto是hive.web.clicks。
Catalog的注册是经过etc/catalog目录下的catalog属性文件。例如,建立etc/catalog/jmx.properties,将jmxconnector挂载在jmx catelog:
connector.name=jmx
查看Connectors查看更多信息。
启动命令:
bin/launcher start
日志在val/log目录下:
launcher.log: 记录服务初始化状况和一些JVM的诊断。
server.log: Presto的主要日志文件。会自动被压缩。
http-request.log: 记录HTTP请求。会自动被压缩。
1.下载 presto-cli-0.200-executable.jar,
2.修更名字 presto-cli-0.200-executable.jar为 presto
3.修改执行权限chmod +x
4.运行
./presto --server localhost:8080 --catalog hive --schema default