- 1. presto简介及架构
- 1.1. 简介
- 1.2. 架构模型
- 1.3. 数据模型
- 2. presto安装部署
- 2.1. 下载相关包
- 2.2. 解压下载的tar包
- 2.3. 配置文件
- 2.3.1. 节点属性
- 2.3.2. JVM Config
- 2.3.3. 配置属性
- 2.3.4. 连接目录属性
- 2.4. 启动presto
- 2.5. 命令行界面
- 3. presto Hbase Connector开发
- 3.1. 方案概况
- 3.2. 开发及使用
Presto是一个facebook开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。presto的架构由关系型数据库的架构演化而来。presto之所以能在各个内存计算型数据库中脱颖而出,在于以下几点:
- 清晰的架构,是一个能够独立运行的系统,不依赖于任何其他外部系统。例如调度,presto自身提供了对集群的监控,可以根据监控信息完成调度。
- 简单的数据结构,列式存储,逻辑行,大部分数据都可以轻易的转化成presto所需要的这种数据结构。
- 丰富的插件接口,完美对接外部存储系统,或者添加自定义的函数。
- 用户可以根据presto定义的接口标准,自定义的扩展数据源的查询。例如Hbase的查询。
- 支持sql的混合计算,即同一种数据源的不同库或表,或将多个数据源的数据进行合并
Presto采用典型的master-slave模型
- coordinator(master)负责meta管理,worker管理,query的解析和调度
是一个中心的查询角色,它主要的一个作用是接受查询请求,将他们转换成各种各样的任务,将任务拆解后分发到多个worker去执行各种任务的节点
1、解析SQL语
2、⽣成执⾏计
3、分发执⾏任务给Worker节点执
- worker则负责计算和读写
是一个真正的计算的节点,执行任务的节点,它接收到task后,就会到对应的数据源里面,去把数据提取出来,提取方式是通过各种各样的connector:
1、负责实际执⾏查询任务
- discovery server, 通常内嵌于coordinator节点中,也可以单独部署,用于节点心跳
1.3. 数据模型是将coordinator和woker结合到一起的服务:
1、Worker节点启动后向Discovery Server服务注册
2、Coordinator从Discovery Server获得Worker节点
presto采取三层表结构
- catalog 对应某一类数据源,例如hive的数据,或mysql的数据
- schema 对应hive中的数据库
- table 对应hive中的表
查询示例:
presto:default> select * from hive.default.test0012. presto安装部署 2.1. 下载相关包
在官网上下载所需版本的包
https://repo1.maven.org/maven2/com/facebook/presto/presto-server/
mkdir -p /opt/presto/data tar -xvzf presto-server-0.259.tar.gz -C /opt/presto/
- data 用于存储日志、本地元数据等的数据目录。
- 在安装目录中创建一个目录 etc , 加入以下配置:
2.3.1. 节点属性节点属性:特定于每个节点的环境配置 — etc/node.properties
JVM Config:Java虚拟机的命令行选项 — etc/jvm.config
配置属性:Presto服务器的配置 — etc/config.properties
日志级别配置文件 — etc/log.properties
目录属性:连接器(数据源)的配置
包含特定于每个节点的配置
| 属性 | 解释 |
|---|---|
| node.environment | 环境的名称。群集中的所有Presto节点必须具有相同的环境名称。 |
| node.id | 此Presto安装的唯一标识符。对于每个节点,这必须是唯一的。在重新启动或升级Presto时,此标识符应保持一致。如果在一台计算机上运行多个Presto安装(即同一台计算机上的多个节点),则每个安装必须具有唯一标识符。 |
| node.data-dir | 数据目录的位置(文件系统路径)。Presto将在此处存储日志和其他数据。 |
先 touch 一个 etc/node.properties
touch /opt/presto/presto/etc/node.properties
然后复制配置进去:
node.environment=production node.id=ffffffff-ffff-ffff-ffff-ffffffffffff node.data-dir=/opt/presto/data2.3.2. JVM Config
包含用于启动Java虚拟机的命令行选项列表。该文件的格式是一个选项列表,每行一个。shell不会解释这些选项,因此不应引用包含空格或其他特殊字符的选项。
touch /opt/presto/presto/etc/jvm.config
加入以下配置:
-server
-Xmx16G -XX:+UseG1GC -XX:G1HeapRegionSize=64M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumponOutOfMemoryError -XX:+ExitonOutOfMemoryError2.3.3. 配置属性
包含Presto服务器的配置。每个Presto服务器都可以充当协调器和工作器,但是专用一台机器来执行协调工作可以在更大的集群上提供最佳性能。
现在自己测试,不考虑性能。为方便起见,只用单节点,即当coordinator 也当worker。
将以下配置复制加入新建的config.properties
coordinator=true node-scheduler.include-coordinator=true http-server.http.port=8082 query.max-memory=5GB query.max-memory-per-node=1GB query.max-total-memory-per-node=2GB discovery-server.enabled=true discovery.uri=http://localhost:8082
属性解释如下:
| 属性 | 解释 |
|---|---|
| coordinator | 允许此Presto实例充当协调器(接受来自客户端的查询并管理查询执行)。 |
| node-scheduler.include-coordinator | 允许在协调器上安排工作。对于较大的集群,协调器上的处理工作可能会影响查询性能,因为计算机的资源不可用于调度,管理和监视查询执行的关键任务。 |
| http-server.http.port | 指定HTTP服务器的端口。Presto使用HTTP进行内部和外部的所有通信。 |
| query.max-memory | 查询可能使用的最大分布式内存量。 |
| query.max-memory-per-node | 查询可在任何一台计算机上使用的最大用户内存量。 |
| query.max-total-memory-per-node | 查询可在任何一台计算机上使用的最大用户和系统内存量,其中系统内存是读取器,写入程序和网络缓冲区等执行期间使用的内存。 |
| discovery-server.enabled | Presto使用Discovery服务查找群集中的所有节点。每个Presto实例都会在启动时使用Discovery服务注册自己。为了简化部署并避免运行其他服务,Presto协调器可以运行Discovery服务的嵌入式版本。它与Presto共享HTTP服务器,因此使用相同的端口。 |
| discovery.uri | Discovery服务器的URI。因为我们在Presto协调器中启用了Discovery的嵌入式版本,所以它应该是Presto协调器的URI。替换example.net:8080以匹配Presto协调器的主机和端口。此URI不得以斜杠结尾。 |
通过在etc配置目录中新建connector信息的文件,实现connector连接信息的配置。
新建connector配置文件父目录:
mkdir /opt/presto/presto/etc/catalog
新建hive连接信息:
touch /opt/presto/presto/etc/catalog/hive.properties
增加以下内容:
connector.name=hive-hadoop2 hive.metastore.uri=thrift://localhost:9083 hive.config.resources=/etc/hive/conf/core-site.xml,/etc/hive/conf/hdfs-site.xml
注:根据实际主机及服务配置情况填写相关配置项
2.4. 启动presto安装目录包含启动器脚本bin/launcher。
bin/launcher stop bin/launcher start
启动后,您可以在/opt/presto/data/var/log以下位置找到日志文件:
| 文件名 | 作用 |
|---|---|
| launcher.log | 此日志由启动程序创建,并连接到服务器的stdout和stderr流。它将包含初始化服务器日志记录时发生的一些日志消息以及JVM生成的任何错误或诊断信息 |
| server.log | 这是Presto使用的主日志文件。如果服务器在初始化期间出现故障,它通常会包含相关信息 |
| http-request.log | 这是HTTP请求日志,其中包含服务器收到的每个HTTP请求 |
Presto CLI提供了一个基于终端的交互式shell,用于运行查询。CLI是一个 自动执行的 JAR文件,这意味着它的行为类似于普通的UNIX可执行文件。
用户可以在命令行中敲SQL查询语句,对数据库进行查询。
下载 presto-cli-version-executable.jar,将其重命名为presto,增加执行权限。
直接执行jar进入命令行界面:
/opt/presto/presto/presto --server localhost:8082 --catalog hive --schema default3. presto Hbase Connector开发 3.1. 方案概况
现在很多要求对Hbase支持可以SQL查询。现在方案有三种:
- Phoenix + Hbas
Phoenix由Apache提供,技术成熟,但是延迟太严重了,对于实时性要求较高的项目可以直接忽略了。
- Hive + Hbase
同上,传统数仓T+1 模式下,提供页面检索的方案,Hbase做Hive的外部表,数据可以在hive端进行SQL操作,数据真实存储在Hbase,这种方案下时延也是特别严重。
- presto + Hbase
3.2. 开发及使用按照presto的connector开发规范进行开发扩展,实际使用中,时延较低,如果rowkey设计较好,可以明显降低查询速度。
这边有个比较好的开源项目,其中对presto Hbase connector的查询做了基础的版本,可以借鉴。代码路径:
https://gitee.com/yiidata/prestodb-hbase-connector.git
缺点:
- schema信息是生成的Json文件,而且每次新增和修改都需要修改文件,在Hbase中新增或修改表,也需要手动编辑,如果有第三方程序需要联动查询,还需要修改这里的配置文件,所以生产环境并不适合,这里我做了修改,将其改到了Mysql存储元数据信息。
- 没有支持在这里面进行建表操作。这里我也做了补充,可以指定字段所在的列族。
CREATE TABLE test( rowkey varchar comment 'rowkey' WITH (primary_key = true, family = 'cf'), userid varchar comment '', dt varchar comment'', partitio varchar comment'', name varchar comment '', sex varchar comment '', age varchar comment '', address varchar comment '', phone varchar comment ' ) WITH (partition = '001,120',rowkeyformat = 'partition,userid' ,rowkeyseparator='-');
- 没有支持insert into table table_name select * from table_name2,这里我也做了该功能的支持。
- 没有支CREATE TABLE test AS SELECt * FROM test2,这里做了扩展。



