presto官网:Presto: Free, Open-Source SQL Query Engine for any Data


Presto简介:


Presto 是由 Facebook 开发的一个分布式 SQL 查询引擎, 它被设计为用来专门进行高速、实时的数据分


析。它的产生是为了解决 Hive 的 MapReduce 模型太慢以及不能通过 BI 或 Dashboards 直接展现 HDFS 数


据等问题。


Presto 是一个纯粹的纯内存的计算引擎,它不存储数据,其通过 Connector (类比 mr 中的 inputformat


组件)获取第三方 Storage 服务的数据 .


Ad-hoc (即席查询),期望查询时间秒级或几分钟


比 Hive 快 10 倍


支持多数据源,如 Hive 、 Kafka 、 MySQL 、 MonogoDB 、 Redis 、 JMX 等,也可自己实现 Connector


Client Protocol: HTTP+JSON, support various languages(Python, Ruby, PHP, Node.js Java)


支持 JDBC/ODBC 连接


ANSI SQL ,支持窗口函数, join ,聚合,复杂查询等


Presto 特点



Presto 是一个分布式的查询引擎,本身并不存储数据



presto 可以接入多种数据源,并且支持跨数据源查询(包括 hive 、 rmdb 、 kafka 等)。



一条 Presto 查询可以将多个数据源的数据进行合并分析



Presto 是一个 OLAP 的工具,擅长对海量数据进行复杂的分析;但是对于 OLTP 场景,并不是 Presto 所擅



长,所以不要把 Presto 当做数据库来使用



和大家熟悉的 Mysql 相比:



首先, Mysql 是一个数据库,具有存储和计算分析能力,而 Presto 只有计算分析能力;



其次,数据量方面, Mysql 作为传统单点关系型数据库不能满足当前大数据量的需求,于是有各种大数



据的存储和分析工具产生, Presto 就是这样一个可以满足大数据量分析计算需求的一个工具



Presto 数据管理模型



Presto 使用 Catalog 、 Schema 和 Table 这 3 层结构来管理数据。



Catalog: 就是数据源。 Hive 是数据源, Mysql 也是数据源, Hive 和 Mysql 都是数据源类型,可以连



接多个 Hive 和多个 Mysql ,每个连接都有一个名字。一个 Catalog 可以包含多个 Schema ,大家可以



通过 show catalogs 命令看到 Presto 连接的所有数据源。



Schema :相当于一个 “ 库 ” ,一个 Schema 包含多张数据表。



show schemas from 'catalog_xx' 可列出 catalog_xx 下的所有 schema 。



Table : “ 数据表 ” ,与一般意义上的数据库表相同。



show tables from 'catalog_xx.schema_yy' 可查看 catalog_xx.schema_yy 下所有表。


下载presto:


presto 原理


Master-Slave 架构


三个模块: Coordinator 、 Discovery Service 、 Worker


Connector


Presto 沿用了通用的 Master-Slave 架构, Coordinator 即 Presto 的 Master , Worker 即其 Slave ,


Discovery Service 就是用来保存 Worker 结点信息的,通过 HTTP 协议通信,而 Connector 用于获取第三


方存储的 Metadata 及原始数据等。


假如配置了 Hive Connector ,需要配置一个 Hive MetaStore 服务为 Presto 提供 Hive 元信息, Worker 节


点与 HDFS 交互读取数据。 Coordinator 负责解析 SQL 语句,生成执行计划,分发执行任务给 Worker 节点执行; Worker 节点负责实


际执行查询任务。 Worker 节点启动后向 Discovery Server 服务注册, Coordinator 从 Discovery Server 获


得可以正常工作的 Worker 节点


缺点



No fault tolerance ;当一个 Query 分发到多个 Worker 去执行时,当有一个 Worker 因为各种原因查



询失败,那么 Master 会感知到,整个 Query 也就查询失败了,而 Presto 并没有重试机制,所以需要



用户方实现重试机制。



Memory Limitations for aggregations, huge joins ;比如多表 join 需要很大的内存,由于 Presto 是



纯内存计算,所以当内存不够时, Presto 并不会将结果 dump 到磁盘上,所以查询也就失败了,但



最新版本的 Presto 已支持写磁盘操作,这个待后续测试和调研。



MPP(Massively Parallel Processing ) 架构;这个并不能说其是一个缺点,因为 MPP 架构就是解决



大量数据分析而产生的,但是其缺点也很明显,假如我们访问的是 Hive 数据源,如果其中一台



Worke 由于 load 问题,数据处理很慢,那么整个查询都会受到影响,因为上游需要等待上游结果



hive

和presto的区别


presto 最大 presto速度在多少_presto 最大



MapReduce 与 Presto 的执行过程的不同点, MR 每个操作要么需要写磁盘,要么需要等待前一个 stage 全


