一、Presto的分布式框架
Presto 是一个开源的分布式 SQL 查询引擎,它被设计为用来专门进行高速、实时的数据分析,数据量支持GB到PB字节。它支持在线数据查询,包含Hive、Cassandra、关系数据库以及专有数据存储。它支持标准的ANSI SQL,包括复杂查询、聚合(aggregation)、连接(join)和窗口函数。下面的框架图展现了简化的Presto系统框架:
图1.1:Presto框架图
图角色及主要职责详细说明:
Client:客户端,发生用户SQL请求和接收Presto服务端的响应数据。
Coordinator: 协调员,接收客户端的SQL查询、检查SQL语法、分析和规划查询。
Parser/Analyzer: SQL语法的检查和分析。
Planner:查询规划。
Scheduler:将规划后的查询任务分配给离数据最近的子节点,并监控子节点执行过程。
Worker:子节点,执行Scheduler分配的任务。
Presto执行查询的整个流程如下图:
客户端通过http请求将查询SQL发生到Coordinator;由Coordinator调用Parser/Analyzer对预执行SQL进行语法检查和SQL分析,再由Planner进行SQL优化并生成查询计划。然后Scheduler将调度各个子节点执行查询计划。子节点根据Scheduler分配的角色完成查询计划。以以下SQL为例:
select c1.first_name, count(*)
from employees c1 join employees c2 on c1.emp_no=c2.emp_no
where c1.emp_no>10
group by c1.first_name limit 10;
整个SQL运行的流程图如下:
SQL执行过程
注:Scan Node、Fixed Node、Single Node都标示子节点即Worker。
二、Presto部署
准备安装包:
a、discovery-server.tar.gz
b、presto-server. tar.gz
c、presto-cli- executable.jar
步骤:
1、解压discovery-server.tar.gz得到含一个顶级目录discovery-server,我们把它叫做安装目录,在安装目录下新建子目录,命名为etc;切换到新建的etc目录下,新建文件config.properties、jvm.config、node.properties文件。三个文件分别编写以下内容:
config.properties:
http-server.http.port=8089 #discovery-server服务占用的端口号
jvm.config:
-server
-Xmx1G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
node.properties:
node.environment=presto #集群的名称,必须与presto集群的名称一致,可以自定义
node.id=ffffffff-0000-0000-0000-ffffffffffff #节点的唯一标示
node.data-dir=/home/ubuntu/presto/discovery-data #数据目录,该目录必须存在
进入安装目录下的bin目录,执行命令./ launcher run 启动discovery-server服务。
2、在master和work节点分别解压presto-server. tar.gz得到一个顶级目录presto-server,该目录也叫安装目录,在安装目录下新建etc目录。在这个etc目录中放入以下配置信息:
节点属性配置文件:node.properties #每个节点的环境配置信息
JVM 配置文件:jvm.config #JVM的命令行选项
配置属性配置文件:config.properties # Presto server的配置信息
日志配置文件:log.properties #运行日志配置
Catalog目录:Catalog目录 #数据源的配置信息
节点属性配置文件:etc/node.properties包含针对于每个节点的特定的配置信息。 一个节点就是在一台机器上安装的Presto实例。 这份配置文件一般情况下是在Presto第一次安装的时候,由部署系统创建的。 一个etc/node.properties配置文件至少包含如下配置信息:
node.environment=presto #集群名称, 所有在同一个集群中的Presto节点必须拥有相同的集群名称,且不需与discovery-server集群的名称保持一致。
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff #每个Presto节点的唯一标示。如果在一个节点上安装多个Presto实例,那么每个Presto节点必须拥有唯一的node.id。
node.data-dir=/var/presto/data #数据存储目录的位置(操作系统上的路径)。必须存在
JVM配置文件,etc/jvm.config:
-server
-Xmx16G
-XX:+UseConcMarkSweepGC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
config.properties:etc/config.properties包含了Presto server的所有配置信息。 每个Presto server既是一个coordinator也是一个worker。 但是在大型集群中,处于性能考虑,建议单独用一台机器作为 coordinator。
一个coordinator(master)的etc/config.properties应该至少包含以下信息:
coordinator=true #是否为master
node-scheduler.include-coordinator=false #是否允许在coordinator服务中进行调度工作
http-server.http.port=8080 #指定HTTP server的端口。
discovery-server.enabled=true
discovery.uri=192.168.0.110:8089 discovery-server的ip+端口号
以下是最基本的worker配置:
coordinator=false
http-server.http.port=8080
discovery.uri=192.168.0.110:8089
但是如果用一台机器进行测试,那么这一台机器将会即作为coordinator,也作为worker。配置文件将会如下所示:
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
discovery-server.enabled=true
discovery.uri=192.168.0.110:8089
log.properties:
com.facebook.presto=INFO
Catalog目录:
以连接oracle为例,在该目录下新建xxx. properties文件,文件加入以下内容:
connector.name=oracle
connection-url=jdbc:oracle:thin:@192.168.0.110:1540:orcl #url
connection-user=user #数据库连接用户名
connection-password=password #连接密码
切换到安装目录下的bin目录,执行./ launcher run(每个节点都需启动)。
3、解压将presto-cli- executable.jar重命名为presto使用 chmod +x 命令设置可执行权限,然后执行:
./presto --server localhost:8080 --catalog oracle --schema default