概要描述
Presto是一个facebook开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。presto的架构由关系型数据库的架构演化而来。presto之所以能在各个内存计算型数据库中脱颖而出,在于以下几点:
- 清晰的架构,是一个能够独立运行的系统,不依赖于任何其他外部系统。例如调度,presto自身提供了对集群的监控,可以根据监控信息完成调度。
- 简单的数据结构,列式存储,逻辑行,大部分数据都可以轻易的转化成presto所需要的这种数据结构。
- 丰富的插件接口,完美对接外部存储系统,或者添加自定义的函数。
Presto采用典型的master-slave模型:
- coordinator(master)负责meta管理,worker管理,query的解析和调度
- worker则负责计算和读写。
- discovery server, 通常内嵌于coordinator节点中,也可以单独部署,用于节点心跳。
就在2020年12月27日,prestosql与facebook正式分裂,并改名为trino。
下面的案例实际上是单机版的presto,适用于测试目的,将一台机器同时配置为coordinator和worker,node-scheduler.include-coordinator要设置为true
详细说明
0. 安装包
* presto-server-0.229_1.tar.gz
* presto-cli-0.229-executable.jar
1. 安装部署presto
a. 上传presto-server-0.229_1.tar.gz安装包至tdh60201的/opt/presto下(需提前建好目录 mkdir -p /opt/presto)
b. 解压安装包tar -xzvf presto-server-0.229_1.tar.gz
2. 编辑配置文件
a. config.properties
coordinator=true #是否作为coordinator,worker节点为false
node-scheduler.include-coordinator=true #调度节点也作为worker时node-scheduler.include-coordinator设置为true
http-server.http.port=9998 #指定HTTP server 端口。Presto通过HTTP协议进行所有的内部和外部通信
query.max-memory=50GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true #Presto 通过Discovery 服务来找到集群中所有的节点
discovery.uri=http://tdh60201:9998 #coordinator的URL
b. hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://tdh60201:9083,thrift://tdh60202:9083
hive.config.resources=/opt/presto/presto-server-0.229/etc/cluster/core-site.xml,/opt/presto/presto-server-0.229/etc/cluster/hdfs-site.xml
hive.allow-drop-table=true
hive.allow-rename-column=true
hive.allow-add-column=true
hive.allow-drop-column=true
hive.allow-rename-table=true
注意:
connector.name 指定catelog管理器
- hive-hadoop1: Apache Hadoop 1.x
- hive-hadoop2: Apache Hadoop 2.x
- hive-cdh4: Cloudera CDH 4
- hive-cdh5: Cloudera CDH 5
hive.metastore.uri
- 参考/etc/inceptor1/conf/hive-site.xml中hive.metastore.uris的配置
connector.name是连接器,我们是apache2*版本的,所以用hive-hadoop2
c. jvm.config
[root@tdh60201/opt/presto/presto-server-0.229/etc]$ cat jvm.config
-server
-Xmx5G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
d. log.properties
[root@tdh60201/opt/presto/presto-server-0.229/etc]$ cat log.properties
com.facebook.presto=DEBUG
e. node.properties
[root@tdh60201/opt/presto/presto-server-0.229/etc]$ cat node.properties
node.environment=production
node.id=tdh60201
node.data-dir=/opt/presto/presto-server-0.229/
3. 生成principal凭证信息
如果有访问kdc服务器的root权限,但是没有kerberos admin账户,使用kadmin.guardian
如果没有访问kdc服务器的root权限,但是用kerberos admin账户,使用kadmin
使用kadmin.guardian指令登录kerberos database:
/kadmin.guardian -w 123456 -r TDH -q "addprinc -pw 123456 presto/tdh60201"
导出principal的keytab文件到指定路径:
./kadmin.guardian -w 123456 -r TDH -q "xst presto/tdh60201@TDH -k /var/log/guardian/presto.keytab"
这时候已经生成了principal为presto/tdh60201,keytab文件为presto.keytab的凭证对,使用kinit可以进行取票操作:
kinit -kt /var/log/guardian/presto.keytab presto/tdh60201
klist
修改keytab文件权限为644
chmod 644 /var/log/guardian/presto.keytab
4. 生成keystore秘钥
keytool -genkeypair -alias presto -keyalg RSA -keystore /root/presto.keystore
(密码为Root@123)
注意:在填写name的值时填写presto节点的host,其它随意。
至此,一共生成了两个文件,一个是presto.keytab,一个是presto.keystore:
5. 添加认证信息
a. config.properties
添加以下内容
http-server.authentication.type=KERBEROS
http.server.authentication.krb5.service-name=presto
http.server.authentication.krb5.keytab=/var/log/guardian/presto.keytab
http.authentication.krb5.config=/etc/krb5.conf
http-server.https.enabled=true
http-server.https.port=7778
http-server.https.keystore.path=/root/presto.keystore
http-server.https.keystore.key=Root@123
b. hive.properties
添加以下内容
hive.metastore.service.principal=hive/tdh60201@TDH
hive.metastore.authentication.type=KERBEROS
hive.metastore.client.principal=presto/tdh60201
hive.metastore.client.keytab=/var/log/guardian/presto.keytab
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=false
hive.hdfs.presto.principal=presto/tdh60201
hive.hdfs.presto.keytab=/var/log/guardian/presto.keytab
6. 测试连接
启动presto服务:
cd /opt/presto/presto-server-0.229
bin/launcher start
使用presto cli进行连接:
java -jar ../bin/presto-cli-0.229-executable.jar \
--server https://tdh60201:7778 \
--krb5-config-path /etc/krb5.conf \
--krb5-principal presto/tdh60201 \
--krb5-keytab-path /var/log/guardian/presto.keytab \
--krb5-remote-service-name presto \
--keystore-path /root/presto.keystore \
--keystore-password Root@123 \
--catalog hive \
--schema default
或者觉得麻烦,把../bin/presto-cli-0.229-executable.jar重命名称presto脚本来调用也是一样的
../bin/presto
--server https://tdh60201:7778 \
--krb5-config-path /etc/krb5.conf \
--krb5-principal presto/tdh60201 \
--krb5-keytab-path /var/log/guardian/presto.keytab \
--krb5-remote-service-name presto \
--keystore-path /root/presto.keystore \
--keystore-password Root@123 \
--catalog hive \
--schema default
FAQ
1. 如何开启日志的DEBUG模式方便定位
修改/etc/log.properties
com.facebook.presto=INFO 修改成DEBUG
2. 如何判断presto服务启动成功
2020-08-12T15:58:54.452+0800 INFO main com.facebook.presto.server.PrestoServer ======== SERVER STARTED ========
3. 如何判断catalog加载成功
Laucher 启动成功之后,显示Added catalog hive using connector hive-hadoop2
即代表catalog加载成功,否则会在执行语句时报Catalog ‘hive’ does not exist的错误
4. presto连接开启kerberos的inceptor,执行查询报错Hive table ‘default.emp’ is corrupt. Found sub-directory in bucket directory for partition:
presto暂不支持ACID事务特性(分区、分桶),也就是说不支持inceptor的orc事务表!
https://github.com/prestodb/presto/issues/1970
https://github.com/prestodb/presto/issues/6666
5 . presto连接inceptor报user presto has no ACCESS permission to HDFS service hdfs1
需要在guardian页面新建presto租户,对hdfs赋权