presto的概况
Presto性质
分布式的SQL查询引擎,专门告诉实时的分析数据,他的产生解决了,hive的mr程序模型太慢
不能通过BI或者Dashboards直接展现HDFS数据等问题.
Presto是一个纯粹的内存计算引擎,不储存数据,通过Connector(类比mr中的inputformat组件)
获取第三方的储存服务数据.
Presto优点
1.ad_hoc(即席查询)期望查询时间秒级,
2.比hive快10倍
3.支持多种数据源,入hive,kafka,mysql,monogoDB,redis,jmx等等也可以自己实现连接
4.支持多种语言协议Python,Ruby,PHP,Node,jsJava.
5.支持jdbc/odbc连接
6.ANSI SQL,支持窗口函数,join,聚合,复杂查询等.
7.一条presto查询可以将多个数据源的数据源进行合并分析
8.presto是一个OLAP的工具,擅长对海量数据进行复杂的分析
Preso和Mysql比较
mysql是以个数据库,具有储存能力和计算分析能力,传统单点关系型数据库不能满足当前大数据量的需求.
presto只有计算分析能力,可以满足大量数据的分许计算.
Presto的优势
低延迟,高并发,相比hive,执行效率要高很多.
一个复杂的查询,hive要用十几秒,presto只用不到一秒.
Presto数据管理模型
presto使用catalog,schema和table这三层结构来管理数据.
catalog:就是数据源,hive,mysql都是数据源,可以连接多个hive和多个mysql,一个catalog可以包含多个schema
命令show catalogs命令看到presto连接的所有数据源.
schema相当于一个"库",一个schema包含多张数据表
命令show schemas from 'catalog_xx’可以列出catalog_xx,schema_yy下的所有表.
Table:"数据库"与一般的数据库表相同
命令show table from 'catalog_xx,schema_yy’可以查看catalog_xx,schema_yy下的所有表.
presto中定位一张表的全名,为数据源,数据库,数据表
例如:hive.db1.test,//hive(satalog)下的db1(schema)中test(表table).
Presto和hive比较
hive储存:借助外部储存,最主要的是hdfs
hvie计算:借助外部计算框架mr程序,spark程序,tez程序
presto储存:借助外部储存,而且可以在一条SQL中,综合多个数据源
presto计算:有自己内部实现的分布式计算机制,计算节点是常驻进程,计算过程尽量利用内存.
总结:presto比hive的速度快很多,能做到比较完美的近实时数据查询分析;
presto接入方式
以hive数据源为例,在中端输入:
[root@doit02 presto-server-0.229]#./presto-cli.jar --server doit01:9200 --catalog hive --user xx --source 'pf=adhoc;client=cli'
--server 是presto服务地址;
--catalog 是默认使用哪个数据源,后面也可以切换;
--user 是用户名;
--source 是代表查询来源,source设置格式为key=value形式(英文分号分割); 例如个人从command line查询应设置为pf=adhoc;client=cli。
进入终端后
查看数据源: show catalog;
查看数据库实例: show schemas;
presto执行速度快的原因
mr程序:每一个操作都需要写磁盘,一个stage(阶段)执行完才开始下一个stage,
presto:将SQL转换为多个stage,每一个stage又由多个task执行,所有的task都是并行的方式执行,
速度快的根本原因:数据之间的传输也是以pipeline形式流式的执行,通过memory-to-memory的形式进行的,没有io磁盘操作,
presto的缺点
1.no fault tolerance:不容错
2.Memory Limitations for aggregations, huge joins;对于运行内存有限制
3.MPP(Massively Parallel Processing )并行下游要等上游结果.
presto安装部署
官网"https://prestodb.io/
下载,解压,配置文件,配置hive数据源,配置mysql数据源,配置kafka两个格式csv和json数据源(比较复杂)
presto实战:
启动presto
1.启动hive元数据服务
[root@doit02 hive-2.3.1]# bin/hive --service metastore
2.启动presto的coordinator(协调器)
[root@doit02 presto-server-0.229]# bin/launcher start
3.启动presto的worker
[root@doitX presto-server-0.229]# bin/launcher start
访问web端口:http://doit02:8083/ui/
下载客户端jar包:https://prestodb.io/download.html
第一种方式启动presto客户端
下载客户端jar包在linux端运行
[root@doit02 presto-server-0.229]# ./presto-cli --server doit02:8083 --catalog hive --schema doit12
presto>use hive.yiee_dw//进入到hive中yiee_dw的工作
presto:yiee_dw>show tables;//列出这个库中所有的表
presto:yiee_dw>正常的hive select 语句
第二种方法JDBC客户端使用
就是在spark中导入依赖然后写spark程序连接元数据,
1.首先导入依赖
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.229</version>
</dependency>
2.连接的参数
// properties参数方式
String url = "jdbc:presto://h1:8080/hive/yiee_dw";
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("SSL", "false");
Connection connection = DriverManager.getConnection(url, properties);
// URL参数方式
String url = "jdbc:presto://example.net:8080/hive/sales?user=test&password=secret&SSL=true";
Connection connection = DriverManager.getConnection(url);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
int amt1 = rs.getInt(1);
}