presto对接开启安全的inceptor

  其他常见问题
内容纲要

概要描述


Presto是一个facebook开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。presto的架构由关系型数据库的架构演化而来。presto之所以能在各个内存计算型数据库中脱颖而出,在于以下几点:

  1. 清晰的架构,是一个能够独立运行的系统,不依赖于任何其他外部系统。例如调度,presto自身提供了对集群的监控,可以根据监控信息完成调度。
  2. 简单的数据结构,列式存储,逻辑行,大部分数据都可以轻易的转化成presto所需要的这种数据结构。
  3. 丰富的插件接口,完美对接外部存储系统,或者添加自定义的函数。

Presto采用典型的master-slave模型:

  • coordinator(master)负责meta管理,worker管理,query的解析和调度
  • worker则负责计算和读写。
  • discovery server, 通常内嵌于coordinator节点中,也可以单独部署,用于节点心跳。

file

就在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

file

(密码为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

file

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 ========
file

3. 如何判断catalog加载成功

Laucher 启动成功之后,显示Added catalog hive using connector hive-hadoop2即代表catalog加载成功,否则会在执行语句时报Catalog ‘hive’ does not exist的错误
file

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赋权

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。