前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
本文总结如何利用Submarin集成Spark-Ranger,通过ranger控制Spark SQL的权限
前提
已经安装了Spark、Hive、kerberos、Ranger,并且Hive已经集成了Ranger,本文环境基于Ambari
submarine-spark-security 插件打包
官网文档https://submarine.apache.org/docs/userDocs/submarine-security/spark-security/README (0.6.0版本)
1 | git clone https://github.com/apache/submarine |
当前master分支(0.7.0)已经没有submarine-spark-security模块了,需要切换到tag:release-0.6.0-RC0
然后利用mvn命令打包
1 | mvn clean package -Dmaven.javadoc.skip=true -DskipTests -pl :submarine-spark-security -Pspark-2.4 -Pranger-1.2 |
打的submarine-spark-security-0.6.0.jar在目录submarine\submarine-security\spark-security\target
然后将submarine-spark-security-0.6.0.jar上传到$SPARK_HOME/jars
Ranger Admin界面添加了Spark Server策略
在原来的Hive模块下,添加一个sparkServer策略,名称自定义
其中下面三个key,必须填spark,不填的话可能存在问题,至于是否都必填和具体什么含义,目前还没有研究
1 | tag.download.auth.users |
jdbc.url和 hive策略里的一样就行,然后测试一下连接,建完后如下图所示
为了测试效果,我们先删掉其他策略,只保留all-database,table,column,这是默认的是有spark用户的
配置Spark
根据官网文档,在$SPARK_HOME/conf
创建下面两个配置文件
ranger-spark-security.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28<configuration>
<property>
<name>ranger.plugin.spark.policy.rest.url</name>
<value>http://yourIp:16080</value>
</property>
<property>
<name>ranger.plugin.spark.service.name</name>
<value>sparkServer</value>
</property>
<property>
<name>ranger.plugin.spark.policy.cache.dir</name>
<value>/etc/ranger/sparkServer/policycache</value>
</property>
<property>
<name>ranger.plugin.spark.policy.pollIntervalMs</name>
<value>30000</value>
</property>
<property>
<name>ranger.plugin.spark.policy.source.impl</name>
<value>org.apache.ranger.admin.client.RangerAdminRESTClient</value>
</property>
</configuration>
ranger-spark-audit.xml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43<configuration>
<property>
<name>xasecure.audit.is.enabled</name>
<value>true</value>
</property>
<property>
<name>xasecure.audit.destination.db</name>
<value>false</value>
</property>
<property>
<name>xasecure.audit.destination.db.jdbc.driver</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>xasecure.audit.destination.db.jdbc.url</name>
<value>jdbc:mysql://yourIp:3306/ranger</value>
</property>
<property>
<name>xasecure.audit.destination.db.password</name>
<value>ranger</value>
</property>
<property>
<name>xasecure.audit.destination.db.user</name>
<value>ranger</value>
</property>
<property>
<name>xasecure.audit.jaas.Client.option.keyTab</name>
<value>/etc/security/keytabs/hive.service.keytab</value>
</property>
<property>
<name>xasecure.audit.jaas.Client.option.principal</name>
<value>hive/_HOST@INDATA.COM</value>
</property>
</configuration>
至于具体的ip、端口、用户名、密码信息可以在之前已经配置好的hive-ranger插件配置文件里查看,也可以在ambari界面搜索
启动Spark-SQL SparkServer
Spark-SQL1
spark-sql --master yarn --deploy-mode client --conf 'spark.sql.extensions=org.apache.submarine.spark.security.api.RangerSparkSQLExtension' --principal spark/youIp@INDATA.COM --keytab /etc/security/keytabs/spark.service.keytab
SparkServer1
spark-submit --master yarn --deploy-mode client --executor-memory 2G --num-executors 3 --executor-cores 2 --driver-memory 4G --driver-cores 2 --class org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 --name Thrift-11111 --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' --principal spark/yourIp --keytab /etc/security/keytabs/spark.service.keytab --hiveconf hive.server2.thrift.http.port=11111
注意需要添加submarine的extensions,并且以spark用户认证kerberos,因为ranger是通过kerberos的认证用户进行权限控制的
这里以Spark-SQL为例进行演示,启动spark-sql后,执行show tables
,这是会根据配置文件,读取ranger里的sparkServer策略,如果读取并解析成功,则会在配置的缓存目录下生成对应的json文件,如:
1 | ll /etc/ranger/sparkServer/policycache/ |
这个时候可以看到,spark是有权限读取表信息的
然后在ranger里将sparkServer策略的spark用户删掉,过个几十秒,我们可以看到,spark-sql已经刷新了ranger的策略,然后再show tables
,这时已经没有权限读取表信息了
到这里,我们已经验证了可以通ranger控制spark sql的权限了,后面可以自己把spark 用户再加回去,验证权限是否又有了,并且可以修改策略,比如可以看哪些表,select update 等操作权限
当然正式使用应该起Spark Server
问题
其他kerberos用户
我们通过其他kerberos用户认证时,虽然可以控制权限,但是会抛异常,Spark Server虽然没有异常,但是并不能控制其他用户的权限
扩展多个spark.sql.extensions
因为我们已经通过spark.sql.extensions=org.apache.submarine.spark.security.api.RangerSparkSQLExtension扩展了submarine,如果同时再扩展hudi,这样使用spark-sql
建hudi表时有冲突
更新
- 上面提到的:当前master分支(0.7.0)已经没有submarine-spark-security模块了,需要切换到tag:release-0.6.0-RC0,submarine-spark-security的作者已经将该模块内置到Kyuubi中了(这俩项目是同一个作者),可以下载Kyuubi最新版代码查看,找到相应的模块验证使用
对于扩展多个extensions
- Spark3可以用逗号分隔来实现多个扩展
- Spark2只能在代码中用
.withExtensions
来实现多个扩展