温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
Fayson的github: https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1.文档编写目的
在前面的文章Fayson介绍了《如何在Kerberos环境下的CDH集群部署Spark1.6 Thrift及spark-sql客户端》。本文主要介绍当集群启用Kerberos和Sentry后,如何实现Spark SQL的权限管理。因为社区版Spark SQL并未做任何权限控制。
- 内容概述
1.测试环境说明
2.Hive表授权测试
3.权限分析及解决
4.修改后权限测试
5.总结
- 测试环境
1.CM和CDH版本为5.12.1
2.使用root用户操作
- 前置条件
1.集群已启用Kerberos
2.集群已启用Sentry
2.环境说明
在前面的文章Fayson介绍了如何部署Spark1.6的ThriftServer服务,在部署节点上启动Spark ThriftServer服务。
1.启动Spark ThriftServer服务
代码语言:javascript复制./start-thriftserver.sh --hiveconf hive.server2.authentication.kerberos.principal=hive/cdh04.fayson.com@FAYSON.COM
--hiveconf hive.server2.authentication.kerberos.keytab=hive.keytab
--principal hive/cdh04.fayson.com@FAYSON.COM --keytab hive.keytab
--hiveconf hive.server2.thrift.port=10001
--hiveconf hive.server2.thrift.bind.host=0.0.0.0
(可左右滑动)
2.通过Hue为fayson用户组授权default.t1表的所有权限以及default.test.name列的查询权限
使用fayson用户登录Hue查看授权成功
3.Hive表授权测试
1.使用Beeline连接Spark ThriftServer
代码语言:javascript复制[root@cdh01 ~]# kinit fayson
[root@cdh01 ~]# klist
[root@cdh01 ~]# beeline
beeline> !connect jdbc:hive2://cdh04.fayson.com:10001/;principal=hive/cdh04.fayson.com@FAYSON.COM
0: jdbc:hive2://cdh04.fayson.com:10001/> select current_user();
(可左右滑动)
执行SQL操作
代码语言:javascript复制0: jdbc:hive2://cdh04.fayson.com:10001/> select * from t1;
0: jdbc:hive2://cdh04.fayson.com:10001/> select count(*) from t1;
0: jdbc:hive2://cdh04.fayson.com:10001/> select * from test;
0: jdbc:hive2://cdh04.fayson.com:10001/> select count(*) from test;
(可左右滑动)
上述测试可以得出在使用fayson@FAYSON.COM账号kinit后,通过Beeline访问Spark ThriftServer,查看当前的登录用于依然为hive并不是我们指定的fayson用户,进行SQL操作的时候可以查询除授权表default.t1和default.test.name,这里依然可以查询test表的所有列。
2.使用spark-sql客户端测试
代码语言:javascript复制[root@cdh03 ~]# kinit fayson
Password for fayson@FAYSON.COM:
[root@cdh03 ~]# /opt/cloudera/parcels/CDH/lib/spark/bin/spark-sql
spark-sql> select current_user();
(可左右滑动)
执行SQL操作
代码语言:javascript复制spark-sql> select * from test;
spark-sql> select name from test;
spark-sql> select * t1;
spark-sql> select count(*) from t1;
spark-sql> select * from p1_text;
(可左右滑动)
上述测试可以得出,在kinit了fayson@FAYSON.COM账号后,通过spark-sql客户端访问Spark ThriftServer服务,获取到的当前用户为fayson而不是hive用户,由于我们Sentry只为fayson授予default.test.name和t1表的所有权限,而其他表则没有权限,对于只授权列权限的表,通过Spark-sql客户查询也会有权限问题。
4.权限分析及解决
由于CDH集群启用了Kerberos和Sentry,Fayson在前面的文章《如何在CDH启用Kerberos的情况下安装及使用Sentry(一)》和《如何在CDH启用Kerberos的情况下安装及使用Sentry(二)》介绍了,在Kerberos环境下的CDH启用Sentry时会禁用Hive的用户模拟功能,同时启用HDFS的ACL。在上一章节的测试中可以看到使用Beeline连接Spark ThriftServer时并未模拟本地指定的fayson用户访问Hive数据库。而spark-sql与HiveCLI访问Hive模式一样,都是跳过HiveServer2服务直接访问的HiveMetastore,所以通过spark-sql可以正确获取到kinit的用户。
1.在 Spark ThriftServer的启动命令中增加Hive的参数
代码语言:javascript复制./start-thriftserver.sh --hiveconf hive.server2.authentication.kerberos.principal=hive/cdh04.fayson.com@FAYSON.COM
--hiveconf hive.server2.authentication.kerberos.keytab=hive.keytab
--principal hive/cdh04.fayson.com@FAYSON.COM --keytab hive.keytab
--hiveconf hive.server2.thrift.port=10001
--hiveconf hive.server2.thrift.bind.host=0.0.0.0
--hiveconf hive.server2.enable.doAs=true
(可左右滑动)
在启动参数中增加hive.server2.enable.doAs参数并设置为true,参数说明:
该参数true则表示以登录ThriftServer的用户身份执行查询,如果为fasle在表示以启动ThriftServer的用户身份执行查询。
增加启动参数后重启SparkThriftServer服务
5.修改后权限测试
1.使用Beeline连接Spark ThriftServer
代码语言:javascript复制[root@cdh01 ~]# kinit fayson
[root@cdh01 ~]# klist
[root@cdh01 ~]# beeline
beeline> !connect jdbc:hive2://cdh04.fayson.com:10001/;principal=hive/cdh04.fayson.com@FAYSON.COM
0: jdbc:hive2://cdh04.fayson.com:10001/> select current_user();
(可左右滑动)
执行SQL操作
查询授权的t1表
查询只授权test.name列的表
查看授权以外的表p1_text
通过上述测试可以看到增加hive.server2.enable.doAs后,在kinit了fayson@FAYSON.COM账号后,使用Beeline连接Spark ThriftServer可以正常的获取当前初始的fayson用户,用户可以访问拥有权限的t1表,但是无法访问拥有test.name列权限的test表以及授权外的p1_text表。
6.总结
1.集群启用了Kerberos和Sentry后,在启动Spark ThriftServer服务时需要增加hive.server2.enable.doAs=true参数,才可以获取到当前kinit的用户,否则获取到的是ThriftServer的启动用户(即启动参数中的--principal的值)。
2.由于Spark无法与Sentry集成,所以Spark ThriftServer并不能完全做到Hive表的权限控制,只能使用Sentry授权后通过HDFS ACL权限同步确保授权用户组有访问数据的权限,无法实现列的授权。
3.spark-sql客户端访问Hive的模式与HiveCLI的方式一样,跳过HiveServer2直接访问的HiveMetastore,因此在使用spark-sql测试时获取到的登录用户即为当前kinit用户,即不受Hive模拟用户参数的影响。因为Spark SQL CLI可以直接获取到正确的kinit用户,所以Spark SQL命令行的表权限一样可以通过HDFS的文件权限来控制。Fayson在上面省略的测试部分。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操