# HuaweiCloud-Presto-plugins **Repository Path**: HuaweiCloudDeveloper/huaweicloud-presto-plugins ## Basic Information - **Project Name**: HuaweiCloud-Presto-plugins - **Description**: 本项目将基于Presto的扩展式connector机制,完成对华为云OBS,DataArts,DWS的支持,包含但不限于提供功能文档,使用文档,代码贡献到Presto&Trino仓库等等 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-09-27 - **Last Updated**: 2024-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一 背景 Presto是Facebook开源的,完全基于内存内存的并⾏计算,分布式SQL交互式查询引擎,采用Massively parallel processing (MPP)架构,多个节点管道式执⾏,⽀持任意数据源(通过扩展式Connector组件),数据规模GB~PB级。 # 二 项目简介 本项目将基于Presto的扩展式connector机制,完成对华为云OBS,DataArts,DWS的支持,包含但不限于提供功能文档,使用文档,代码贡献到Presto&Trino仓库等等。 # 三 参考资料 - [OBS](https://support.huaweicloud.com/bestpractice-obs/obs_05_1507.html) - [Presto Connector](https://prestodb.io/docs/current/connector.html) # 四 对接华为OBS使用说明 ## 1 安装软件版本说明 1. Java 8 2. Hadoop 3.3.5 3. hive 3.1.3 4. presto-0.283
## 2 准备工作 1. 进入华为云OBS控制台,创建一个桶,用于存放presto的数据。 https://console.huaweicloud.com/console/#/obs/manager/buckets
2. 进入obs存储,生成凭证和访问密钥。 https://console.huaweicloud.com/iam/#/mine/accessKey
3. 在服务器创建/opt/software 目录,在此目录下部署jdk、hadoop、hive、presto。
## 3 安装说明 ### 3.1 安装jdk 1. 在Oracle官网下载Jdk8。 下载地址:https://www.oracle.com/java/technologies/downloads/#java8-linux
2. 上传到服务器 /opt/software目录下,将其解压: ``` cd /opt/software # 解压gz压缩包 tar -zxvf jdk-8u421-linux-x64.tar.gz ```
3. 配置环境变量 ``` # 编辑全局变量文件 vim /etc/profile ``` 在最后一行配置以下信息并保存: ``` # JAVA HOME export JAVA_HOME=/opt/software/jdk1.8.0_421 export PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME PATH ``` 4. 使配置文件生效 ``` source /etc/profile ``` 5. 检查配置是否生效,出现java版本信息,代表配置生效 ``` java -version ```
### 3.2 安装Mysql 安装Mysql,用于存储hive的元数据信息。 1. 在Oracle官网下载mysql安装包。 下载地址:https://downloads.mysql.com/archives/community/ 2. 参考相关资料安装,建议下载5.7或8.0版本。
### 3.3 安装hadoop hadoop 使用 3.3.5版本,作为基础环境供hive使用。解压即可,后续无需启动。 1. 在apache网站下载hadoop安装包,下载地址:https://dlcdn.apache.org/hadoop/common/ ,下载3.3.5版本。 2. 上传到服务器 /opt/software 目录下,将其解压即可,无需配置环境变量: ``` cd /opt/software tar -zxvf hadoop-3.3.5.tar.gz ```
### 3.4 安装hive #### 3.4.1 安装hive-3.1.3 1. 在apache网站下载hive安装包,下载地址:https://downloads.apache.org/hive/ 下载对应版本的文件:apache-hive-3.1.3-bin.tar.gz 2. 上传到服务器 /opt/software 目录下,将其解压并重命名。 ``` cd /opt/software tar -zxvf apache-hive-3.1.3-bin.tar.gz mv apache-hive-3.1.3-bin hive-3.1.3 ``` 3. 配置环境变量 ``` # 编辑全局变量文件 vim /etc/profile ``` 在最后一行配置以下信息并保存: ``` #HIVE_HOME export HIVE_HOME=/opt/software/hive-3.1.3 export PATH=$PATH:$HIVE_HOME/bin ``` 4. 使配置文件生效 ``` source /etc/profile ``` #### 3.4.2 配置hive 1. 将MySQL的JDBC驱动拷贝到Hive的lib目录下: ``` cp /opt/software/ mysql-connector-java-5.1.48.jar $HIVE_HOME/lib ``` 2. 在github中下载huawei hadoop的jar包 下载地址: https://github.com/huaweicloud/obsa-hdfs/blob/master/release/hadoop-huaweicloud-3.1.1-hw-53.8.jar 将jar包拷贝到Hive的lib目录下: ``` cp /opt/software/hadoop-huaweicloud-3.1.1-hw-53.8.jar $HIVE_HOME/lib ``` 3. 配置hadoop路径 (1)根据hive-env.sh.template文件创建 hive-env.sh文件: ``` cd $HIVE_HOME/conf cp hive-env.sh.template hive-env.sh ``` (2)修改hive-env.sh文件,最后一行加上hadoop的路径: ``` vim hive-env.sh # 设置hadoop路径 export HADOOP_HOME=/opt/software/hadoop-3.3.5 ``` >备注:不配置这一行,hive metastore无法启动。 4. 配置MySql数据库信息和obs访问信息 (1)新建hive-site.xml文件: ``` cd $HIVE_HOME/conf vim hive-site.xml ``` (2)配置mysql数据库信息和obs信息,将一下信息复制到hive-site.xml中: ``` javax.jdo.option.ConnectionURL jdbc:mysql://127.0.0.1:3306/metastore?useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName mysql用户名 javax.jdo.option.ConnectionPassword mysql密码 hive.metastore.warehouse.dir /opt/software/hive-3.1.3/warehouse fs.obs.impl org.apache.hadoop.fs.obs.OBSFileSystem fs.AbstractFileSystem.obs.impl org.apache.hadoop.fs.obs.OBS fs.obs.access.key 华为云OBS AK fs.obs.secret.key 华为云OBS SK fs.obs.endpoint OBS桶所在区域对应的Endpoint ``` 备注:区域对应的Endpoint可以在华为云官网:https://developer.huaweicloud.com/endpoint?OBS 中查询。 5. 初始化元数据库 (1)登录mysql,创建metastore数据库: ``` mysql -uroot -p密码 create database metastore; ``` (2)初始化元数据库 ``` cd /opt/software/hive-3.1.3 bin/schematool -dbType mysql -initSchema ```
#### 3.4.3 启动hive ``` hive --service metastore ```
### 3.5 安装presto #### 3.5.1 安装与基本配置 1. 下载presto 下载地址:https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.283/ 下载对应版本安装文件:presto-server-0.283.tar.gz > 备注:必须是这个版本,其他版本可能需要修改presto-obs代码重新编译,编辑具体见7.编译说明
2. 将presto-server-0.283.tar.gz 上传到服务器/opt/software目录下,将其解压: ``` cd /opt/software # 解压gz压缩包 tar -zxvf presto-server-0.283.tar.gz ``` 3. 配置presto文件 (1)配置etc/node.properties文件 ``` cd /opt/software/presto-server-0.283/etc vim node.properties ``` 添加内容如下: ``` node.environment=production node.id=ffffffff-ffff-ffff-ffff-ffffffffffff node.data-dir=/opt/software/presto-server-0.283/data ``` (2)配置etc/jvm.config文件 ``` vim jvm.config ``` 添加内容如下: ``` -server -Xmx4G -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError ``` (3)配置etc/config.properties文件 ``` vim config.properties ``` 添加内容如下: ``` #指定当前节点是否是coordinator节点,true是coordinator节点,false是worker节点 coordinator=true #是否将当前coordinator节点当做worker,如果节点既是coordinator又是worker节点会影响当前节点性能 node-scheduler.include-coordinator=true #Presto服务器的端口 http-server.http.port=7670 #查询使用集群中最大的内存量 query.max-memory=2GB #每台节点使用最大用户内存量,用户内存用于:join,agg聚合等。 query.max-memory-per-node=1GB #每台节点使用的最大用户内存和系统内存量,系统内存用于input/output/exchange buffers等 query.max-total-memory-per-node=2GB #使用Discovery来发现集群中所有worker节点 discovery-server.enabled=true #连接Discovery使用的URI,由于是内嵌,与coordinator的节点端口一致 discovery.uri=http://127.0.0.1:7670 ``` (4)配置日志文件etc/log.properties文件 ``` vim log.properties ``` 添加内容如下(方便调试,部分设置为DEBUG,可按需修改日志级别): ``` com.facebook.presto=INFO com.obs.services=DEBUG ```
#### 3.5.2 hive与obs对接配置 1. 在/opt/software/presto-server-0.283/etc文件夹中新建catalog文件夹,并新建hiveobs.properties文件。 ``` cd /opt/software/presto-server-0.283/etc mkdir catalog cd catalog vim hiveobs.properties ``` 2. hiveobs.properties文件添加如下内容: ``` ########### 配置 connector ############# connector.name=hive-obs hive.metastore.uri=thrift://127.0.0.1:9083 # 是否授予删表的权限 hive.allow-drop-table=true # 是否开启向Hive的外部表写入数据 hive.non-managed-table-writes-enabled=true ############ 配置 connector ############ ############ Metastore配置属性 ############################### #Hive元存储请求超时,默认10s,单位:秒 hive.metastore-timeout=10s #缓存的Metastore数据应被视为有效的持续时间。单位:秒 hive.metastore-cache-ttl=0s # HiveMetastore缓存最大大小。 hive.metastore-cache-maximum-size=10000 # 访问后异步刷新缓存的Metastore数据,如果它比这更旧但尚未过期,则允许后续访问查看新数据。单位:秒 hive.metastore-refresh-interval=0s #用于刷新缓存的元存储数据的最大线程数。 hive.metastore-refresh-max-threads=100 ############### Metastore配置属性 ################################## ################# OBS配置 ################################## #要使用的默认OBS访问密钥。 hive.obs.access-key=华为云OBS AK #要使用的默认OBS密钥。 hive.obs.secret-key=华为云OBS SK #华为云obs endpoint,本例写的是华北-北京四区域节点,实际请修改为桶所在区域节点 hive.obs.endpoint=https://obs.cn-north-4.myhuaweicloud.com #临时AK/SK对应的securityToken,可不填 hive.obs.security-token= #写入数据时使用的OBS存储类。目前仅支持STANDARD和INTELLIGENT_TIERING存储类。默认存储类别是STANDARD hive.obs.storage-class=STANDARD #判断是否使用路径访问方式访问OBS服务,true使用路径访问方式,false使用虚拟主机访问方式,默认值:false hive.obs.path-style-access=false # 写入OBS的数据的本地暂存目录。这默认为JVM系统属性指定的Java临时目录java.io.tmpdir。 #hive.obs.staging-directory= # 使用HTTPS与OBS API通信(默认为true)。 hive.obs.ssl.enabled=true # 使用OBS服务器端加密(默认为false)。 hive.obs.sse.enabled=false #OBS服务器端加密的密钥管理类型;开启服务端加密时 KMS/C 二选一。 #hive.obs.sse.type=KMS # 用于使用KMS管理的密钥进行OBS服务器端加密的KMS密钥ID。如果未设置,则使用默认密钥。 hive.obs.sse.kms-key-id=按需填写 # SSE-C方式的加密密钥 hive.obs.sse.c-key-base64=按需填写 # 将文件上传到OBS时使用的预制ACL(默认为Private)。 hive.obs.upload-acl-type=private #是否启用流式传输模式。默认为true。 hive.obs.streaming.enabled=true #设置流式传输的分段大小。默认16MB。 hive.obs.streaming.part-size=16MB # 忽略Glacier对象而不是使查询失败。这将跳过可能是表或分区的一部分的数据。默认为false. #hive.obs.skip-glacier-objects= # 与OBS通信时遇到错误时尝试重新操作(如读取、写入等)的最大次数;默认5次。 hive.obs.max-error-retries=5 #重试的最大读取尝试次数。 hive.obs.max-client-retries=5 #与OBS通信时,连续的重试之间允许的最大等待时间 hive.obs.max-backoff-time=10m #重试与OBS通信的最长时间 hive.obs.max-retry-time=10m #TCP连接超时 hive.obs.connect-timeout=5s #TCP套接字读取超时 hive.obs.socket-timeout=5s #与OBS的最大连接数 hive.obs.max-connections=500 ################# OBS配置 ################################## ```
#### 3.5.3 OBS Java SDK及依赖下载 1. 参考华为官网下载 OBS Java SDK 及相关依赖包 下载说明地址: https://support.huaweicloud.com/intl/zh-cn/sdk-java-devg-obs/obs_21_0001.html 本例下载jar为:esdk-obs-java-3.23.9.1.jar,下载后存放到/opt/software目录。 2. 下载esdk-obs-java-3.23.9.1.jar对应的jar依赖包,下载后存放到/opt/software目录。主要有: (1) commons-lang-2.6.jar 下载地址: https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/commons-lang-2.6.jar (2) kotlin-stdlib-1.9.20.jar 下载地址: https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.20/kotlin-stdlib-1.9.20.jar (3) okhttp-4.11.0.jar 下载地址: https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.11.0/okhttp-4.11.0.jar (4) okio-3.5.0.jar 下载地址: https://repo1.maven.org/maven2/com/squareup/okio/okio/3.5.0/okio-3.5.0.jar (5) okio-jvm-3.5.0.jar 下载地址: https://repo1.maven.org/maven2/com/squareup/okio/okio-jvm/3.5.0/okio-jvm-3.5.0.jar > 备注:esdk-obs-java-3.23.9.1.jar所用的okhttp相关包比presto版本高,需要单独下载。 #### 3.5.3 OBS Java SDK安装 1. 参考hive目录,创建hive-obs目录 ``` cd /opt/software/presto-server-0.283/plugin # 复制hive-hadoop2为 hive-obs目录 cp -r hive-hadoop2/ hive-obs ``` 2. 删除hive-obs中的presto-hive-hadoop2-0.283.jar ``` cd /opt/software/presto-server-0.283/plugin/hive-obs rm -rf presto-hive-hadoop2-0.283.jar ``` 3. 将esdk-obs-java-3.23.9.1.jar及相关依赖包共6个文件复制到hive-obs目录中。 ``` cd /opt/software cp esdk-obs-java-3.23.9.1.jar commons-lang-2.6.jar kotlin-stdlib-1.9.20.jar okhttp-4.11.0.jar okio-3.5.0.jar okio-jvm-3.5.0.jar /opt/software/presto-server-0.283/plugin/hive-obs ``` 4. 将presto-obs-0.283.jar复制到hive-obs目录中。 ``` cp /opt/software/presto-obs-0.283.jar /opt/software/presto-server-0.283/plugin/hive-obs ```
## 4 启动presto 启动presto前需启动hive metastore。 1. 启动presto ``` cd /opt/software/presto-server-0.283/bin ./launcher start ``` 2. 可查看启动日志 ``` cd /opt/software/presto-server-0.283/data/var/log tail -f server.log ``` 日志中看到:SERVER STARTED,即表示presto启动成功。
## 5 测试presto 1. 下载presto-cli-0.283-executable.jar,方便后续测试。 下载地址:https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.283/
2. 将文件重命名为presto-cli.jar,并授予执行权限 ``` mv presto-cli-0.283-executable.jar presto-cli.jar chmod +x presto-cli.jar ```
3. 启动客户端 ``` ./presto-cli.jar --server 127.0.0.1:7670 --catalog hiveobs --schema default ``` 连接上presto。
## 6 配置项说明
序号 配置项 说明 备注
1 hive.obs.access-key 默认使用的OBS访问密钥
2 hive.obs.secret-key 默认使用的OBS密钥
3 hive.obs.endpoint OBS存储节点区域
4 hive.obs.security-token 临时AK/SK对应的securityToken
5 hive.obs.storage-class 写入数据时使用的OBS存储类。目前仅支持STANDARD和WARM存储类。默认存储类别是STANDARD 存储类别说明详见:https://support.huaweicloud.com/intl/zh-cn/ugobs-obs/obs_41_0006.html
6 hive.obs.path-style-access 设置是否使用路径访问方式访问OBS服务,true使用路径访问方式,false使用虚拟主机访问方式,默认值:false 注意:如果设置了路径方式,无法使用OBS 3.0版本桶的新特性
7 hive.obs.ssl.enabled 使用HTTPS与OBS API通信(默认为true)
8 hive.obs.sse.enabled 服务端加密(默认为false)
9 hive.obs.sse.type 服务端加密方式,可选:KMS或C 加密方式说明详见:https://support.huaweicloud.com/intl/zh-cn/api-obs/obs_04_0105.html
10 hive.obs.sse.kms-key-id 服务器端加密时,采取SSE-KMS加密时,用于使用KMS管理的密钥进行OBS服务器端加密的KMS密钥ID。如果未设置,则使用默认密钥。
11 hive.obs.sse.c-key-base64 服务器端加密时,采取SSE-C加密,客户端提供的加密密钥的Base64编码。 可参考:https://support.huaweicloud.com/intl/zh-cn/sdk-java-devg-obs/obs_21_2119.html 生成加密密钥的Base64编码(对应的customerKey变量)。
12 hive.obs.max-client-retries 最大读重试次数,默认5次。
13 hive.obs.max-error-retries 与OBS通信时遇到错误时尝试重新操作(如读取、写入等)的最大次数;默认10次。
14 hive.obs.max-backoff-time 连续的重试之间允许的最大等待时间;默认10m(10分钟)。 可以用 ns\us\ms\s\m\h\d 单位。
15 hive.obs.max-retry-time 重试与OBS通信的最长时间,默认10分钟。 可以用 ns\us\ms\s\m\h\d 结尾。
16 hive.obs.connect-timeout TCP连接超时时间,默认5秒。 可以用 ns\us\ms\s\m\h\d 结尾。
17 hive.obs.socket-timeout TCP套接字读取超时时间,默认5秒。 可以用 ns\us\ms\s\m\h\d 结尾。
18 hive.obs.max-connections 与OBS的最大连接数,默认500.
19 hive.obs.staging-directory 上传前暂存文件的临时目录,默认使用java.io.tmpdir目录。
20 hive.obs.upload-acl-type 上传文件到OBS时可以使用的ACL,默认private 访问控制列表说明详见: https://support.huaweicloud.com/intl/zh-cn/perms-cfg-obs/obs_40_0005.html
21 hive.obs.skip-glacier-objects 忽略Glacier对象,包含COLD、DEEP_ARCHIVE2类存储类别。默认为false。 https://support.huaweicloud.com/intl/zh-cn/ugobs-obs/obs_41_0006.html
22 hive.obs.streaming.enabled 是否启用流式传输模式。默认为true。
23 hive.obs.streaming.part-size 设置流式传输的分段大小。默认16MB。 可以用 B\KB\MB\GB\TB\PB作为单位结尾。

