
# Presto对接OBS
#### 概述
Presto分为prestoSql（现更名为Trino）和PrestoDB两大分支或是发行版。
Presto on OBS仅支持prestoSql/Trino发行版，下述对接步骤以prestoSql-333版本为例（从prestoSql-332版本开始Presto服务端必须使用JDK 11）。
![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
本章节中的Presto指prestoSql/Trino发行版。
#### 前提条件
- 已安装Hadoop，具体请参见[Hadoop对接OBS](https://support.huaweicloud.com/bestpractice-obs/obs_05_1507.html)。
 
- 已安装Hive，具体请参见[Hive对接OBS](https://support.huaweicloud.com/bestpractice-obs/obs_05_1508.html)。
#### 安装presto server
版本：prestoSQL-333
1. 下载Presto客户端和服务端。 
   [下载客户端](https://repo1.maven.org/maven2/io/prestosql/presto-cli/)
   [下载服务端](https://repo1.maven.org/maven2/io/prestosql/presto-server)
   
   
2. 下载hadoop-huaweicloud插件：[下载地址](https://github.com/huaweicloud/obsa-hdfs/tree/master/release)。
3. 执行以下命令，解压Presto服务端。 
   **tar --zxvf presto-server-333.tar.gz**
   在presto根目录/plugin/hive-hadoop2下放入如下两个jar包。
   - [hadoop-huaweicloud-${hadoop.version}-hw-${version}.jar](https://github.com/huaweicloud/obsa-hdfs/tree/master/release)
   
   - Apache commons-lang-xxx.jar 可从maven中央仓库下载或从hadoop目录中拷贝。
     
   
   
   
   
 
#### 配置presto
在安装目录里创建etc目录。这目录会有以下配置（自己创建）：
- 节点配置文件：每个节点的环境配置
- JVM配置文件：Java虚拟机的命令行选项
- Server配置文件（Config Properties）：Presto server的配置
- Catalog配置文件：配置presto的各种Connector（数据源）
- 日志配置文件：配置presto日志
 
#### 节点配置文件
节点属性文件etc/node.properties，包含每个节点的配置。一个节点是一个Presto实例。这文件一般是在Presto第一次安装时创建的。以下是最小配置：
```
node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data
```
解释：
node.environment：环境名字，Presto集群中的节点的环境名字都必须是一样的。
node.id：唯一标识，每个节点的标识都必须是唯一的。就算重启或升级Presto都必须还保持原来的标识。
node.data-dir：数据目录，Presto用它来保存log和其他数据
示例：
node.environment=presto_cluster
node.id=bigdata00
node.data-dir=/home/modules/presto-server-0.215/data #data需要自己手动创建
#### JVM配置文件
JVM配置文件etc/jvm.config，包含启动Java虚拟机时的命令行选项。格式是每一行是一个命令行选项。此文件数据是由shell解析，所以选项中包含空格或特殊字符会被忽略。
以下是参考配置：
```
-server
-Xmx16G
-XX:-UseBiasedLocking
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+UseGCOverheadLimit
-XX:+HeapDumpOnOutOfMemoryError
-XX:ReservedCodeCacheSize=512M
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
```
备注：以上参数都是官网参数，实际环境需要调整
#### Server配置文件
配置属性文件etc/config.properties，包含Presto server的配置。Presto server可以同时为coordinator和worker，但一个大集群里最好就是只指定一台机器为coordinator。
1. coordinator节点的配置文件
```
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=5050
discovery-server.enabled=true
discovery.uri=http://192.168.XX.XX:5050
query.max-memory=20GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
```
2. worker节点的配置文件
```
coordinator=false
http-server.http.port=5050
discovery.uri=http://192.168.XX.XX:5050
query.max-memory=20GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
```
解释：
coordinator：是否运行该实例为coordinator（接受client的查询和管理查询执行）。
node-scheduler.include-coordinator:coordinator是否也作为work。对于大型集群来说，在coordinator里做worker的工作会影响查询性能。
http-server.http.port:指定HTTP端口。Presto使用HTTP来与外部和内部进行交流。
query.max-memory：查询能用到的最大总内存。
query.max-memory-per-node：查询能用到的最大单节点内存。
discovery-server.enabled：Presto使用Discovery服务去找到集群中的所有节点。每个Presto实例在启动时都会在Discovery服务里注册。这样可以简化部署，不需要额外的服务，Presto的coordinator内置一个Discovery服务。
discovery.uri：Discovery服务的URI。将example.net:8080替换为coordinator的host和端口。这个URI不能以斜杠结尾，这个错误需特别注意，不然会报404错误。
另外还有以下属性：
jmx.rmiregistry.port：指定JMX RMI的注册。JMX client可以连接此端口
jmx.rmiserver.port：指定JMX RMI的服务器。可通过JMX监听。
#### Catalog配置文件（重点）
hive connector配置如下:
1. 在etc目录下创建catalog目录
2. 创建一个hive connector的配置文件：hive.properties
```
# hive.properties
#连接名
connector.name=hive-hadoop2
#配置hive metastore连接
hive.metastore.uri=thrift://192.168.XX.XX:9083
#指定hadoop的配置文件，注意core-site.xml需要按照https://github.com/huaweicloud/obsa-hdfs/tree/master/release/doc配置
hive.config.resources=/home/modules/hadoop-2.8.3/etc/hadoop/core-site.xml,/home/modules/hadoop-2.8.3/etc/hadoop/hdfs-site.xml,/home/modules/hadoop-2.8.3/etc/hadoop/mapred-site.xml
#给删表权限
hive.allow-drop-table=true
```
#### 日志配置文件
创建文件log.properties
写入内容：com.facebook.presto=INFO
备注：日志级别有四种：DEBUG、INFO、WARN和ERROR。
#### 启动presto
步骤如下：
1. 启动hive metastore：hive --service metastore \&
2. 启动presto server：bin/launcher start (如何关闭presto服务：bin/launcher stop)
3. 启动presto client： 
   1. 重命名presto-cli-333-executable.jar为presto,放在bin目录下，然后赋予执行权限：chmod +x presto
   
   2. 启动client：./presto --server XX.XX.XX.XX:5050 --catalog hive --schema default
   
   
   
   
 
#### Presto查询OBS
**创建hive表**
```
hive>
CREATE TABLE sample01(id int,name string,address string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 'obs://obs-east-bkt001/sample01';
insert into sample01 values(1,'xiaoming','cd');
insert into sample01 values(2,'daming','sh');
```
**presto查询hive表**
./presto --server XX.XX.XX.XX:5050 --catalog hive --schema default
```
presto:default> 
select * from sample01;
```
