zl程序教程

您现在的位置是:首页 >  其他

当前栏目

利用Submarin集成Spark-Ranger

2023-04-18 14:25:17 时间

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: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版本)

git clone https://github.com/apache/submarine

当前master分支(0.7.0)已经没有submarine-spark-security模块了,需要切换到tag:release-0.6.0-RC0

然后利用mvn命令打包

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在目录submarinesubmarine-securityspark-security arget

然后将submarine-spark-security-0.6.0.jar上传到$SPARK_HOME/jars

Ranger Admin界面添加了Spark Server策略

地址:http://yourIp:16080/)

在原来的Hive模块下,添加一个sparkServer策略,名称自定义

其中下面三个key,必须填spark,不填的话可能存在问题,至于是否都必填和具体什么含义,目前还没有研究

tag.download.auth.users
policy.download.auth.users
policy.grantrevoke.auth.users

jdbc.url和 hive策略里的一样就行,然后测试一下连接,建完后如下图所示

为了测试效果,我们先删掉其他策略,只保留all-database,table,column,这是默认的是有spark用户的

配置Spark

根据官网文档,在$SPARK_HOME/conf创建下面两个配置文件

ranger-spark-security.xml

<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.xml

<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-SQL

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

SparkServer

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文件,如:

ll /etc/ranger/sparkServer/policycache/
total 28
-rw-r--r-- 1 root root 27223 Dec  2 09:52 sparkSql_sparkServer.json

这个时候可以看到,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表时有冲突