一、什么是presto及体系架构
Presto与hbase的架构特别相似。都是主从架构思想。由于我们使用的hive只是把sql语句翻译成MapReduce,然后再交给yarn去执行,我们都知道,yarn执行过程中,会产生数据落地,进而影响效率。因此我们通常用presto与hive做一个集成,presto是完全内存计算,presto集成hive就是去hive中元数据,当presto拿到hive的所有元数据后,就是拿到所有的表在hdfs的存储位置,进而基于内存运算的数据源就是在hdfs上。
Presto查询引擎是一个主从的架构,由一个Coordinator(调解员/主节点)节点,coordinator在启动的时候会启动一个内嵌的发现服务(Discovery Server),coordinator可以通过个发现服务知道有多少worker节点,而worker节点可以通过这个发现服务知道coordinator是谁,Discovery Server通常内嵌于Coordinator节点中。Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行。Worker节点负责实际执行查询任务。Worker节点启动后向Discovery Server服务注册,Coordinator从Discovery Server获得可以正常工作的Worker节点。如果配置了Hive Connector,需要配置一个Hive MetaStore服务为Presto提供Hive元信息,Worker节点与HDFS交互读取数据。
二、presto执行查询过程
流水线工作方式
用户使用Presto Cli提交一个查询语句后,Cli使用HTTP协议与Coordinator通信,Coordinator收到查询请求后调用SqlParser解析SQL语句得到Statement对象,并将Statement封装成一个QueryStarter对象放入线程池中等待执行。
Presto SQL的执行流程如下图所示
- 1、Cli通过HTTP协议提交SQL查询之后,查询请求封装成一个SqlQueryExecution对象交给Coordinator的SqlQueryManager#queryExecutor线程池去执行
- 2、每个SqlQueryExecution线程(图中Q-X线程)启动后对查询请求的SQL进行语法解析和优化并最终生成多个Stage的SqlStageExecution任务,==每个SqlStageExecution任务仍然交给同样的线程池去执行。==是不是说明,每个sqlstageexecution包含多个任务。
- 3、每个SqlStageExecution线程(图中S-X线程)启动后每个Stage的任务按PlanDistribution属性构造一个或者多个RemoteTask通过HTTP协议分配给远端的Worker节点执行
- 4、Worker节点接收到RemoteTask请求之后,启动一个SqlTaskExecution线程(图中T-X线程)将这个任务的每个Split包装成一个PrioritizedSplitRunner任务(图中SR-X)交给Worker节点的TaskExecutor#executor线程池去执行
这个执行过程和spark有点相似。只不过presto是基于流水线执行,所有资源事先分配好,又有点和Strom相似。
三、安装与使用presto
1、解压
tar -zxvf presto-server-0.217.tar.gz
2、创建一个目录
mkdir etc ----> 保存所有的配置文件
并且我们将配置一下文件
① Node Properties: 节点的配置信息
② JVM Config: 命令行工具的JVM配置参数
③ Config Properties: Presto Server的配置参数
④ Catalog Properties: 数据源(Connectors)的配置参数
⑤ Log Properties:日志参数配置
3、vi node.properties
#集群名称。所有在同一个集群中的Presto节点必须拥有相同的集群名称。
node.environment=production
#每个Presto节点的唯一标示。每个节点的node.id都必须是唯一的。在Presto进行重启或者升级过程中每个节点的node.id必须保持不变。如果在一个节点上安装多个Presto实例(例如:在同一台机器上安装多个Presto节点),那么每个Presto节点必须拥有唯一的node.id。
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
# 数据存储目录的位置(操作系统上的路径)。Presto将会把日期和数据存储在这个目录下。
node.data-dir=/usr/local/presto/presto-server-0.217/data
4、vi jvm.config
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
5、vi config.properties
5.1、单节点配置
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
#找到主节点的位置
discovery.uri=http://192.168.92.111:8080
5.2、集群配置
- coordinator的配置
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
#主节点地址
discovery.uri=http://192.168.92.111:8080
- workers配置
coordinator=false
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
#主节点
discovery.uri=http://192.168.92.111:8080
6、vi log.properties
com.facebook.presto=INFO
7、vi hive.properties
集成Hive:创建catalog
mkdir /usr/local/presto/presto-server-0.217/etc/catalog
#注明hadoop的版本
connector.name=hive-hadoop2
#hive-site中配置的地址
hive.metastore.uri=thrift://192.168.92.111:9083
#hadoop的配置文件路径
hive.config.resources=/usr/local/hadoop/hadoop-3.1.2/etc/hadoop/core-site.xml,/usr/local/hadoop/hadoop-3.1.2/etc/hadoop/hdfs-site.xml
==注意:==要访问Hive的话,需要将Hive的MetaStore启动:hive --service metastore,并且MySQL也要启动,因为hive的元信息保存在MySQL上面。
8、启动Presto Server
在home目录下
bin/launcher start
9、运行presto-cli
下载:presto-cli-0.217-executable.jar
重命名jar包,并增加执行权限
cp presto-cli-0.217-executable.jar presto
chmod a+x presto
连接Presto Server
./presto --server localhost:8080 --catalog hive --schema default
之后的操作是sql语句。