部完成才开始执行,而 Presto 将 SQL 转换为多个 stage ,每个 stage 又由多个 tasks 执行,每个 tasks 又将


分为多个 split 。所有的 task 是并行的方式进行, stage 之间数据是以 pipeline 形式流式的执行,数据之间


的传输也是通过网络以 Memory-to-Memory 的形式进行,没有磁盘 io 操作。这也是 Presto 性能比 Hive 快


很多倍的决定性原因




presto部署:


 里面有各种版本的presto  

https://repo1.maven.org/maven2/com/facebook/presto/presto-server/
例:
linux>wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.250/presto-server-0.250.tar.gz
linux>wget https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.250/presto-cli-0.250-executable.jar

解压到 mv 到  /opt/install/presto

linux>tar -xf presto-server-0.250.tar.gz
linux>mv presto-server-0.250 /opt/install/presto

创建目录:

linux>cd presto


linux>mkdir data
linux>mkdir etc

编辑配置文件

linux>cd etc
linux>vi jvm.config

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError


linux/etc>mkdir catalog
linux/etc>cd catalog

linux/catalog>vi hive.properties

connector.name=hive-hadoop2    #hive-hadoop2 名字是固定的
hive.metastore.uri=thrift://192.168.58.201:9083
hive.config.resources=/opt/install/hadoop/etc/hadoop/core-site.xml,/opt/install/hadoop/etc/hadoop/hdfs-site.xml

分发到其他节点

linux>scp -r presto/ 192.168.58.201:`pwd`
linux>scp -r presto/ 192.168.58.202:`pwd`

在 presto的etc 目录下编辑文件

主机1:192.168.58.200
linux>vi  node.properties

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/opt/install/presto/data

linux>vi config.properties

coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery-server.enabled=true
discovery.uri=http://192.168.58.200:8881

主机2:192.168.58.201
linux>vi  node.properties

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffe
node.data-dir=/opt/install/presto/data

linux>vi config.properties

coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://192.168.58.200:8881

主机3:192.168.58.202
linux>vi  node.properties

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-fffffffffffd
node.data-dir=/opt/install/presto/data

linux>vi config.properties
coordinator=false
http-server.http.port=8881
query.max-memory=50GB
discovery.uri=http://192.168.58.200:8881

启动 hive的服务  bin/hive --service metastore  (不行的话所有都启动)  因为 192.168.58.201 hive-site.xml 指定的是192.168.58.201 所以在这台上启动hive --service metastore

配置文件如下的hive:  vi   hive-site.xml

192.168.58.201>vi   hive-site.xml
<configuration>
        <property>
          <name>javax.jdo.option.ConnectionURL</name>
          <value>jdbc:mysql://nodefive:3306/hive?createDatabaseIfNotExist=true</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionDriverName</name>
          <value>com.mysql.jdbc.Driver</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionUserName</name>
          <value>root</value>
        </property>
        <property>
          <name>javax.jdo.option.ConnectionPassword</name>
          <value>12345</value>
        </property>
        <property>
     <name>hive.metastore.thrift.bind.host</name>
     <value>192.168.58.201</value>
    </property>
</configuration>

分别启动服务 :

进入presto运行
主机1:192.168.58.200
linux>bin/launcher run
主机2:192.168.58.201
linux>bin/launcher run
主机3:192.168.58.202
linux>bin/launcher run

presto 的客户端

linux>mv presto-cli-0.196-executable.jar prestocli
linux>chmod +x prestocli
进入客户端方法:
linux>./prestocli --catalog hive --schema default --server 192.168.58.200:8881 

linux>./prestocli --catalog hive --schema default --server 192.168.58.200:8881  --catalog hive --schema default

注:启动presto
 不加 --schema 的话就是全部数据库,查询时候需要用 数据库名.表名 的方式查询
例:
presto>select * from schema.table limit 100

进入后常用命令:
presto>show schemas查看数据库
presto>show tables from SchemaName; 查看 数据库的表
或者
presto>use SchemaName;
presto>show tables;  查看当下数据库下的所有表

注:命令跟hive差不多更多命令例子可参presto考官网
presto SQL应用官网:https://prestodb.io/docs/current/sql.html

presto SQL应用官网:https://prestodb.io/docs/current/sql.html

报错:

ERROR    main    com.facebook.presto.server.PrestoServer    Unable to create injector, see the following errors:

1) Error injecting constructor, java.io.IOException: java.io.IOException: Can not attach to current VM (try adding '-Djdk.attach.allowAttachSelf=true' to the JVM config)

presto 最大 presto速度在多少_大数据_02

 解决办法:编辑jvm.config 文件添加配置-Djdk.attach.allowAttachSelf=true后重启presto服务

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
-Djdk.attach.allowAttachSelf=true

打开浏览器输入地址192.168.58.200:8881即可访问UI

presto 最大 presto速度在多少_数据库_03