presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

时间:2024-03-23 11:56:42

为什么要使用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单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
帮助手册:
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
架构图
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

Presto:不是数据库(不是mysql,)
概念:
Coordinator:大哥;namenode;
Worker:小弟;datanode
Data Sources:Hive,Mysql,
Connector:worker读取数据通过connector读取数据,数据存储在数据源上

下载:
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

  • 实战训练
  • 启动zookeeper集群
  • 启动hadoop集群
  • 启动hive
  • 启动hbase
  • 选择在node-1上操作
  • 将presto-server-xx.tar.gz(presto-server-0.214.tar.gz)上传到服务器上(node-1)
  • 所有的操作都在/data/presto下面
    presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
    # 解压缩
tar -xzf presto-server-0.214.tar.gz

重命名

mv presto-server-0.214 presto-server

presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
配置文件;(都放在了根目录下面的etc目录);
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
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单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

网页:

http://node-1:10002/ui/
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

装客户端:将presto-cli-0.214-executable.jar上传到node-1上;

presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

重新修改名字,去掉版本号;

mv presto-cli-0.214-executable.jar presto-cli.jar
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

为此文件增加x权限

chmod +x presto-cli.jar
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

启动客户端命令

./presto-cli.jar --server node-1:10002 --catalog hive --schema default
启动一个客户端命令,连接上了hive;

  • 客户端命令

客户端命令和hive的命令几乎一样
凡是修改的操作在hive上或者presto只执行一次就可以
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

hive和presto同时执行mr的对比;

presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
所有只要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单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

集群

presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
先将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单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
启动presto;(在协调者和workers上,三个一块启动)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

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单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

为什么presto会那么的快

presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接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:只有两台;几十台;

presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

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单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)

Presto(快)–>Hive(Sql,慢)–>Hbase(最麻烦的)

presto可以链接谁?
presto单机版和集群版-介绍+配置以及操作(presto和hive的对+java连接presto,)