## 7 编译说明 1. presto支持在Mac OX 或者Linux上进行编译。 2. 编译要求:Java 8 Update 151 or higher (8u151+), 64-bit;如未安装jdk17,需先行安装。 3. presto本身的编译可参考: https://github.com/prestodb/presto?tab=readme-ov-file#building-presto 中的README文档。
### 7.1 具体编译方式 1. 下载代码,代码下载地址: https://github.com/prestodb/presto/tags presto-obs插件基于presto-0.283版本进行开发,可下载0.283版本下载,对应下载地址为: https://github.com/prestodb/presto/archive/refs/tags/0.283.tar.gz 2. 解压代码 ``` tar -zxvf presto-0.283.tar.gz # 重命名目录 mv presto-0.283 presto ``` 3. 为presto增加presto-obs插件 (1) 将presto-obs代码工程复制到presto目录下: ``` cp presto-obs presto/ ``` (2) 修改presto的pom.xml 修改pom.xml文件,在modules节点下增加下一行: ``` presto-obs ``` 加的位置参考下图,有排序要求。在modules中排序不对,可能编译失败。 4. 编译并安装presto ``` cd presto ./mvnw clean install -DskipTests ``` 进行编译,mvnw将自动下载maven文件,并通过maven中央仓库下载依赖包缓存在本地存储库 ( `~/.m2/repository` ) 中,。网络存在问题的情况下会比较慢。 如果因为网络问题无法编译成功,可以执行 ```bash ./mvnw -v ``` 命令,通过返回的Maven Home 路径,修改对应maven中的settings.xml文件,配置mirror节点,设置为国内的maven仓库地址,比如: ```xml huaweicloud * huaweicloud https://mirrors.huaweicloud.com/repository/maven/ ``` 设置华为的镜像仓库,再重新进行编译。 5. 编译presto-obs插件 ``` cd presto/presto-obs # 单独打包presto-obs插件,并跳过test ../mvnw clean package -DskipTests -e ``` 编译成功后,presto/presto-obs/target目录将生成 presto-obs-0.283.jar文件。 备注:以上 3-5步,可通过IDEA工具进行。
### 7.2 如何更换其他版本的presto presto-obs插件基于presto-0.283版本进行开发,如果实际应用中presto版本不是0.283版本,可能需要修改代码,重新编译生成。 1. 本插件参考presto中presto-hive模块中s3包所写;其他版本的编译基本可参考 7.1 进行。 2. 编译中主要需要注意2个类,不同版本的presto可能有所不同。 (1)HiveObsConnectorFactory类。 此类参考presto-hive中HiveConnectorFactory类所写,主要为绑定HiveObsClientModule、HiveObsModule类。 可复制presto-hive的中HiveConnectorFactory类的代码到presto-obs的HiveObsConnectorFactory类中,按下图标红的位置进行修改即可。 (2)HiveObsClientModule类。 此类参考presto-hive中HiveClientModule类所写,主要为绑定PrestoObsClientFactory类,删掉S3SelectRecordCursorProvider类的绑定。 可复制presto-hive的中HiveClientModule类的代码到presto-obs的HiveObsClientModule类中,按下图标红的位置修改,删除黄色标记代码即可。