为什么要使用presto
不便之处
Hadoop:存储和计算(mr);mr编程太麻烦
Hive:使用sql语句,大大的简化了mr;hive将用户写的sql语句转换成mr代码,递给hadoop
缺点:
动不动起mr,耗时比较长
不建议更新和删除;
Hbase:强烈建议更新和删除;查询特别快,(CRUD);hbase有自己的命令和语法;
缺点:需要自己再学一套hbase的命令和语法;用hive来弥补了,可以使用sql语句来连接hbase;Phoniex:和hive是竞争对手;也提供了一个类似于sql语句的功能;
hive慢的问题
presto和impala(apache:http://impala.apache.org/)是竞争对手
官网:https://prestodb.github.io/;facebook
帮助手册:
架构图
Presto:不是数据库(不是mysql,)
概念:
Coordinator:大哥;namenode;
Worker:小弟;datanode
Data Sources:Hive,Mysql,
Connector:worker读取数据通过connector读取数据,数据存储在数据源上
下载:
- 实战训练
- 启动zookeeper集群
- 启动hadoop集群
- 启动hive
- 启动hbase
- 选择在node-1上操作
- 将presto-server-xx.tar.gz(presto-server-0.214.tar.gz)上传到服务器上(node-1)
- 所有的操作都在/data/presto下面
# 解压缩
tar -xzf presto-server-0.214.tar.gz
重命名
mv presto-server-0.214 presto-server
配置文件;(都放在了根目录下面的etc目录);
etc/node.properties
# 环境名称。集群中的所有Presto节点必须具有相同的环境名称。
node.environment=production
# 此Presto安装的唯一标识符不能重复
node.id=presto-1
# 数据目录的位置(文件系统路径)。Presto将在这里存储日志和其他数据。
node.data-dir=/data/presto/data
日志级别:etc/log.properties
com.facebook.presto=INFO
etc/jvm.config
-server
-Xmx5G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
etc/config.properties
# 允许这个Presto实例充当协调器;true:协调者,false:表示workers
coordinator=true
# 允许调度协调员的工作。对于较大的集群,对协调器的处理工作可能会影响查询性能,因为机器的资源无法用于调度、管理和监视查询执行的关键任务
node-scheduler.include-coordinator=true
# 指定HTTP服务器的端口。Presto使用HTTP进行所有内部和外部通信。
http-server.http.port=10002
# 查询可能使用的最大分布式内存量
query.max-memory=5GB
# 查询可在任何一台计算机上使用的最大用户内存量
query.max-memory-per-node=1GB
# 查询可在任何一台机器上使用的最大用户和系统内存量,其中系统内存是读取器、写入器和网络缓冲区等执行过程中使用的内存。
query.max-total-memory-per-node=2GB
# Presto使用发现服务查找集群中的所有节点。每个Presto实例将在启动时向DiscoveryService注册。为了简化部署和避免运行额外的服务,Presto协调器可以运行发现服务的嵌入式版本。它与Presto共享HTTP服务器,因此使用相同的端口。
discovery-server.enabled=true
# 访问地址;发现号服务器的URI
discovery.uri=http://node-1:10002
连接器;(connector);指定要链接的数据源
etc/catalog/hive.properties
# 参照网址:
# https://prestodb.github.io/docs/current/connector/hive.html
# 连接器的名字,是固定的,hive-hadoop2
connector.name=hive-hadoop2
# 连接hive服务器的地址
hive.metastore.uri=thrift://node-4:9083
# hadoop配置文件,根据需要可以写多个
hive.config.resources=/data/hadoop/hadoop/etc/hadoop/core-site.xml,/data/hadoop/hadoop/etc/hadoop/hdfs-site.xml
启动presto
守护进程
bin/launcher start
停止
bin/launcher stop
前端进程
bin/launcher run
网页:
装客户端:将presto-cli-0.214-executable.jar上传到node-1上;
重新修改名字,去掉版本号;
mv presto-cli-0.214-executable.jar presto-cli.jar
为此文件增加x权限
chmod +x presto-cli.jar
启动客户端命令
./presto-cli.jar --server node-1:10002 --catalog hive --schema default
启动一个客户端命令,连接上了hive;
- 客户端命令
客户端命令和hive的命令几乎一样
凡是修改的操作在hive上或者presto只执行一次就可以
hive和presto同时执行mr的对比;
所有只要hive启动mr的时候都慢的要死,presto快的要命;
presto支持的hive类型不是很好;(最好使用一些标准的类型);如:时间别使用;
时间的类型不匹配
hive好使,presto不好使
insert into psn_13 values (1,‘a’,‘2018-11-11 11:11:11’) ;
时间如此处理
insert into psn_13 values (1,‘a’,timestamp ‘2018-11-11 11:11:11’);
集群
先将presto拷贝到四台服务器上
修改配置文件:(etc/config.properties)
协调者:(etc/config.properties)
# 允许这个Presto实例充当协调器;true:协调者,false:表示workers
coordinator=true
# 允许调度协调员的工作。对于较大的集群,对协调器的处理工作可能会影响查询性能,因为机器的资源无法用于调度、管理和监视查询执行的关键任务
node-scheduler.include-coordinator=false
# 指定HTTP服务器的端口。Presto使用HTTP进行所有内部和外部通信。
http-server.http.port=10002
# 查询可能使用的最大分布式内存量
query.max-memory=5GB
# 查询可在任何一台计算机上使用的最大用户内存量
query.max-memory-per-node=1GB
# 查询可在任何一台机器上使用的最大用户和系统内存量,其中系统内存是读取器、写入器和网络缓冲区等执行过程中使用的内存。
query.max-total-memory-per-node=2GB
# Presto使用发现服务查找集群中的所有节点。每个Presto实例将在启动时向DiscoveryService注册。为了简化部署和避免运行额外的服务,Presto协调器可以运行发现服务的嵌入式版本。它与Presto共享HTTP服务器,因此使用相同的端口。
discovery-server.enabled=true
# 访问地址;发现号服务器的URI
discovery.uri=http://node-1:10002
Wokers:(etc/config.properties)
# 允许这个Presto实例充当协调器;true:协调者,false:表示workers
coordinator=false
# 指定HTTP服务器的端口。Presto使用HTTP进行所有内部和外部通信。
http-server.http.port=10002
# 查询可能使用的最大分布式内存量
query.max-memory=5GB
# 查询可在任何一台计算机上使用的最大用户内存量
query.max-memory-per-node=1GB
# 查询可在任何一台机器上使用的最大用户和系统内存量,其中系统内存是读取器、写入器和网络缓冲区等执行过程中使用的内存。
query.max-total-memory-per-node=2GB
# 访问地址;发现号服务器的URI
discovery.uri=http://node-1:10002
etc/node.properties
# 环境名称。集群中的所有Presto节点必须具有相同的环境名称。
node.environment=production
# 此Presto安装的唯一标识符不能重复
node.id=presto-1
# 数据目录的位置(文件系统路径)。Presto将在这里存储日志和其他数据。
node.data-dir=/data/presto/data
启动presto;(在协调者和workers上,三个一块启动)
presto理论知识
完全基于内存的并⾏计算;(配置文件中内存配置的比较大)
⽀持任意数据源(通过扩展式Connector组件),数据规模GB~PB级
使用的技术,如向量计算,动态编译执⾏计划,优化的ORC和Parquet Reader等
有向无环图(DAG);
presto不太支持存储过程,支持部分标准sql
存储过程:将一堆sql语句放到一个文件中,一块执行(有顺序,选择,循环)
sql语句–linux中的命令;存储过程–>linux sh文件
presto的查询速度比hive快5-10倍
适合:PB级海量数据复杂分析,交互式SQL查询,⽀持跨数据源查询
不适合:多个大表(记录比较多)的join操作,因为presto是基于内存的,多张大表在内存里可能放不下
和hive的对比:
hive是一个数据仓库,是一个交互式比较弱一点的查询引擎,交互式没有presto那么强,而且只能访问hdfs的数据
presto是一个交互式查询引擎,可以在很短的时间内返回查询结果,秒级,分钟级,能访问很多数据源
hive在查询100Gb级别的数据时,消耗时间已经是分钟级了
但是presto是取代不了hive的,因为p全部的数据都是在内存中,限制了在内存中的数据集大小,比如多个大表的join,这些大表是不能完全放进内存的,实际应用中,对于在presto的查询是有一定规定条件的,比比如说一个查询在presto查询超过30分钟,那就kill掉吧,说明不适合在presto上使用,主要原因是,查询过大的话,会占用整个集群的资源,这会导致你后续的查询是没有资源进行查询的,这跟presto的设计理念是冲突的,就像是你进行一个查询,但是要等个5分钟才有资源继续查询,这是很不合理的,交互式就变得弱了很多
为什么presto会那么的快
task是放在每个worker上该执行的,每个task执行完之后,数据是存放在内存里了,而不像mr要写磁盘,然后当多个task之间要进行数据交换,比如shuffle的时候,直接从内存里处理
Presto:内存计算,mpp架构
Druid:时序,数据放内存,索引,预计算
Spark SQL:基于Spark Core,mpp架构
Kylin:Cube预计算
对于presto的容错,如果某个worker挂掉了,discovery server会发现并通知coordinator
但是对于一个query,是没有容错的,一旦一个work挂了,那么整个qurey就是败了(重新计算)
因为对于presto,他的查询时间是很短的,与其查询这里做容错能力,不如重新执行来的快来的简单
优化
参照:https://blog.csdn.net/freefishly/article/details/79081764
使用presto:
现有的数据量超级大:(至少上PB)
增长量:每天增加1T;
Presto:只有两台;几十台;
-
Jdbc
java链接presto
参照网址:http://prestodb.github.io/docs/current/installation/jdbc.html
需要下载jdbc连接presto的jar包;
测试代码:
package com.jinghangzz.presto.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* java通过jdbc连接presto
* @author Administrator
*/
public class JdbcDemo
{
public static void main(String[] args)
{
String driver = "com.facebook.presto.jdbc.PrestoDriver" ;
/* jdbc:presto://host:port/catalog/schema */
String url = "jdbc:presto://node-1:10002/hive/mydata";
/* 用户名随便写,不能为空 */
String user = "test";
String password = "";
/* 查询所有的朝代 */
String sql = "select * from a_dynasty" ;
/*
* JDBC:四步走
* 加载驱动
* 获取链接
* 操作数据库
* 关闭链接(注意顺序)
* */
Connection connection = null ;
/* 占位符:? */
PreparedStatement ps = null ;
ResultSet rs = null ;
try
{
/* 加载驱动 */
Class.forName(driver);
/* 获取链接 */
connection = DriverManager.getConnection(url, user, password);
/* 准备一个sql语句 */
ps = connection.prepareStatement(sql);
/* 为占位符赋值 */
/* 执行sql语句
* cud:executeUpate
* r:executeQuery
* ctrl + 1
* */
rs = ps.executeQuery();
System.out.println("==结果==");
/* 取数据:
* 1条,使用if
* 多条使用while */
while(rs.next())
{
/* 取值 */
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + "====>" + name);
}
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
} finally
{
/* 注意顺序 */
try
{
if(rs != null)
{
rs.close();
rs = null ;
}
} catch (SQLException e)
{
e.printStackTrace();
}
try
{
if(ps != null)
{
ps.close();
ps = null ;
}
} catch (SQLException e)
{
e.printStackTrace();
}
try
{
if(connection != null)
{
connection.close();
connection = null ;
}
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
Presto(快)–>Hive(Sql,慢)–>Hbase(最麻烦的)
presto可以链接谁?
-
Presto–hbase
Presto:0.214不支持;
-
配置
最全的配置在哪?
https://prestodb.github.io/docs/current/admin/properties.html